Gruntfile.js 4.63 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');

    function genJasmineConfig(withCoverage, options) {
        var src = [
            'src/scripts/{,**/}*.js',
            '!src/scripts/main.js',
        ];
        var specs = [
            'src/scripts/**/*.spec.js',
        ];
        var template = require('grunt-template-jasmine-requirejs');
        var templateOptions = {
            requireConfigFile: 'src/scripts/config.js',
            requireConfig: {
                baseUrl: 'src/scripts',
            },
        };

        if (withCoverage) {
            /* global requirejs */
            templateOptions.requireConfig.callback = function() {
                var oldLoad = requirejs.load;
                requirejs.load = function (context, moduleName, url) {
                    var origUrl = 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 (0) if (url.match(/^src\/scripts\/(.*?\/)?[^\/]+\.spec\.js$/)) {
                        url = './.grunt/grunt-contrib-jasmine/' + url;
                    } else if (url.match(/^src\/scripts\/(.*?\/)?[^\/]+\.js$/)) {
                        url = './.grunt/grunt-contrib-jasmine/' + url;
                    }
                    if (url.indexOf('test/specs/') === 0) {
                        url = './.grunt/grunt-contrib-jasmine/' + url;
                    }
                    //console.log('url[' + origUrl + ']=' + url);
                    return oldLoad.apply(this, [context, moduleName, url]);
                };
            };

            var foo = _.extend({}, template);
            var bar = template.process;
            foo.process = function process(grunt, task, context) {
                var src = [];
                context.scripts.src.forEach(function(file) {
                    if (!grunt.file.isMatch(specs, file)) {
                        src.push(file);
                    }
                });
                context.scripts.src = src;
                return bar.apply(this, arguments);
            };

            templateOptions = {
                coverage: 'bin/coverage/coverage.json',
                report: 'bin/coverage',
                replace: false,
                template: foo,
                templateOptions: templateOptions,
                files: _.concat([], src, specs),
            };
            template = require('grunt-template-jasmine-istanbul');
        }
        var jasmineConfig = {
            src: _.concat([],
                src,
                specs
            ),
            options: {
                specs: specs,
                template: template,
                templateOptions: templateOptions,
            },
        };
        return jasmineConfig;
    }

    grunt.config.set(['jasmine', 'all'], genJasmineConfig(true));
};