<commit_before>module.exports = function(grunt) {

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

    connect: {
      server: {
        options: {
          hostname: '127.0.0.1',
          base: '.',
          port: 8080
        }
      }
    },

    jshint: {
      files: ['src/*.js'],
      options: {
        jshintrc: '.jshintrc'
      }
    },

    uglify: {
      grouped: {
        options: {
          mangle: false,
          compress: false,
          beautify: true
        },
        files: {
          'build/date-enhancer.js': ['src/*.js']
        }
      },
      minified: {
        options: {
          mangle: true,
          compress: {
            sequences: true,
            properties: true,
            dead_code: true,
            booleans: true,
            loops: true,
            if_return: true,
            join_vars: true,
            drop_console: true,
          }
        },
        files: {
          'build/date-enhancer.min.js': ['src/*.js']
        }
      }
    },

    jasmine : {
      src : 'src/*.js',
      options : {
        specs : 'spec/*.js'
      }
    },

    watch: {
      scripts: {
        files: ['src/*', 'spec/*', 'Gruntfile.js'],
        tasks: ['default'],
        options: {
          interrupt: true,
        },
      },
    },

    karma: {
      options: {
        frameworks: ['jasmine'],
        files: ['spec/*.js', 'src/*.js', 'spec/env/' + (process.env.tz ? process.env.tz : 'Europe/Paris') + '.js'],
        logLevel: 'DEBUG',
      },
      unit: {
        browsers: ['PhantomJS', 'Safari', 'Firefox'],
      },
      travis: {
        browsers: ['PhantomJS', 'Firefox'],
        singleRun: true,
        reporters: ['coverage'],
        coverageReporter: {
          type: "lcov",
          dir: "coverage/"
        },
        preprocessors: {
          "src/*js": "coverage"
        },
      }
    },

    coveralls: {
      options: {
        coverageDir: 'coverage/',
        force: true,
        recursive: true
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-jasmine');
  grunt.loadNpmTasks('grunt-karma');
  grunt.loadNpmTasks('grunt-karma-coveralls');

  grunt.registerTask('test', ['jshint', 'karma:travis']);
  grunt.registerTask('default', ['test', 'uglify', 'coveralls']);
};
<commit_msg>Remove debug / Add progress reporter<commit_after>module.exports = function(grunt) {

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

    connect: {
      server: {
        options: {
          hostname: '127.0.0.1',
          base: '.',
          port: 8080
        }
      }
    },

    jshint: {
      files: ['src/*.js'],
      options: {
        jshintrc: '.jshintrc'
      }
    },

    uglify: {
      grouped: {
        options: {
          mangle: false,
          compress: false,
          beautify: true
        },
        files: {
          'build/date-enhancer.js': ['src/*.js']
        }
      },
      minified: {
        options: {
          mangle: true,
          compress: {
            sequences: true,
            properties: true,
            dead_code: true,
            booleans: true,
            loops: true,
            if_return: true,
            join_vars: true,
            drop_console: true,
          }
        },
        files: {
          'build/date-enhancer.min.js': ['src/*.js']
        }
      }
    },

    jasmine : {
      src : 'src/*.js',
      options : {
        specs : 'spec/*.js'
      }
    },

    watch: {
      scripts: {
        files: ['src/*', 'spec/*', 'Gruntfile.js'],
        tasks: ['default'],
        options: {
          interrupt: true,
        },
      },
    },

    karma: {
      options: {
        frameworks: ['jasmine'],
        files: ['spec/*.js', 'src/*.js', 'spec/env/' + (process.env.tz ? process.env.tz : 'Europe/Paris') + '.js'],
      },
      unit: {
        browsers: ['PhantomJS', 'Safari', 'Firefox'],
      },
      travis: {
        browsers: ['PhantomJS', 'Firefox'],
        singleRun: true,
        reporters: ['progress', 'coverage'],
        coverageReporter: {
          type: "lcov",
          dir: "coverage/"
        },
        preprocessors: {
          "src/*js": "coverage"
        },
      }
    },

    coveralls: {
      options: {
        coverageDir: 'coverage/',
        force: true,
        recursive: true
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-jasmine');
  grunt.loadNpmTasks('grunt-karma');
  grunt.loadNpmTasks('grunt-karma-coveralls');

  grunt.registerTask('test', ['jshint', 'karma:travis']);
  grunt.registerTask('default', ['test', 'uglify', 'coveralls']);
};
<|endoftext|>


<commit_before>// Generated on 2013-06-27 using generator-angular 0.3.0
'use strict';
var LIVERELOAD_PORT = 35729;
var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
var mountFolder = function (connect, dir) {
  return connect.static(require('path').resolve(dir));
};

// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'

module.exports = function (grunt) {
  // load all grunt tasks
  require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

  // configurable paths
  var yeomanConfig = {
    app: 'app',
    dist: 'dist'
  };

  try {
    yeomanConfig.app = require('./bower.json').appPath || yeomanConfig.app;
  } catch (e) {}

  grunt.initConfig({
    yeoman: yeomanConfig,
    watch: {
      coffee: {
        files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],
        tasks: ['coffee:dist']
      },
      coffeeTest: {
        files: ['test/spec/{,*/}*.coffee'],
        tasks: ['coffee:test']
      },
      compass: {
        files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        tasks: ['compass:server']
      },
      livereload: {
        options: {
          livereload: LIVERELOAD_PORT
        },
        files: [
          '<%= yeoman.app %>/{,*/}*.html',
          '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
          '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
          '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
        ]
      }
    },
    connect: {
      options: {
        port: 9000,
        // Change this to '0.0.0.0' to access the server from outside.
        // Change this to 'localhost' to deny access to the server from outside.
        hostname: '0.0.0.0'
      },
      livereload: {
        options: {
          middleware: function (connect) {
            return [
              lrSnippet,
              mountFolder(connect, '.tmp'),
              mountFolder(connect, yeomanConfig.app)
            ];
          }
        }
      },
      test: {
        options: {
          middleware: function (connect) {
            return [
              mountFolder(connect, '.tmp'),
              mountFolder(connect, 'test')
            ];
          }
        }
      },
      dist: {
        options: {
          middleware: function (connect) {
            return [
              mountFolder(connect, yeomanConfig.dist)
            ];
          }
        }
      }
    },
    open: {
      server: {
        url: 'http://localhost:<%= connect.options.port %>'
      }
    },
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/*',
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },
      server: '.tmp'
    },
    jshint: {
      options: {
        jshintrc: '.jshintrc'
      },
      all: [
        'Gruntfile.js',
        '<%= yeoman.app %>/scripts/{,*/}*.js',
        'test/spec/{,*/}*.js'
      ]
    },
    coffee: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/scripts',
          src: '{,*/}*.coffee',
          dest: '.tmp/scripts',
          ext: '.js'
        }]
      },
      test: {
        files: [{
          expand: true,
          cwd: 'test/spec',
          src: '{,*/}*.coffee',
          dest: '.tmp/spec',
          ext: '.js'
        }]
      }
    },
    compass: {
      options: {
        sassDir: '<%= yeoman.app %>/styles',
        cssDir: '.tmp/styles',
        generatedImagesDir: '.tmp/images/generated',
        imagesDir: '<%= yeoman.app %>/images',
        javascriptsDir: '<%= yeoman.app %>/scripts',
        fontsDir: '<%= yeoman.app %>/styles/fonts',
        importPath: '<%= yeoman.app %>/bower_components',
        httpImagesPath: '/images',
        httpGeneratedImagesPath: '/images/generated',
        httpFontsPath: '/styles/fonts',
        relativeAssets: false
      },
      dist: {},
      server: {
        options: {
          debugInfo: true
        }
      }
    },
    // not used since Uglify task does concat,
    // but still available if needed
    /*concat: {
      dist: {}
    },*/
    rev: {
      dist: {
        files: {
          src: [
            '<%= yeoman.dist %>/scripts/{,*/}*.js',
            '<%= yeoman.dist %>/styles/{,*/}*.css',
            '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
            '<%= yeoman.dist %>/styles/fonts/*'
          ]
        }
      }
    },
    useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
        dest: '<%= yeoman.dist %>'
      }
    },
    usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      options: {
        dirs: ['<%= yeoman.dist %>']
      }
    },
    imagemin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.{png,jpg,jpeg}',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },
    cssmin: {
      // By default, your `index.html` <!-- Usemin Block --> will take care of
      // minification. This option is pre-configured if you do not wish to use
      // Usemin blocks.
      // dist: {
      //   files: {
      //     '<%= yeoman.dist %>/styles/main.css': [
      //       '.tmp/styles/{,*/}*.css',
      //       '<%= yeoman.app %>/styles/{,*/}*.css'
      //     ]
      //   }
      // }
    },
    htmlmin: {
      dist: {
        options: {
          /*removeCommentsFromCDATA: true,
          // https://github.com/yeoman/grunt-usemin/issues/44
          //collapseWhitespace: true,
          collapseBooleanAttributes: true,
          removeAttributeQuotes: true,
          removeRedundantAttributes: true,
          useShortDoctype: true,
          removeEmptyAttributes: true,
          removeOptionalTags: true*/
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>',
          src: ['*.html', 'views/*.html'],
          dest: '<%= yeoman.dist %>'
        }]
      }
    },
    // Put files not handled in other tasks here
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt}',
            '.htaccess',
            'bower_components/**/*',
            'images/{,*/}*.{gif,webp,svg}',
            'styles/fonts/*'
          ]
        }, {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: [
            'generated/*'
          ]
        }]
      }
    },
    concurrent: {
      server: [
        'coffee:dist',
        'compass:server'
      ],
      test: [
        'coffee',
        'compass'
      ],
      dist: [
        'coffee',
        'compass:dist',
        'imagemin',
        'htmlmin'
      ]
    },
    karma: {
      unit: {
        configFile: 'karma.conf.js',
        singleRun: true
      }
    },
    cdnify: {
      dist: {
        html: ['<%= yeoman.dist %>/*.html']
      }
    },
    ngmin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>/scripts',
          src: '*.js',
          dest: '<%= yeoman.dist %>/scripts'
        }]
      }
    }/*,
    uglify: {
      dist: {
        files: {
          '<%= yeoman.dist %>/scripts/scripts.js': [
            '<%= yeoman.dist %>/scripts/scripts.js'
          ]
        }
      }
    }*/
  });

  grunt.registerTask('server', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
    }

    if (target === 'nobrowser') {
      return grunt.task.run([
        'clean:server',
        'concurrent:server',
        'connect:livereload',
        'watch'
      ]);
    }

    grunt.task.run([
      'clean:server',
      'concurrent:server',
      'connect:livereload',
      'open',
      'watch'
    ]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'connect:test',
    'karma'
  ]);

  grunt.registerTask('build', [
    'clean:dist',
    'useminPrepare',
    'concurrent:dist',
    'concat',
    'copy',
    'cdnify',
    'ngmin',
    'cssmin',
    'uglify',
    'rev',
    'usemin'
  ]);

  grunt.registerTask('default', [
    'jshint',
    'test',
    'build'
  ]);
};
<commit_msg>Grunt file, remove uglify<commit_after>// Generated on 2013-06-27 using generator-angular 0.3.0
'use strict';
var LIVERELOAD_PORT = 35729;
var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
var mountFolder = function (connect, dir) {
  return connect.static(require('path').resolve(dir));
};

// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'

module.exports = function (grunt) {
  // load all grunt tasks
  require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

  // configurable paths
  var yeomanConfig = {
    app: 'app',
    dist: 'dist'
  };

  try {
    yeomanConfig.app = require('./bower.json').appPath || yeomanConfig.app;
  } catch (e) {}

  grunt.initConfig({
    yeoman: yeomanConfig,
    watch: {
      coffee: {
        files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],
        tasks: ['coffee:dist']
      },
      coffeeTest: {
        files: ['test/spec/{,*/}*.coffee'],
        tasks: ['coffee:test']
      },
      compass: {
        files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        tasks: ['compass:server']
      },
      livereload: {
        options: {
          livereload: LIVERELOAD_PORT
        },
        files: [
          '<%= yeoman.app %>/{,*/}*.html',
          '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
          '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
          '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
        ]
      }
    },
    connect: {
      options: {
        port: 9000,
        // Change this to '0.0.0.0' to access the server from outside.
        // Change this to 'localhost' to deny access to the server from outside.
        hostname: '0.0.0.0'
      },
      livereload: {
        options: {
          middleware: function (connect) {
            return [
              lrSnippet,
              mountFolder(connect, '.tmp'),
              mountFolder(connect, yeomanConfig.app)
            ];
          }
        }
      },
      test: {
        options: {
          middleware: function (connect) {
            return [
              mountFolder(connect, '.tmp'),
              mountFolder(connect, 'test')
            ];
          }
        }
      },
      dist: {
        options: {
          middleware: function (connect) {
            return [
              mountFolder(connect, yeomanConfig.dist)
            ];
          }
        }
      }
    },
    open: {
      server: {
        url: 'http://localhost:<%= connect.options.port %>'
      }
    },
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/*',
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },
      server: '.tmp'
    },
    jshint: {
      options: {
        jshintrc: '.jshintrc'
      },
      all: [
        'Gruntfile.js',
        '<%= yeoman.app %>/scripts/{,*/}*.js',
        'test/spec/{,*/}*.js'
      ]
    },
    coffee: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/scripts',
          src: '{,*/}*.coffee',
          dest: '.tmp/scripts',
          ext: '.js'
        }]
      },
      test: {
        files: [{
          expand: true,
          cwd: 'test/spec',
          src: '{,*/}*.coffee',
          dest: '.tmp/spec',
          ext: '.js'
        }]
      }
    },
    compass: {
      options: {
        sassDir: '<%= yeoman.app %>/styles',
        cssDir: '.tmp/styles',
        generatedImagesDir: '.tmp/images/generated',
        imagesDir: '<%= yeoman.app %>/images',
        javascriptsDir: '<%= yeoman.app %>/scripts',
        fontsDir: '<%= yeoman.app %>/styles/fonts',
        importPath: '<%= yeoman.app %>/bower_components',
        httpImagesPath: '/images',
        httpGeneratedImagesPath: '/images/generated',
        httpFontsPath: '/styles/fonts',
        relativeAssets: false
      },
      dist: {},
      server: {
        options: {
          debugInfo: true
        }
      }
    },
    // not used since Uglify task does concat,
    // but still available if needed
    /*concat: {
      dist: {}
    },*/
    rev: {
      dist: {
        files: {
          src: [
            '<%= yeoman.dist %>/scripts/{,*/}*.js',
            '<%= yeoman.dist %>/styles/{,*/}*.css',
            '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
            '<%= yeoman.dist %>/styles/fonts/*'
          ]
        }
      }
    },
    useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
        dest: '<%= yeoman.dist %>'
      }
    },
    usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      options: {
        dirs: ['<%= yeoman.dist %>']
      }
    },
    imagemin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.{png,jpg,jpeg}',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },
    cssmin: {
      // By default, your `index.html` <!-- Usemin Block --> will take care of
      // minification. This option is pre-configured if you do not wish to use
      // Usemin blocks.
      // dist: {
      //   files: {
      //     '<%= yeoman.dist %>/styles/main.css': [
      //       '.tmp/styles/{,*/}*.css',
      //       '<%= yeoman.app %>/styles/{,*/}*.css'
      //     ]
      //   }
      // }
    },
    htmlmin: {
      dist: {
        options: {
          /*removeCommentsFromCDATA: true,
          // https://github.com/yeoman/grunt-usemin/issues/44
          //collapseWhitespace: true,
          collapseBooleanAttributes: true,
          removeAttributeQuotes: true,
          removeRedundantAttributes: true,
          useShortDoctype: true,
          removeEmptyAttributes: true,
          removeOptionalTags: true*/
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>',
          src: ['*.html', 'views/*.html'],
          dest: '<%= yeoman.dist %>'
        }]
      }
    },
    // Put files not handled in other tasks here
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt}',
            '.htaccess',
            'bower_components/**/*',
            'images/{,*/}*.{gif,webp,svg}',
            'styles/fonts/*'
          ]
        }, {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: [
            'generated/*'
          ]
        }]
      }
    },
    concurrent: {
      server: [
        'coffee:dist',
        'compass:server'
      ],
      test: [
        'coffee',
        'compass'
      ],
      dist: [
        'coffee',
        'compass:dist',
        'imagemin',
        'htmlmin'
      ]
    },
    karma: {
      unit: {
        configFile: 'karma.conf.js',
        singleRun: true
      }
    },
    cdnify: {
      dist: {
        html: ['<%= yeoman.dist %>/*.html']
      }
    },
    ngmin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>/scripts',
          src: '*.js',
          dest: '<%= yeoman.dist %>/scripts'
        }]
      }
    }
  });

  grunt.registerTask('server', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
    }

    if (target === 'nobrowser') {
      return grunt.task.run([
        'clean:server',
        'concurrent:server',
        'connect:livereload',
        'watch'
      ]);
    }

    grunt.task.run([
      'clean:server',
      'concurrent:server',
      'connect:livereload',
      'open',
      'watch'
    ]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'connect:test',
    'karma'
  ]);

  grunt.registerTask('build', [
    'clean:dist',
    'useminPrepare',
    'concurrent:dist',
    'concat',
    'copy',
    'cdnify',
    'ngmin',
    'cssmin',
    'uglify',
    'rev',
    'usemin'
  ]);

  grunt.registerTask('default', [
    'jshint',
    'test',
    'build'
  ]);
};
<|endoftext|>


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

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        bump: {
            options: {
                files: ['package.json', 'bower.json'],
                updateConfigs: [],
                commit: true,
                commitMessage: 'Bumped to release v%VERSION%',
                commitFiles: ['package.json', 'bower.json'],
                createTag: true,
                tagName: 'v%VERSION%',
                tagMessage: 'Version %VERSION%',
                push: false,
                pushTo: 'upstream',
                gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d',
                globalReplace: false,
                prereleaseName: false,
                regExp: false
            }
        }
    });

    grunt.loadNpmTasks('grunt-bump');
};
<commit_msg>Added grunt-bump instructions<commit_after>module.exports = function(grunt) {
    'use strict';

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        bump: {
            options: {
                files: ['package.json', 'bower.json'],
                updateConfigs: [],
                commit: true,
                commitMessage: 'Bumped to release v%VERSION%',
                commitFiles: ['package.json', 'bower.json'],
                createTag: true,
                tagName: 'v%VERSION%',
                tagMessage: 'Version %VERSION%',
                push: false,
                pushTo: 'upstream',
                gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d',
                globalReplace: false,
                prereleaseName: false,
                regExp: false
            }
        }
    });

    grunt.loadNpmTasks('grunt-bump');

    /**\/
    $ grunt bump
    >> Version bumped to 0.0.2
    >> Committed as "Release v0.0.2"
    >> Tagged as "v0.0.2"
    >> Pushed to origin

    $ grunt bump:patch
    >> Version bumped to 0.0.3
    >> Committed as "Release v0.0.3"
    >> Tagged as "v0.0.3"
    >> Pushed to origin

    $ grunt bump:minor
    >> Version bumped to 0.1.0
    >> Committed as "Release v0.1.0"
    >> Tagged as "v0.1.0"
    >> Pushed to origin

    $ grunt bump:major
    >> Version bumped to 1.0.0
    >> Committed as "Release v1.0.0"
    >> Tagged as "v1.0.0"
    >> Pushed to origin

    $ grunt bump:patch
    >> Version bumped to 1.0.1
    >> Committed as "Release v1.0.1"
    >> Tagged as "v1.0.1"
    >> Pushed to origin

    $ grunt bump:git
    >> Version bumped to 1.0.1-ge96c
    >> Committed as "Release v1.0.1-ge96c"
    >> Tagged as "v1.0.1-ge96c"
    >> Pushed to origin

    $ grunt bump:prepatch
    >> Version bumped to 1.0.2-0
    >> Committed as "Release v1.0.2-0"
    >> Tagged as "v1.0.2-0"
    >> Pushed to origin

    $ grunt bump:prerelease
    >> Version bumped to 1.0.2-1
    >> Committed as "Release v1.0.2-1"
    >> Tagged as "v1.0.2-1"
    >> Pushed to origin

    $ grunt bump:patch # (major, minor or patch) will do this
    >> Version bumped to 1.0.2
    >> Committed as "Release v1.0.2"
    >> Tagged as "v1.0.2"
    >> Pushed to origin

    $ grunt bump:preminor
    >> Version bumped to 1.1.0-0
    >> Committed as "Release v1.1.0-0"
    >> Tagged as "v1.1.0-0"
    >> Pushed to origin

    $ grunt bump
    >> Version bumped to 1.1.0
    >> Committed as "Release v1.1.0"
    >> Tagged as "v1.1.0"
    >> Pushed to origin

    $ grunt bump:premajor (with prerelaseName set to 'rc' in options)
    >> Version bumped to 2.0.0-rc.0
    >> Committed as "Release v2.0.0-rc.0"
    >> Tagged as "v2.0.0-rc.0"
    >> Pushed to origin

    $ grunt bump
    >> Version bumped to 2.0.0
    >> Committed as "Release v2.0.0"
    >> Tagged as "v2.0.0"
    >> Pushed to origin

    $ grunt bump:prerelease  # from a released version `prerelease` defaults to prepatch
    >> Version bumped to 2.0.1-rc.0
    >> Committed as "Release v2.0.1-rc.0"
    >> Tagged as "v2.0.1-rc.0"
    >> Pushed to origin
    /**/
};
<|endoftext|>


