Gruntfile.js 4.13 KB
/* global module */

module.exports = function(grunt) {
    /* global require */
    'use strict';

    var config = {};
    config.jshint = {
        options: {
        },
        browserOptions: {
        },
        model: [
            'src/scripts/solr/model/**/*.js',
        ],
    };
    config.jscs = {
        options: {
            validateIndentation: 4,
            reporter: 'console',
            maxErrors: -1,
        },
    };
    /*
    config.punch = {
    };
    config.css = {
        options: {
            dirs: [
                'css',
            ]
        },
    };
    config.images = {
        options: {
            base: 'src',
            dirs: ['media'],
        },
    };
    */
    config.useRev = true;
    config.bower = {
        directory: 'lib/bower',
    };
    /*
    config.modules = [
        {
            name: 'main',
        },
    ];
    */
    config.uglify = {
        mangle: true,
        beautify: false,
        compress: true,
    };

    var montyPython = require('grunt-monty-python')(grunt);
    montyPython.createConfig(config);

    var _ = require('lodash');

    var jasmineRequirejsTemplateOptions = function(withInstanbul) {
        /* global requirejs */
        var callback;
        if (withInstanbul) {
            callback = function() {
                var oldLoad = requirejs.load;
                requirejs.load = function (context, moduleName, url) {
                    //console.log('context=' + JSON.stringify(arguments), 'moduleName=' + moduleName, 'url=' + url);
                    var parts = url.split('/');
                    for (var i = 0; i < parts.length; ) {
                        var part = parts[i];
                        if (part === '.') {
                            parts.splice(i, 1);
                        } else if (part === '') {
                            parts.splice(i, 1);
                        } else if (part === '..') {
                            if (i > 0) {
                                i--;
                                parts.splice(i, 2);
                            } else {
                                parts.splice(i, 1);
                            }
                        } else {
                            i++;
                        }
                    }
                    url = parts.join('/');
                    if (url.indexOf('src/scripts/') === 0) {
                        url = './.grunt/grunt-contrib-jasmine/' + url;
                    }
                    if (url.indexOf('test/specs/') === 0) {
                        url = './.grunt/grunt-contrib-jasmine/' + url;
                    }
                    //console.log('url=' + url);
                    return oldLoad.apply(this, [context, moduleName, url]);
                };
            };
        }
        return {
            requireConfigFile: 'src/scripts/config.js',
            requireConfig: {
                baseUrl: 'src/scripts',
                callback: callback
            }
        };
    };

    var jasmineInstanbulTemplateOptions = function(template, nestedOptions) {
        return {
            coverage: 'bin/coverage/coverage.json',
            report: 'bin/coverage',
            replace: false,
            template: template,
            templateOptions: nestedOptions
        };
    };

    var jasmineOptions = function(withCoverage, options) {
        var defaultOptions = {};
        defaultOptions.template = require('grunt-template-jasmine-requirejs');
        defaultOptions.templateOptions = jasmineRequirejsTemplateOptions(withCoverage);
        if (withCoverage) {
            defaultOptions.templateOptions = jasmineInstanbulTemplateOptions(defaultOptions.template, defaultOptions.templateOptions);
            defaultOptions.template = require('grunt-template-jasmine-istanbul');
        }
        return _.extend(defaultOptions, options);
    };

    grunt.initConfig({
        jasmine: {
            all: {
                src: [
                    'src/scripts/{,**/}*.js',
                    '!src/scripts/main.js',
                    'test/specs/**/*.js',
                ],
                options: jasmineOptions(false, null),
            },
        },

    });
};