Source: Gruntfile.js

/* jslint es3: false */
/* global module:false, console:false, process:false */

/**
 * Grunt module.
 * @module grunt
 */
module.exports = function(grunt) {

    'use strict';

    grunt.initConfig({

        /*----------------------------------( PACKAGE )----------------------------------*/

        /**
         * @member {config} pkg
         * The `package.json` file belongs in the root directory of your project,
         * next to the `Gruntfile`, and should be committed with your project
         * source. Running `npm install` in the same folder as a `package.json`
         * file will install the correct version of each dependency listed therein.
         *
         * Install project dependencies with `npm install` (or `npm update`).
         *
         * @see http://gruntjs.com/getting-started#package.json
         * @see https://npmjs.org/doc/json.html
         * @see http://package.json.nodejitsu.com/
         * @see http://stackoverflow.com/a/10065754/922323
         */

        pkg : grunt.file.readJSON('package.json'),

        /*----------------------------------( BANNERS )----------------------------------*/

        /**
         * @member {config} banner
         * Short and long banners.
         *
         * @see http://gruntjs.com/getting-started#an-example-gruntfile
         */

        banner : {

            'short' : '/*! ' +
                      '<%= pkg.title || pkg.name %>' +
                      '<%= pkg.version ? " v" + pkg.version : "" %>' +
                      '<%= pkg.licenses ? " | " + _.pluck(pkg.licenses, "type").join(", ") : "" %>' +
                      ' - For included libraries, see source for additional licensing info.' +
                      '<%= pkg.homepage ? " | " + pkg.homepage : "" %>' +
                      ' */',

            'long' : '/**\n' +
                     ' * <%= pkg.title || pkg.name %>\n' +
                     '<%= pkg.description ? " * " + pkg.description + "\\n" : "" %>' +
                     ' *\n' +
                     '<%= pkg.author.name ? " * @author " + pkg.author.name + "\\n" : "" %>' +
                     '<%= pkg.author.url ? " * @link " + pkg.author.url + "\\n" : "" %>' +
                     '<%= pkg.homepage ? " * @docs " + pkg.homepage + "\\n" : "" %>' +
                     //' * @copyright Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>.\n' +
                     '<%= pkg.licenses ? " * @license Released under the " + _.pluck(pkg.licenses, "type").join(", ") + ".\\n" : "" %>' +
                     '<%= pkg.version ? " * @version " + pkg.version + "\\n" : "" %>' +
                     ' * @date <%= grunt.template.today("yyyy/mm/dd") %>\n' +
                     ' */\n\n',

        },

        /*----------------------------------( VERSIONING )----------------------------------*/

        /**
         * @member {config} now
         * Build date. Formats: <i>yyyymmdd</i> or <i>yyyymmddhhMMss</i>
         *
         * @see http://tanepiper.com/blog/2012/11/25/building-and-testing-javascript-with-gruntjs/
         * @see http://blog.stevenlevithan.com/archives/date-time-format
         */

        now : grunt.template.today('yyyymmdd'), // Alternative: yyyymmddhhMMss

        /**
         * @member {config} ver
         * Build version. Increment if more than one build is needed in a single
         * day.
         *
         * @see http://tanepiper.com/blog/2012/11/25/building-and-testing-javascript-with-gruntjs/
         * @see http://blog.stevenlevithan.com/archives/date-time-format
         */

        ver : 1,

        /*----------------------------------( BOWER )----------------------------------*/

        /**
         *
         * Install Bower packages. Smartly.
         *
         * Use this task to update dependencies defined in `bower.json`.
         *
         * @see https://github.com/yatskevich/grunt-bower-task
         * @see http://bower.io/
         */

        /*bower : {

            install : {

                options : {

                    targetDir : './lib', // A directory where you want to keep your Bower packages.
                    cleanTargetDir: false,
                    cleanBowerDir: false,
                    layout : 'byComponent',        // Folder structure type.
                    verbose : true,                // Debug output.

                },

            },

        },*/

        /*----------------------------------( WATCH )----------------------------------*/

        /**
         * @member {task} watch
         * Run predefined tasks whenever watched file patterns are added, changed
         * or deleted.
         *
         * @see https://github.com/gruntjs/grunt-contrib-watch
         */

        watch : {

            files : [

                '<%= jshint.init %>',
                './json-schema-viewer.js',
                './lib/**/*',
                './lib/*',
                './templates/**/*',
                './styles/sass/**/*',
                './images/**/*',

            ],

            tasks : ['default'],

        },

        /*----------------------------------( JSHINT )----------------------------------*/

        /**
         * @member {task} jshint
         * Validate files with JSHint.
         *
         * @see https://github.com/gruntjs/grunt-contrib-jshint
         * @see http://www.jshint.com/docs/
         */

        jshint : {

            options : {

                jshintrc : '.jshintrc', // Defined options and globals.

            },

            init : [

                './Gruntfile.js',
                './json-schema-viewer.js',
                './lib/translator.js',
                './lib/tv4.async-load-jquery.js',

            ],

        },

        /*----------------------------------( ENV )----------------------------------*/

        /**
         * @member {task} env
         * Grunt task to automate environment configuration for future tasks.
         *
         * @see https://github.com/onehealth/grunt-env
         */

        env : {

            dev : {

                NODE_ENV : 'DEVELOPMENT',

            },

            prod : {

                NODE_ENV : 'PRODUCTION',

            },

        },

        /*----------------------------------( CLEAN )----------------------------------*/

        /**
         * @member {task} clean
         * Clean files and folders.
         *
         * @see https://github.com/gruntjs/grunt-contrib-clean
         */

        clean : {

            options : {

                force : true, // Allows for deletion of folders outside current working dir (CWD). Use with caution.

            },

            prod : [

                './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/**/*',

            ],

            doc : [

                './jsdoc/**/*',

            ],

        },

        /*----------------------------------( UGLIFY )----------------------------------*/

        /**
         * @member {task} uglify
         * Minify files with UglifyJS.
         *
         * @see https://github.com/gruntjs/grunt-contrib-uglify
         * @see http://lisperator.net/uglifyjs/
         */

        uglify : {

            prod : {

                options : {

                    banner : '<%= banner.short %>',

                },

                files : {

                    './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/<%= pkg.name %>.min.js' : [
                        //'./files/scripts/jquery.js',
                        //'./files/scripts/jquery.*.js',
                        './bower_components/uri.js/src/URI.js',
                        //'./bower_components/uri.js/jquery.URI.js',
                        './bower_components/tv4/tv4.js',
                        './lib/tv4.async-load-jquery.js',
                        './bower_components/jquery.scrollTo/jquery.scrollTo.js',
                        './bower_components/d3/d3.js',
                        './bower_components/filereader.js/filereader.js',
                        './bower_components/jsonpointer.js/src/jsonpointer.js',
                        './bower_components/highlightjs/highlight.pack.js',
                        './<%= pkg.name %>.js',
                        './lib/example.js',

                    ],
                    './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/lib/preinit.js' : [
                        './lib/preinit.js',

                    ],

                },

            },

        },

        /*----------------------------------( SASS )----------------------------------*/

        /**
         * @member {task} sass
         * Compile Sass to CSS.
         *
         * @see https://github.com/gruntjs/grunt-contrib-sass
         * @see http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#output_style
         */

        sass : {

            options : {

                noCache : true,  // Don't cache to sassc files.
                precision : 14, // How many digits of precision to use when outputting decimal numbers.
                //sourcemap : 'none', // Generate CSS source maps?

            },

            dev : {

                options : {

                    //banner : '<%= banner.long %>', TODO:this is no longer valid use https://github.com/mattstyles/grunt-banner
                    style : 'expanded', // Output style. Can be nested, compact, compressed, expanded.

                },

                files : {

                    './styles/<%= pkg.name %>.css' : './styles/sass/<%= pkg.name %>.scss',
                    //'../dev/styles/development.css' : './files/styles/development.scss',

                },

            },

            prod : {

                options : {

                    //banner : '<%= banner.short %>', see above
                    style : 'compressed',

                },

                files : {

                    './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/styles/<%= pkg.name %>.min.css' : './styles/sass/<%= pkg.name %>.scss',

                },

            },

        },

        /*----------------------------------( PREPROCESS )----------------------------------*/

        /**
         * @member {task} preprocess
         * Grunt task around preprocess npm module.
         *
         * @see https://github.com/onehealth/grunt-preprocess
         * @see https://github.com/onehealth/preprocess
         * @see http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically
         */

        preprocess : {

            options : {

                context : {

                    title : '<%= pkg.title %>',
                    description : '<%= pkg.description %>',
                    name : '<%= pkg.name %>',
                    version : '<%= pkg.version %>',
                    homepage : '<%= pkg.homepage %>',
                    production : '<%= pkg.production %>',
                    now : '<%= now %>',
                    ver : '<%= ver %>',

                },

            },

            dev : {

                files: [

                    {

                        src : './templates/index.html',
                        dest : './dev.html',

                    },

                    {

                        src : './templates/basic.html',
                        dest : './basic.html',

                    },

                    {

                        src : './templates/latest.html',
                        dest : './index.html',

                    },

                ],

            },

            prod : {

                files: [

                    {

                        src : './templates/index.html',
                        dest : './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/index.html',

                    },

                    {

                        src : './templates/latest.html',
                        dest : './prod/index.html',

                    },

                    {

                        src : './templates/basic.html',
                        dest : './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/basic.html',

                    },

                ],

            },

        },

        /*----------------------------------( COPY )----------------------------------*/

        /**
         * @member {task} copy
         * Copy files and folders.
         *
         * @see https://github.com/gruntjs/grunt-contrib-copy
         * @see http://gruntjs.com/configuring-tasks#globbing-patterns
         */


        copy : {

            prod : {

                files : [

                    {

                        expand : true,
                        cwd : './',
                        src : [
                            'images/**/*',
                            '!images/junk/**',
                        ],
                        dest : './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/',

                    },
                    {

                        expand : true,
                        cwd : './bower_components/mdjson-schemas/',
                        src : [
                            '**/*.json',
                            '!*bower.json',
                        ],
                        dest : './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/schemas',

                    },
                    {

                        expand : true,
                        cwd : './jsdoc/',
                        src : [
                            '**/*',
                        ],
                        dest : './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/docs',

                    }

                ],

            },

        },

      /**
       * @member {task} gh-pages
       * Deploy to GitHub Pages.
       *
       * @see https://github.com/tschaub/grunt-gh-pages
       */

      'gh-pages' : {
        options: {
          base: './prod/<%= pkg.version %>/<%= now %>/<%= ver %>/'
        },
        src: ['**/*']
      },

      /**
       * @member {task} jsdoc
       * Build docs.
       *
       * @see https://github.com/krampstudio/grunt-jsdoc
       */

      jsdoc : {
          dist : {
              src: ['<%= pkg.name %>.js', 'README.md', 'Gruntfile.js'],
              options: {
                  destination: 'jsdoc',
                  verbose: true,
                  //template : "./node_modules/grunt-jsdoc/node_modules/ink-docstrap/template",
                  //configure : "node_modules/grunt-jsdoc/node_modules/ink-docstrap/template/jsdoc.conf.json",
              }
          }
      },

      /**
       * @member {task} connect
       * Start a static web server. Use <code>grunt connect:server:keepalive</code>
       * for a persistent server instance. Default port is <b>9001</b>.
       *
       * @see https://github.com/gruntjs/grunt-contrib-connect
       */

      connect: {
        server: {
          options: {
            port: 9001
          }
        }
      },
    });

    /*----------------------------------( TASKS )----------------------------------*/

    //grunt.loadNpmTasks('grunt-bower-task');

    grunt.loadNpmTasks('grunt-contrib-watch');

    grunt.loadNpmTasks('grunt-contrib-jshint');

    grunt.loadNpmTasks('grunt-env');

    grunt.loadNpmTasks('grunt-contrib-clean');

    grunt.loadNpmTasks('grunt-contrib-uglify');

    grunt.loadNpmTasks('grunt-contrib-sass');

    grunt.loadNpmTasks('grunt-preprocess');

    grunt.loadNpmTasks('grunt-contrib-copy');

    grunt.loadNpmTasks('grunt-gh-pages');

    grunt.loadNpmTasks('grunt-jsdoc');

    grunt.loadNpmTasks('grunt-contrib-connect');
    //----------------------------------

    /**
     * @see https://github.com/onehealth/grunt-preprocess/issues/7
     * @see https://github.com/onehealth/grunt-env/issues/4
     */

    grunt.registerTask('printenv', function () { console.log(process.env); });

    //----------------------------------

    /**
     * @member {task} init
     * Used to initialize other tasks(e.g. dev, prod).
     */
    grunt.registerTask('init', ['jshint',]);
    /**
     * @member {task} dev
     * Build development.
     */
    grunt.registerTask('dev', ['init', 'env:dev', 'sass:dev', 'preprocess:dev',]);
    /**
     * @member {task} prod
     * Build production.
     */
    grunt.registerTask('prod', ['init', 'dev', 'env:prod', 'doc', 'clean:prod', 'sass:prod', 'uglify:prod', 'preprocess:prod', 'copy:prod',]);
    /**
     * @member {task} doc
     * Build jsdocs.
     */
    grunt.registerTask('doc', ['clean:doc', 'jsdoc',]);
    grunt.registerTask('default', ['dev',]);

};