<commit_before>'using strict';
module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    hogan: {
      nodejs: {
        templates: 'view/binder/nodejs.hogan',
        output: 'tasks/binder/nodejs.js',
        binderName: 'bootstrap'
      },
      'default': {
        templates: 'view/binder/default.hogan',
        output: 'tasks/binder/default.js',
        binderName: 'bootstrap'
      },
      hulk: {
        templates: 'view/binder/hulk.hogan',
        output: 'tasks/binder/hulk.js',
        binderName: 'bootstrap'
      },
      revealing: {
        templates: 'view/binder/revealing.hogan',
        output: 'tasks/binder/revealing.js',
        binderName: 'bootstrap'
      },
      amd: {
        templates: 'view/binder/amd.hogan',
        output: 'tasks/binder/amd.js',
        binderName: 'bootstrap'
      }
    },
    watch: {
      files: '<config:lint.files>',
      tasks: 'default'
    },
    jshint: {
      before: ['Gruntfile.js', 'tasks/hogan.js', 'example/Gruntfile.js'],
      after: ['tasks/binder/*.js']
      options: {
        curly: true,
        eqeqeq: true,
        immed: true,
        latedef: true,
        newcap: true,
        noarg: true,
        sub: true,
        undef: true,
        boss: true,
        eqnull: true,
        node: true,
        es5: true
      },
      globals: {}
    }
  });

  // Load local tasks.
  grunt.loadTasks('tasks');

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

  // Default task.
  grunt.registerTask('default', 'hogan');

  grunt.registerTask('ci', ['jshint:before', 'hogan', 'jshint:after']);

};
<commit_msg>fixed borked js<commit_after>'using strict';
module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    hogan: {
      nodejs: {
        templates: 'view/binder/nodejs.hogan',
        output: 'tasks/binder/nodejs.js',
        binderName: 'bootstrap'
      },
      'default': {
        templates: 'view/binder/default.hogan',
        output: 'tasks/binder/default.js',
        binderName: 'bootstrap'
      },
      hulk: {
        templates: 'view/binder/hulk.hogan',
        output: 'tasks/binder/hulk.js',
        binderName: 'bootstrap'
      },
      revealing: {
        templates: 'view/binder/revealing.hogan',
        output: 'tasks/binder/revealing.js',
        binderName: 'bootstrap'
      },
      amd: {
        templates: 'view/binder/amd.hogan',
        output: 'tasks/binder/amd.js',
        binderName: 'bootstrap'
      }
    },
    watch: {
      files: '<config:lint.files>',
      tasks: 'default'
    },
    jshint: {
      before: ['Gruntfile.js', 'tasks/hogan.js', 'example/Gruntfile.js'],
      after: ['tasks/binder/*.js'],
      options: {
        curly: true,
        eqeqeq: true,
        immed: true,
        latedef: true,
        newcap: true,
        noarg: true,
        sub: true,
        undef: true,
        boss: true,
        eqnull: true,
        node: true,
        es5: true
      },
      globals: {}
    }
  });

  // Load local tasks.
  grunt.loadTasks('tasks');

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

  // Default task.
  grunt.registerTask('default', 'hogan');

  grunt.registerTask('ci', ['jshint:before', 'hogan', 'jshint:after']);

};
<|endoftext|>


<commit_before>module.exports = function(grunt) {
  "use strict";

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    jshint: {
      all: [
        'src/progressive-ui-kitt.js',
        'Gruntfile.js',
        'test/specs/*Spec.js'
      ],
      options: {
        jshintrc: true
      }
    },
    browserify: {
      standalone: {
        src: [ 'src/progressive-ui-kitt.js' ],
        dest: 'dist/progressive-ui-kitt.js',
        options: {
          plugin: [
            [ "minifyify", { output: "dist/progressive-ui-kitt.js.map", map: 'progressive-ui-kitt.js.map' } ],
            [ "browserify-header" ]
          ],
          browserifyOptions: {
            standalone: 'puikitt',
            debug: true
          }
        }
      },
    },
    watch: {
      files: ['src/progressive-ui-kitt.js', '!**/node_modules/**'],
      tasks: ['default']
    },
    jasmine: {
      testAndCoverage: {
        src: ['dist/progressive-ui-kitt.js'],
        options: {
          specs: ['test/specs/*Spec.js'],
          outfile: 'test/SpecRunner.html',
          keepRunner: true,
          template: require('grunt-template-jasmine-istanbul'),
          templateOptions: {
            coverage: 'test/coverage/coverage.json',
            report: [
              {
                type: 'html',
                options: {
                  dir: 'test/coverage'
                }
              },
              {
                type: 'text'
              }
            ],
            thresholds: {
              statements: 50,
              branches: 30,
              functions: 80,
              lines: 90
            }
          }
        }
      }
    }
  });

  // Load NPM Tasks
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-browserify');
  grunt.loadNpmTasks('grunt-contrib-jasmine');

  // Default task(s).
  grunt.registerTask('default', ['jshint', 'browserify', 'jasmine']);

  // Test task
  grunt.registerTask('test', ['jshint']);

};
<commit_msg>Added test specs to watched files list<commit_after>module.exports = function(grunt) {
  "use strict";

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    jshint: {
      all: [
        'src/progressive-ui-kitt.js',
        'Gruntfile.js',
        'test/specs/*Spec.js'
      ],
      options: {
        jshintrc: true
      }
    },
    browserify: {
      standalone: {
        src: [ 'src/progressive-ui-kitt.js' ],
        dest: 'dist/progressive-ui-kitt.js',
        options: {
          plugin: [
            [ "minifyify", { output: "dist/progressive-ui-kitt.js.map", map: 'progressive-ui-kitt.js.map' } ],
            [ "browserify-header" ]
          ],
          browserifyOptions: {
            standalone: 'puikitt',
            debug: true
          }
        }
      },
    },
    watch: {
      files: ['src/progressive-ui-kitt.js', 'test/specs/*Spec.js', '!**/node_modules/**'],
      tasks: ['default']
    },
    jasmine: {
      testAndCoverage: {
        src: ['dist/progressive-ui-kitt.js'],
        options: {
          specs: ['test/specs/*Spec.js'],
          outfile: 'test/SpecRunner.html',
          keepRunner: true,
          template: require('grunt-template-jasmine-istanbul'),
          templateOptions: {
            coverage: 'test/coverage/coverage.json',
            report: [
              {
                type: 'html',
                options: {
                  dir: 'test/coverage'
                }
              },
              {
                type: 'text'
              }
            ],
            thresholds: {
              statements: 50,
              branches: 30,
              functions: 80,
              lines: 90
            }
          }
        }
      }
    }
  });

  // Load NPM Tasks
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-browserify');
  grunt.loadNpmTasks('grunt-contrib-jasmine');

  // Default task(s).
  grunt.registerTask('default', ['jshint', 'browserify', 'jasmine']);

  // Test task
  grunt.registerTask('test', ['jshint']);

};
<|endoftext|>


<commit_before>"use strict";

module.exports = function (grunt) {

  // Time how long tasks take.
  require("time-grunt")(grunt);

  grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),

    // Make sure code styles are up to par and there are no obvious mistakes
    jshint: {
      options: {
        jshintrc: ".jshintrc",
        reporter: require("jshint-stylish")
      },
      all: [
        "Gruntfile.js",
        "web_client/js/{,*/}*.js"
      ],
      // test: {
      //   options: {
      //     jshintrc: "test/.jshintrc"
      //   },
      //   src: ["test/spec/{,*/}*.js"]
      // }
    },

    ngmin: {
      build: {
        src: ["web_client/js/**/*.js"],
        dest: "web_client/build/<%= pkg.name %>.combined.js",
      }
    },

    ngtemplates: {
      InboxApp: {
        src: "web_client/views/**.html",
        dest: "web_client/build/templates.js",
        options: {
          htmlmin: {
            collapseWhitespace: true,
            collapseBooleanAttributes: true
          }
        }
      }
    },

    uglify: {
      options: {
        banner: "/*! <%= pkg.name %> <%= grunt.template.today('dd-mm-yyyy') %> */\n",
        mangle: false,
      },
      dist: {
        files: {
          "web_client/build/<%= pkg.name %>.compressed.js": [
            "web_client/build/<%= pkg.name %>.combined.js"
          ]
        }
      }
    },

  });

  grunt.loadNpmTasks("grunt-contrib-uglify");
  grunt.loadNpmTasks("grunt-contrib-jshint");
  grunt.loadNpmTasks("grunt-contrib-qunit");
  grunt.loadNpmTasks("grunt-contrib-concat");
  grunt.loadNpmTasks("grunt-ngmin");
  grunt.loadNpmTasks("grunt-angular-templates");

  grunt.registerTask("default", ["jshint", "ngmin", "ngtemplates",
    "uglify"
  ]);

};<commit_msg>clean task<commit_after>"use strict";

module.exports = function (grunt) {

  require("time-grunt")(grunt);

  grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),

    yeoman: {
      app:  "web_client",
      dist: "web_client/dist"
    },

    // Make sure code styles are up to par and there are no obvious mistakes
    jshint: {
      options: {
        jshintrc: ".jshintrc",
        reporter: require("jshint-stylish")
      },
      all: [
        "Gruntfile.js",
        "<%= yeoman.app %>/js/{,*/}*.js"
      ],
    },

    // Empties folders to start fresh
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            ".tmp",
            "<%= yeoman.dist %>/*",
            "!<%= yeoman.dist %>/.git*"
          ]
        }]
      },
    },

    ngmin: {
      build: {
        src: ["<%= yeoman.app %>/js/**/*.js"],
        dest: "<%= yeoman.dist %>/<%= pkg.name %>.combined.js",
      }
    },

    ngtemplates: {
      InboxApp: {
        src: "<%= yeoman.app %>/views/**.html",
        dest: "<%= yeoman.dist %>/templates.js",
        options: {
          htmlmin: {
            collapseWhitespace: true,
            collapseBooleanAttributes: true
          }
        }
      }
    },

    uglify: {
      options: {
        banner: "/*! <%= pkg.name %> <%= grunt.template.today('dd-mm-yyyy') %> */\n",
        mangle: false,
      },
      dist: {
        files: {
          "<%= yeoman.dist %>/<%= pkg.name %>.compressed.js": [
            "<%= yeoman.dist %>/<%= pkg.name %>.combined.js"
          ]
        }
      }
    },

  });

  grunt.loadNpmTasks("grunt-contrib-uglify");
  grunt.loadNpmTasks("grunt-contrib-jshint");
  grunt.loadNpmTasks("grunt-contrib-qunit");
  grunt.loadNpmTasks("grunt-contrib-concat");
  grunt.loadNpmTasks("grunt-ngmin");
  grunt.loadNpmTasks("grunt-angular-templates");

  grunt.registerTask("default", ["jshint", "ngmin", "ngtemplates",
    "uglify"
  ]);

};<|endoftext|>


<commit_before>'use strict';

var LIVERELOAD_PORT = 35730;
var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
var mountFolder = function (connect, dir) {
    return connect.static(require('path').resolve(dir));
};
module.exports = function (grunt) {
    require('load-grunt-tasks')(grunt);
    require('time-grunt')(grunt);

    // configurable paths
    var config = {
        app: 'app',
        dist: 'dist'
    };

    try {
        config.app = require('./bower.json').appPath || config.app;
    } catch (e) {
    }

    grunt.initConfig({
        config: config,
        watch: {
            coffee: {
                files: ['<%= config.app %>/scripts/{,*/}*.coffee'],
                tasks: ['coffee:dist']
            },
            coffeeTest: {
                files: ['test/unit/{,*/}*.coffee'],
                tasks: ['coffee:test']
            },
            styles: {
                files: ['<%= config.app %>/styles/{,*/}*.css', '<%= config.app %>/lib/bootstrap/dist/css/*.css'],
                tasks: ['copy:styles', 'autoprefixer']
            },
            livereload: {
                options: {
                    livereload: LIVERELOAD_PORT
                },
                files: [
                    '<%= config.app %>/{,*/}*.html',
                    '.tmp/styles/{,*/}*.css',
                    '{.tmp,<%= config.app %>}/scripts/{,*/}*.js',
                    '<%= config.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
                ]
            }
        },
        autoprefixer: {
            options: ['last 1 version'],

            dist: {

                files: [
                    {
                        expand: true,
                        cwd: '.tmp/styles/',
                        src: '{,*/}*.css',
                        dest: '.tmp/styles/'
                    }
                ]
            }
        },
        connect: {
            options: {
                port: 9001,
                // Change this to '0.0.0.0' to access the server from outside.
                hostname: 'localhost'
            },
            livereload: {
                options: {
                    middleware: function (connect) {
                        return [
                            lrSnippet,
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, config.app)
                        ];
                    }
                }
            },
            test: {
                options: {
                    middleware: function (connect) {
                        return [
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, 'test')
                        ];
                    }
                }
            },
            dist: {
                options: {
                    middleware: function (connect) {
                        return [
                            mountFolder(connect, config.dist)
                        ];
                    }
                }
            }
        },
        open: {
            server: {
                url: 'http://localhost:<%= connect.options.port %>'
            }
        },
        clean: {
            dist: {
                files: [
                    {
                        dot: true,
                        src: [
                            '.tmp',
                            '<%= config.dist %>/*',
                            '!<%= config.dist %>/.git*'
                        ]
                    }
                ]
            },
            server: '.tmp'
        },
        jshint: {
            options: {
                jshintrc: '.jshintrc'
            },
            all: [
                '<%= config.app %>/js/{,*/}*.js'
            ]
        },
        coffee: {
            options: {
                sourceMap: true,
                sourceRoot: ''
            },
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/scripts',
                        src: '{,*/}*.coffee',
                        dest: '.tmp/scripts',
                        ext: '.js'
                    }
                ]
            },
            test: {
                files: [
                    {
                        expand: true,
                        cwd: 'test/unit',
                        src: '{,*/}*.coffee',
                        dest: '.tmp/unit',
                        ext: '.js'
                    }
                ]
            }
        },
        // not used since Uglify task does concat,
        // but still available if needed
        /*concat: {
         dist: {}
         },*/
        rev: {
            dist: {
                files: {
                    src: [
                        '<%= config.dist %>/scripts/{,*/}*.js',
                        '<%= config.dist %>/styles/{,*/}*.css',
                        '<%= config.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
                        '<%= config.dist %>/styles/fonts/*'
                    ]
                }
            }
        },
        useminPrepare: {
            html: '<%= config.app %>/index.html',
            options: {
                dest: '<%= config.dist %>'
            }
        },
        usemin: {
            html: ['<%= config.dist %>/{,*/}*.html'],
            css: ['<%= config.dist %>/css/{,*/}*.css'],
            options: {
                dirs: ['<%= config.dist %>']
            }
        },
        imagemin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/img',
                        src: '{,*/}*.{png,jpg,jpeg}',
                        dest: '<%= config.dist %>/img'
                    }
                ]
            }
        },
        svgmin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/img',
                        src: '{,*/}*.svg',
                        dest: '<%= config.dist %>/img'
                    }
                ]
            }
        },
        cssmin: {
            // By default, your `index.html` <!-- Usemin Block --> will take care of
            // minification. This option is pre-configured if you do not wish to use
            // Usemin blocks.
            // dist: {
            //   files: {
            //     '<%= config.dist %>/styles/main.css': [
            //       '.tmp/styles/{,*/}*.css',
            //       '<%= config.app %>/styles/{,*/}*.css'
            //     ]
            //   }
            // }
        },
        htmlmin: {
            dist: {
                options: {
                    /*removeCommentsFromCDATA: true,
                     // https://github.com/config/grunt-usemin/issues/44
                     //collapseWhitespace: true,
                     collapseBooleanAttributes: true,
                     removeAttributeQuotes: true,
                     removeRedundantAttributes: true,
                     useShortDoctype: true,
                     removeEmptyAttributes: true,
                     removeOptionalTags: true*/
                },
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>',
                        src: ['*.html', 'partials/{,*/}*.html'],
                        dest: '<%= config.dist %>'
                    }
                ]
            }
        },
        // Put files not handled in other tasks here
        copy: {
            dist: {
                files: [
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            '*.{ico,png,txt}',
                            'img/{,*/}*.{gif,webp}'
                        ]
                    },
                    {
                        expand: true,
                        cwd: '.tmp/images',
                        dest: '<%= config.dist %>/images',
                        src: [
                            'generated/*'
                        ]
                    },
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            'i18n/*.json'
                        ]
                    },
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            'lib/*angular-i18n/*.js'
                        ]
                    }
                ]
            },
            styles: {
                expand: true,
                cwd: '<%= config.app %>/styles',
                dest: '.tmp/css/',
                src: '{,*/}*.css'
            }
        },
        concurrent: {
            server: [
                'coffee:dist',
                'copy:styles'
            ],
            test: [
                'coffee',
                'copy:styles'
            ],
            dist: [
                'coffee',
                'copy:styles',
                'imagemin',
                'svgmin',
                'htmlmin'
            ]
        },
        karma: {
            unit: {
                configFile: 'config/karma.conf.js',
                singleRun: true
            }
        },
        cdnify: {
            dist: {
                html: ['<%= config.dist %>/*.html']
            }
        },
        ngmin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.dist %>/scripts',
                        src: '*.js',
                        dest: '<%= config.dist %>/scripts'
                    }
                ]
            }
        },
        uglify: {
            dist: {
                files: {
                    '<%= config.dist %>/scripts/application.js': [
                        '<%= config.dist %>/scripts/application.js'
                    ]
                }
            }
        }
    });

    grunt.registerTask('server', function (target) {
        if (target === 'dist') {
            return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
        }

        grunt.task.run([
            'clean:server',
            'concurrent:server',
            'autoprefixer',
            'connect:livereload',
            'open',
            'watch'
        ]);
    });

    grunt.registerTask('test', [
        'clean:server',
        'concurrent:test',
        'autoprefixer',
        'connect:test',
        'karma'
    ]);

    grunt.registerTask('build', [
        'clean:dist',
        'useminPrepare',
        'concurrent:dist',
        'autoprefixer',
        'concat',
        'copy:dist',
        'cdnify',
        'ngmin',
        'cssmin',
        'uglify',
        'rev',
        'usemin'
    ]);

    grunt.registerTask('default', [
        'jshint',
        'test',
        'build'
    ]);
};
<commit_msg>Copy .ico when grunt build<commit_after>'use strict';

var LIVERELOAD_PORT = 35730;
var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
var mountFolder = function (connect, dir) {
    return connect.static(require('path').resolve(dir));
};
module.exports = function (grunt) {
    require('load-grunt-tasks')(grunt);
    require('time-grunt')(grunt);

    // configurable paths
    var config = {
        app: 'app',
        dist: 'dist'
    };

    try {
        config.app = require('./bower.json').appPath || config.app;
    } catch (e) {
    }

    grunt.initConfig({
        config: config,
        watch: {
            coffee: {
                files: ['<%= config.app %>/scripts/{,*/}*.coffee'],
                tasks: ['coffee:dist']
            },
            coffeeTest: {
                files: ['test/unit/{,*/}*.coffee'],
                tasks: ['coffee:test']
            },
            styles: {
                files: ['<%= config.app %>/styles/{,*/}*.css', '<%= config.app %>/lib/bootstrap/dist/css/*.css'],
                tasks: ['copy:styles', 'autoprefixer']
            },
            livereload: {
                options: {
                    livereload: LIVERELOAD_PORT
                },
                files: [
                    '<%= config.app %>/{,*/}*.html',
                    '.tmp/styles/{,*/}*.css',
                    '{.tmp,<%= config.app %>}/scripts/{,*/}*.js',
                    '<%= config.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
                ]
            }
        },
        autoprefixer: {
            options: ['last 1 version'],

            dist: {

                files: [
                    {
                        expand: true,
                        cwd: '.tmp/styles/',
                        src: '{,*/}*.css',
                        dest: '.tmp/styles/'
                    }
                ]
            }
        },
        connect: {
            options: {
                port: 9001,
                // Change this to '0.0.0.0' to access the server from outside.
                hostname: 'localhost'
            },
            livereload: {
                options: {
                    middleware: function (connect) {
                        return [
                            lrSnippet,
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, config.app)
                        ];
                    }
                }
            },
            test: {
                options: {
                    middleware: function (connect) {
                        return [
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, 'test')
                        ];
                    }
                }
            },
            dist: {
                options: {
                    middleware: function (connect) {
                        return [
                            mountFolder(connect, config.dist)
                        ];
                    }
                }
            }
        },
        open: {
            server: {
                url: 'http://localhost:<%= connect.options.port %>'
            }
        },
        clean: {
            dist: {
                files: [
                    {
                        dot: true,
                        src: [
                            '.tmp',
                            '<%= config.dist %>/*',
                            '!<%= config.dist %>/.git*'
                        ]
                    }
                ]
            },
            server: '.tmp'
        },
        jshint: {
            options: {
                jshintrc: '.jshintrc'
            },
            all: [
                '<%= config.app %>/js/{,*/}*.js'
            ]
        },
        coffee: {
            options: {
                sourceMap: true,
                sourceRoot: ''
            },
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/scripts',
                        src: '{,*/}*.coffee',
                        dest: '.tmp/scripts',
                        ext: '.js'
                    }
                ]
            },
            test: {
                files: [
                    {
                        expand: true,
                        cwd: 'test/unit',
                        src: '{,*/}*.coffee',
                        dest: '.tmp/unit',
                        ext: '.js'
                    }
                ]
            }
        },
        // not used since Uglify task does concat,
        // but still available if needed
        /*concat: {
         dist: {}
         },*/
        rev: {
            dist: {
                files: {
                    src: [
                        '<%= config.dist %>/js/{,*/}*.js',
                        '<%= config.dist %>/css/{,*/}*.css',
                        '<%= config.dist %>/img/{,*/}*.{jpg,jpeg,gif,webp,svg}'
                    ]
                }
            }
        },
        useminPrepare: {
            html: '<%= config.app %>/index.html',
            options: {
                dest: '<%= config.dist %>'
            }
        },
        usemin: {
            html: ['<%= config.dist %>/{,*/}*.html'],
            css: ['<%= config.dist %>/css/{,*/}*.css'],
            options: {
                dirs: ['<%= config.dist %>']
            }
        },
        imagemin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/img',
                        src: '{,*/}*.{png,jpg,jpeg}',
                        dest: '<%= config.dist %>/img'
                    }
                ]
            }
        },
        svgmin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>/img',
                        src: '{,*/}*.svg',
                        dest: '<%= config.dist %>/img'
                    }
                ]
            }
        },
        cssmin: {
            // By default, your `index.html` <!-- Usemin Block --> will take care of
            // minification. This option is pre-configured if you do not wish to use
            // Usemin blocks.
            // dist: {
            //   files: {
            //     '<%= config.dist %>/styles/main.css': [
            //       '.tmp/styles/{,*/}*.css',
            //       '<%= config.app %>/styles/{,*/}*.css'
            //     ]
            //   }
            // }
        },
        htmlmin: {
            dist: {
                options: {
                    /*removeCommentsFromCDATA: true,
                     // https://github.com/config/grunt-usemin/issues/44
                     //collapseWhitespace: true,
                     collapseBooleanAttributes: true,
                     removeAttributeQuotes: true,
                     removeRedundantAttributes: true,
                     useShortDoctype: true,
                     removeEmptyAttributes: true,
                     removeOptionalTags: true*/
                },
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.app %>',
                        src: ['*.html', 'partials/{,*/}*.html'],
                        dest: '<%= config.dist %>'
                    }
                ]
            }
        },
        // Put files not handled in other tasks here
        copy: {
            dist: {
                files: [
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            '*.{txt}',
                            'img/{,*/}*.{gif,webp,ico}'
                        ]
                    },
                    {
                        expand: true,
                        cwd: '.tmp/images',
                        dest: '<%= config.dist %>/images',
                        src: [
                            'generated/*'
                        ]
                    },
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            'i18n/*.json'
                        ]
                    },
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= config.app %>',
                        dest: '<%= config.dist %>',
                        src: [
                            'lib/*angular-i18n/*.js'
                        ]
                    }
                ]
            },
            styles: {
                expand: true,
                cwd: '<%= config.app %>/styles',
                dest: '.tmp/css/',
                src: '{,*/}*.css'
            }
        },
        concurrent: {
            server: [
                'coffee:dist',
                'copy:styles'
            ],
            test: [
                'coffee',
                'copy:styles'
            ],
            dist: [
                'coffee',
                'copy:styles',
                'imagemin',
                'svgmin',
                'htmlmin'
            ]
        },
        karma: {
            unit: {
                configFile: 'config/karma.conf.js',
                singleRun: true
            }
        },
        cdnify: {
            dist: {
                html: ['<%= config.dist %>/*.html']
            }
        },
        ngmin: {
            dist: {
                files: [
                    {
                        expand: true,
                        cwd: '<%= config.dist %>/scripts',
                        src: '*.js',
                        dest: '<%= config.dist %>/scripts'
                    }
                ]
            }
        },
        uglify: {
            dist: {
                files: {
                    '<%= config.dist %>/scripts/application.js': [
                        '<%= config.dist %>/scripts/application.js'
                    ]
                }
            }
        }
    });

    grunt.registerTask('server', function (target) {
        if (target === 'dist') {
            return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
        }

        grunt.task.run([
            'clean:server',
            'concurrent:server',
            'autoprefixer',
            'connect:livereload',
            'open',
            'watch'
        ]);
    });

    grunt.registerTask('test', [
        'clean:server',
        'concurrent:test',
        'autoprefixer',
        'connect:test',
        'karma'
    ]);

    grunt.registerTask('build', [
        'clean:dist',
        'useminPrepare',
        'concurrent:dist',
        'autoprefixer',
        'concat',
        'copy:dist',
        'cdnify',
        'ngmin',
        'cssmin',
        'uglify',
        'rev',
        'usemin'
    ]);

    grunt.registerTask('default', [
        'jshint',
        'test',
        'build'
    ]);
};
<|endoftext|>


<commit_before>module.exports = function (grunt) {

    var fileList = grunt.file.readJSON('bin/toolset.json').items;

    console.log(typeof fileList);

    fileList = fileList ? fileList : [];

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

        concat : {
            build: {
                options : {
                    process : function(src){
                        return src.replace(/exports.+/, '');
                    }
                },
                files: {
                    'separated_core/bin/tools.js': fileList
                }
            }
        },

        uglify: {
            build: {
                options: {
//                    sourceMap: 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.min.map'
                },
                files: [
                    {dest : 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.min.js', src : 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.js' }
                ]
            },
            pack : {
                options : {
                    beautify: true
                },
                files: {
                    'separated_core/bin/tools.js': fileList
                }
            }
        },
        copy : {
            main: {
                files: [
                    {expand: true, src: ['core/**/*.js'], dest: 'test1', filter: 'isFile'}
                ]
            }
        },
        pure_cjs: {
            rad : {
                options : {
                    exports : 'RAD'
                },
                files: [
                    {src: 'entry.js', dest: 'bin/prebuild.js'}
                ]
            },
            blanks : {
                files: [
                    {src: 'bin/structure.js', dest: 'bin/<%= pkg.name %>.<%= pkg.version %>.js'}
                ]
            }
        }

    });

    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-pure-cjs');

    grunt.registerTask('pack', ['concat:build']);

    grunt.registerTask('blanks', function(){
        var structure = grunt.file.readJSON('bin/structure.json'),

        content = grunt.file.read('tools.tpl', 'utf-8');
        content = grunt.template.process(content, {data : {arr : structure}});

        grunt.file.write('bin/structure.js', content);
    });

    grunt.registerTask('dev', ['pure_cjs:rad', 'blanks', 'pure_cjs:blanks']);
    grunt.registerTask('release', ['pure_cjs:rad', 'blanks', 'pure_cjs:blanks', 'uglify:build']);
};<commit_msg>clean task added<commit_after>module.exports = function (grunt) {

    var fileList = grunt.file.readJSON('bin/toolset.json').items;

    fileList = fileList ? fileList : [];

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

        concat : {
            build: {
                options : {
                    process : function(src){
                        return src.replace(/exports.+/, '');
                    }
                },
                files: {
                    'separated_core/bin/tools.js': fileList
                }
            }
        },

        uglify: {
            build: {
                options: {
//                    sourceMap: 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.min.map'
                },
                files: [
                    {dest : 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.min.js', src : 'separated_core/bin/<%= pkg.name %>.<%= pkg.version %>.js' }
                ]
            },
            pack : {
                options : {
                    beautify: true
                },
                files: {
                    'separated_core/bin/tools.js': fileList
                }
            }
        },
        copy : {
            main: {
                files: [
                    {expand: true, src: ['core/**/*.js'], dest: 'test1', filter: 'isFile'}
                ]
            }
        },
        pure_cjs: {
            rad : {
                options : {
                    exports : 'RAD'
                },
                files: [
                    {src: 'entry.js', dest: 'bin/prebuild.js'}
                ]
            },
            blanks : {
                files: [
                    {src: 'bin/structure.js', dest: 'bin/<%= pkg.name %>.<%= pkg.version %>.js'}
                ]
            }
        },
        clean : {
            dev : {
                files : [
                    { src : ['bin/structure.js', 'bin/prebuild.js'] }
                ]
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-pure-cjs');

    grunt.registerTask('pack', ['concat:build']);

    grunt.registerTask('blanks', function(){
        var structure = grunt.file.readJSON('bin/structure.json'),

        content = grunt.file.read('tools.tpl', 'utf-8');
        content = grunt.template.process(content, {data : {arr : structure}});

        grunt.file.write('bin/structure.js', content);
    });

    grunt.registerTask('dev', ['pure_cjs:rad', 'blanks', 'pure_cjs:blanks', 'clean:dev']);
    grunt.registerTask('release', ['pure_cjs:rad', 'blanks', 'pure_cjs:blanks', 'uglify:build']);
};<|endoftext|>


<commit_before>/**
* direcitve.diGameBoard Module
*
* Description
*/
angular.module('direcitve.diGameBoard', [
    'service.GridService',
    'directive.diPiece'
])
.controller('GameBoardCtrl', [
    '$scope',
    'GridService',
function (
    $scope,
    GridService
){
    $scope.getGridService = function getGridService() {
        return GridService.getGridService();
    };

    $scope.isPieceOnGird = function isPieceOnGird(cell) {
        return cell;
    };
}])
.directive('diGameBoard', [
function(
){
    var GameBoard = {};

    GameBoard.controller = 'GameBoardCtrl';

    GameBoard.templateUrl = 'directives/diGameBoard/diGameBoard.tpl.html';

    GameBoard.restrict = 'A';

    GameBoard.scope = true;

    GameBoard.link = function link(scope, element, attrs) {};

    return GameBoard;
}]);<commit_msg>add the different classes to display different color in the grid.<commit_after>/**
* direcitve.diGameBoard Module
*
* Description
*/
angular.module('direcitve.diGameBoard', [
    'service.GridService',
    'directive.diPiece'
])
.controller('GameBoardCtrl', [
    '$scope',
    'GridService',
function (
    $scope,
    GridService
){
    $scope.getGridService = function getGridService() {
        return GridService.getGridService();
    };

    $scope.getFilledClass = function getFilledClass(cell) {
        if (cell.filled) {
            var pieceClass = '';
            switch(cell.shape) {
                case 0: pieceClass = 'dy-L-filled';
                    break;
                case 1: pieceClass = 'dy-O-filled';
                    break;
                case 2: pieceClass = 'dy-I-filled';
                    break;
                case 3: pieceClass = 'dy-T-filled';
                    break;
                case 4: pieceClass = 'dy-J-filled';
                    break;
                case 5: pieceClass = 'dy-S-filled';
                    break;
                case 6: pieceClass = 'dy-Z-filled';
                    break;
            }
            return pieceClass;
        }
    };
}])
.directive('diGameBoard', [
function(
){
    var GameBoard = {};

    GameBoard.controller = 'GameBoardCtrl';

    GameBoard.templateUrl = 'directives/diGameBoard/diGameBoard.tpl.html';

    GameBoard.restrict = 'A';

    GameBoard.scope = true;

    GameBoard.link = function link(scope, element, attrs) {};

    return GameBoard;
}]);<|endoftext|>


<commit_before>/*
 * DealPort
 * Copyright (c) 2014  DealPort B.V.
 *
 * This file is part of DealPort
 *
 * DealPort is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * DealPort is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with DealPort.  If not, see <http://www.gnu.org/licenses/>.
 *
 * In addition, the following supplemental terms apply, based on section 7 of
 * the GNU Affero General Public License (version 3):
 * a) Preservation of all legal notices and author attributions
 */
'use strict';

module.exports = function(grunt)
{
        grunt.initConfig({
                pkg: grunt.file.readJSON('package.json'),
                jshint: {
                        all: ['Gruntfile.js', 'lib/**/*.js'],
                        options: require('./package.json').jshintConfig
                },
                browserify: {
                        options: {
                                browserifyOptions: {
                                        debug: true
                                }
                        },
                        build: {
                                src: 'lib/browser-init.js',
                                dest: 'generated-web/bundle.js'
                        }
                },
                stylerefs: {
                        options: {
                                outputMode: 'import',
                                filter: 'less'
                        },
                        build: {
                                src: ['lib/browser-init.js'],
                                dest: 'generated-web/bundle.less'
                        }
                },
                less: {
                        options: {
                                dumpLineNumbers: 'comments',
                                sourceMap: true,
                                relativeUrls: true
                        },
                        build: {
                                src: ['generated-web/bundle.less'],
                                dest: 'generated-web/bundle.css'
                        }
                },
                compress: {
                        bundlejs: {
                                options: {
                                        mode: 'gzip',
                                        level: 9,
                                        pretty: true
                                },
                                files: [{
                                        src: ['generated-web/bundle.js'],
                                        dest: 'generated-web/bundle.js.gz'
                                }]
                        },
                        bundlecss: {
                                options: {
                                        mode: 'gzip',
                                        level: 9,
                                        pretty: true
                                },
                                files: [{
                                        src: ['generated-web/bundle.css'],
                                        dest: 'generated-web/bundle.css.gz'
                                }]
                        }
                }
        });

        grunt.task.registerTask('mongoskin-workaround', function()
        {
                // delete mongoskin/node_modules/mongodb so that it uses our mongodb version instead
                grunt.file.delete('./node_modules/mongoskin/node_modules/mongodb');
        });

        grunt.task.registerTask('primuslib', 'Generate the primus client library', function()
        {
                var fs = require('fs');
                fs.writeFileSync('generated-web/primus.js', require('./lib/primus-server')().library());
        });

        grunt.task.registerTask('companyimport', 'Import entries from the companyImport collection into company', function()
        {
                var P = require('bluebird');
                var ObjectID = require('mongodb').ObjectID;
                var model = require('./lib/model/mongo-init')(require('./lib/server-config'));

                var done = this.async();

                P.using(model.acquire(), function(db)
                {
                        return P.promisifyAll(db.companyImport.find({})).toArrayAsync()
                        .map(function(companyImport)
                        {
                                return db.company.findOneAsync({
                                        $or: [
                                                {companyImportID: companyImport._id + ''},
                                                {companyImportID: parseInt(companyImport._id, 10)}
                                        ]
                                })
                                .then(function(company)
                                {
                                        var $set = {companyImportID: companyImport._id};

                                        var keysToSet = Object.keys(companyImport).filter(function(key)
                                        {
                                                if (company &&
                                                    key in company)
                                                {
                                                        return false;
                                                }

                                                switch(key)
                                                {
                                                        case 'name':
                                                        case 'logoURL':
                                                        case 'openForInvestment':
                                                        case 'hiring':
                                                        case 'sectors':
                                                        case 'revenueModel':
                                                        case 'payoff':
                                                                return true;
                                                }

                                                return false;
                                        });

                                        keysToSet.forEach(function(key)
                                        {
                                                $set[key] = companyImport[key];
                                        });

                                        if (!company)
                                        {
                                                // new
                                                $set._v = 0;
                                                $set._type = 'http://sharejs.org/types/JSONv0';
                                                $set._m = {mtime: 0, ctime: 0};
                                        }

                                        console.info('set %s on %s', keysToSet, company && company._id);
                                        return db.company.updateAsync(
                                                {_id: company && company._id || new ObjectID().toString()},
                                                {$set: $set},
                                                {upsert: true}
                                        );
                                });
                        });
                }).nodeify(done);
        });

        grunt.loadNpmTasks('grunt-contrib-jshint');
        grunt.loadNpmTasks('grunt-browserify');
        grunt.loadNpmTasks('stylerefs');
        grunt.loadNpmTasks('grunt-contrib-less');
        grunt.loadNpmTasks('grunt-contrib-compress');

        grunt.registerTask('lint', ['jshint']);
        grunt.registerTask('no-css', ['mongoskin-workaround', 'jshint', 'primuslib', 'browserify', 'compress:bundlejs']);
        grunt.registerTask('no-lint', ['mongoskin-workaround', 'primuslib', 'browserify', 'compress:bundlejs', 'stylerefs', 'less', 'compress:bundlecss']);
        grunt.registerTask('default', ['mongoskin-workaround', 'jshint', 'primuslib', 'browserify', 'compress:bundlejs', 'stylerefs', 'less', 'compress:bundlecss']);
};<commit_msg>Only add debugging info to css and javascript bundles if debug mode is on<commit_after>/*
 * DealPort
 * Copyright (c) 2014  DealPort B.V.
 *
 * This file is part of DealPort
 *
 * DealPort is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * DealPort is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with DealPort.  If not, see <http://www.gnu.org/licenses/>.
 *
 * In addition, the following supplemental terms apply, based on section 7 of
 * the GNU Affero General Public License (version 3):
 * a) Preservation of all legal notices and author attributions
 */
'use strict';

var config = require('./lib/server-config');

module.exports = function(grunt)
{
        grunt.initConfig({
                pkg: grunt.file.readJSON('package.json'),
                jshint: {
                        all: ['Gruntfile.js', 'lib/**/*.js'],
                        options: require('./package.json').jshintConfig
                },
                browserify: {
                        options: {
                                browserifyOptions: {
                                        debug: !!config.debugMode
                                }
                        },
                        build: {
                                src: 'lib/browser-init.js',
                                dest: 'generated-web/bundle.js'
                        }
                },
                stylerefs: {
                        options: {
                                outputMode: 'import',
                                filter: 'less'
                        },
                        build: {
                                src: ['lib/browser-init.js'],
                                dest: 'generated-web/bundle.less'
                        }
                },
                less: {
                        options: {
                                dumpLineNumbers: config.debugMode ? 'comments' : false,
                                sourceMap: true,
                                relativeUrls: true
                        },
                        build: {
                                src: ['generated-web/bundle.less'],
                                dest: 'generated-web/bundle.css'
                        }
                },
                compress: {
                        bundlejs: {
                                options: {
                                        mode: 'gzip',
                                        level: 9,
                                        pretty: true
                                },
                                files: [{
                                        src: ['generated-web/bundle.js'],
                                        dest: 'generated-web/bundle.js.gz'
                                }]
                        },
                        bundlecss: {
                                options: {
                                        mode: 'gzip',
                                        level: 9,
                                        pretty: true
                                },
                                files: [{
                                        src: ['generated-web/bundle.css'],
                                        dest: 'generated-web/bundle.css.gz'
                                }]
                        }
                }
        });

        grunt.task.registerTask('mongoskin-workaround', function()
        {
                // delete mongoskin/node_modules/mongodb so that it uses our mongodb version instead
                grunt.file.delete('./node_modules/mongoskin/node_modules/mongodb');
        });

        grunt.task.registerTask('primuslib', 'Generate the primus client library', function()
        {
                var fs = require('fs');
                fs.writeFileSync('generated-web/primus.js', require('./lib/primus-server')().library());
        });

        grunt.task.registerTask('companyimport', 'Import entries from the companyImport collection into company', function()
        {
                var P = require('bluebird');
                var ObjectID = require('mongodb').ObjectID;
                var model = require('./lib/model/mongo-init')(require('./lib/server-config'));

                var done = this.async();

                P.using(model.acquire(), function(db)
                {
                        return P.promisifyAll(db.companyImport.find({})).toArrayAsync()
                        .map(function(companyImport)
                        {
                                return db.company.findOneAsync({
                                        $or: [
                                                {companyImportID: companyImport._id + ''},
                                                {companyImportID: parseInt(companyImport._id, 10)}
                                        ]
                                })
                                .then(function(company)
                                {
                                        var $set = {companyImportID: companyImport._id};

                                        var keysToSet = Object.keys(companyImport).filter(function(key)
                                        {
                                                if (company &&
                                                    key in company)
                                                {
                                                        return false;
                                                }

                                                switch(key)
                                                {
                                                        case 'name':
                                                        case 'logoURL':
                                                        case 'openForInvestment':
                                                        case 'hiring':
                                                        case 'sectors':
                                                        case 'revenueModel':
                                                        case 'payoff':
                                                                return true;
                                                }

                                                return false;
                                        });

                                        keysToSet.forEach(function(key)
                                        {
                                                $set[key] = companyImport[key];
                                        });

                                        if (!company)
                                        {
                                                // new
                                                $set._v = 0;
                                                $set._type = 'http://sharejs.org/types/JSONv0';
                                                $set._m = {mtime: 0, ctime: 0};
                                        }

                                        console.info('set %s on %s', keysToSet, company && company._id);
                                        return db.company.updateAsync(
                                                {_id: company && company._id || new ObjectID().toString()},
                                                {$set: $set},
                                                {upsert: true}
                                        );
                                });
                        });
                }).nodeify(done);
        });

        grunt.loadNpmTasks('grunt-contrib-jshint');
        grunt.loadNpmTasks('grunt-browserify');
        grunt.loadNpmTasks('stylerefs');
        grunt.loadNpmTasks('grunt-contrib-less');
        grunt.loadNpmTasks('grunt-contrib-compress');

        grunt.registerTask('lint', ['jshint']);
        grunt.registerTask('no-css', ['mongoskin-workaround', 'jshint', 'primuslib', 'browserify', 'compress:bundlejs']);
        grunt.registerTask('no-lint', ['mongoskin-workaround', 'primuslib', 'browserify', 'compress:bundlejs', 'stylerefs', 'less', 'compress:bundlecss']);
        grunt.registerTask('default', ['mongoskin-workaround', 'jshint', 'primuslib', 'browserify', 'compress:bundlejs', 'stylerefs', 'less', 'compress:bundlecss']);
};<|endoftext|>


<commit_before>import React from "react";
import PropTypes from "prop-types";

class DropdownLink extends React.PureComponent {
    render() {
        return (

                {this.props.title}

        );
    }
}

DropdownLink.propTypes = {
    title: PropTypes.string.isRequired,
};

export default DropdownLink;
<commit_msg>Todo dropdown<commit_after>import React from "react";
import PropTypes from "prop-types";

class DropdownLink extends React.PureComponent {
    render() {
        // todo make dropdown independent from jQuery (remove jQuery from index.html)
        return (

                {this.props.title}

        );
    }
}

DropdownLink.propTypes = {
    title: PropTypes.string.isRequired,
};

export default DropdownLink;
<|endoftext|>