From a4c1721e74ef2b40f744c3eeb5670feafbb850bf Mon Sep 17 00:00:00 2001 From: Chauncey McAskill Date: Mon, 11 Apr 2016 15:26:20 -0400 Subject: [PATCH] Added 'load-grunt-config' plugin The plugin replaces the custom 'loadConfig()' function with a more robust and extensible solution. It handles 'grunt.initConfig()' and 'load-grunt-tasks'. Changes: - Moved Grunt task configurations into a 'config/' sub-directory to allow room for custom plugins, modules, and tasks to be defined without being included by the config-loader; - Updated '.eslintrc' to better lint module-based JS; - Updated EditorConfig recommendations; --- .babelrc | 2 +- .editorconfig | 5 +- .eslintrc | 84 +++++++++++++++-------------- .gitignore | 16 +++++- Gruntfile.js | 80 +++++++++++---------------- build/grunt/browserSync.js | 18 ------- build/grunt/browserify.js | 30 ----------- build/grunt/concat.js | 8 --- build/grunt/config/aliases.json | 41 ++++++++++++++ build/grunt/config/browserSync.js | 18 +++++++ build/grunt/config/browserify.js | 34 ++++++++++++ build/grunt/config/concat.js | 12 +++++ build/grunt/config/csscomb.js | 15 ++++++ build/grunt/config/cssmin.js | 13 +++++ build/grunt/config/eslint.js | 11 ++++ build/grunt/{ => config}/notify.js | 14 +++-- build/grunt/{ => config}/phplint.js | 10 ++-- build/grunt/config/postcss.js | 27 ++++++++++ build/grunt/config/sass.js | 17 ++++++ build/grunt/{ => config}/svgmin.js | 10 ++-- build/grunt/config/svgstore.js | 8 +++ build/grunt/config/uglify.js | 13 +++++ build/grunt/config/watch.js | 27 ++++++++++ build/grunt/csscomb.js | 11 ---- build/grunt/cssmin.js | 10 ---- build/grunt/eslint.js | 10 ---- build/grunt/postcss.js | 19 ------- build/grunt/sass.js | 10 ---- build/grunt/svgstore.js | 10 ---- build/grunt/uglify.js | 10 ---- build/grunt/watch.js | 26 --------- package.json | 9 ++-- 32 files changed, 349 insertions(+), 279 deletions(-) delete mode 100644 build/grunt/browserSync.js delete mode 100644 build/grunt/browserify.js delete mode 100644 build/grunt/concat.js create mode 100644 build/grunt/config/aliases.json create mode 100644 build/grunt/config/browserSync.js create mode 100644 build/grunt/config/browserify.js create mode 100644 build/grunt/config/concat.js create mode 100644 build/grunt/config/csscomb.js create mode 100644 build/grunt/config/cssmin.js create mode 100644 build/grunt/config/eslint.js rename build/grunt/{ => config}/notify.js (68%) rename build/grunt/{ => config}/phplint.js (66%) create mode 100644 build/grunt/config/postcss.js create mode 100644 build/grunt/config/sass.js rename build/grunt/{ => config}/svgmin.js (75%) create mode 100644 build/grunt/config/svgstore.js create mode 100644 build/grunt/config/uglify.js create mode 100644 build/grunt/config/watch.js delete mode 100644 build/grunt/csscomb.js delete mode 100644 build/grunt/cssmin.js delete mode 100644 build/grunt/eslint.js delete mode 100644 build/grunt/postcss.js delete mode 100644 build/grunt/sass.js delete mode 100644 build/grunt/svgstore.js delete mode 100644 build/grunt/uglify.js delete mode 100644 build/grunt/watch.js diff --git a/.babelrc b/.babelrc index c13c5f6..bea32a4 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["es2015"] + "presets": [ "es2015" ] } diff --git a/.editorconfig b/.editorconfig index 06d4758..25983f0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,9 +10,6 @@ end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -[*.json,.bowerrc] -insert_final_newline = false - -[{.htaccess,.bowerrc,bower.json,package.json,component.json}] +[{*.md,.*rc,.*.json,*.yml,.editorconfig,.env,.env.*,.git*,.htaccess,.jshintignore,bower.json,composer.json,package.json}] indent_style = space indent_size = 2 diff --git a/.eslintrc b/.eslintrc index 9ce5fa2..c24dc33 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,42 +1,46 @@ { - "env": { - "browser": true, - "node": true, - "es6": true - }, - "ecmaFeatures": { - "arrowFunctions": true, - "binaryLiterals": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": true, - "modules": true, - "objectLiteralComputedProperties": true, - "objectLiteralDuplicateProperties": true, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "octalLiterals": true, - "regexUFlag": true, - "regexYFlag": true, - "spread": true, - "superInFunctions": false, - "templateStrings": true, - "unicodeCodePointEscapes": true, - "globalReturn": true, - "jsx": true - }, - "rules": { - "eqeqeq": 2, - "strict": 0, - "no-empty": 1, - "no-alert": 2, - "no-eval": 2, - "quotes": [1, "single", "avoid-escape"], - "no-trailing-spaces": [2, { "skipBlankLines": true }], - "eol-last": 0, - "yoda": [2, "never", { "exceptRange": true }] - } + "env": { + "browser": true, + "node": true, + "es6": true + }, + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "ecmaFeatures": { + "arrowFunctions": true, + "binaryLiterals": true, + "blockBindings": true, + "classes": true, + "defaultParams": true, + "destructuring": true, + "forOf": true, + "generators": true, + "modules": true, + "objectLiteralComputedProperties": true, + "objectLiteralDuplicateProperties": true, + "objectLiteralShorthandMethods": true, + "objectLiteralShorthandProperties": true, + "octalLiterals": true, + "regexUFlag": true, + "regexYFlag": true, + "spread": true, + "superInFunctions": false, + "templateStrings": true, + "unicodeCodePointEscapes": true, + "globalReturn": true, + "jsx": true + }, + "rules": { + "eqeqeq": 2, + "strict": 0, + "no-empty": 1, + "no-alert": 2, + "no-eval": 2, + "quotes": [1, "single", "avoid-escape"], + "no-trailing-spaces": [2, { "skipBlankLines": true }], + "eol-last": 0, + "yoda": [2, "never", { "exceptRange": true }] + } } diff --git a/.gitignore b/.gitignore index 153216e..3efee43 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,15 @@ -.DS_Store +# General +# ----------------- + +# Logs +logs +*.log +error_log + +# Package Managers +# ----------------- + +composer.phar +vendor/ node_modules/ -npm-debug.log +bower_components/ diff --git a/Gruntfile.js b/Gruntfile.js index 58f0bc5..1a27a40 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,55 +1,35 @@ -module.exports = function(grunt) { +/** + * Grunt Task Wrangler + * + * @copyright Copyright © 2016 Locomotive + * @license Licensed under the MIT license. + */ - function loadConfig(path) { - var glob = require('glob'); - var object = {}; - var key; +'use strict'; - glob.sync('*', {cwd: path}).forEach(function(option) { - key = option.replace(/\.js$/,''); - object[key] = require(path + option); - }); +module.exports = function (grunt) +{ + var path = require('path'); - return object; - } - - var config = { - pkg: grunt.file.readJSON('package.json') - } - - grunt.loadTasks('build/grunt'); - grunt.util._.extend(config, loadConfig('./build/grunt/')); - grunt.initConfig(config); - - // Load tasks - require('load-grunt-tasks')(grunt); - - // Register tasks - grunt.registerTask('default', ['build']); - grunt.registerTask('sync', ['browserSync', 'browserify:dev', 'watch', 'notify:watch']); - grunt.registerTask('build', [ - // CSS - 'sass', - 'postcss', - 'cssmin', - // JS - 'browserify:prod', - 'uglify', - // SVG - 'svgstore', - 'svgmin', - // Notify - 'notify:build' - ]); - grunt.registerTask('w', ['browserify:dev', 'watch', 'notify:watch']); - grunt.registerTask('c', [ - 'csscomb' - ]); - grunt.registerTask('j', [ - 'eslint' - ]); - grunt.registerTask('p', [ - 'phplint' - ]); + require('load-grunt-config')(grunt, { + configPath: path.join(process.cwd(), 'build/grunt/config'), + data: { + paths: { + grunt: 'build/grunt', + js: { + src: 'assets/scripts', + dist: 'www/assets/scripts' + }, + css: { + src: 'assets/styles', + dist: 'www/assets/styles' + }, + img: { + src: 'assets/images', + dist: 'www/assets/images' + } + } + } + }); }; diff --git a/build/grunt/browserSync.js b/build/grunt/browserSync.js deleted file mode 100644 index a8bba5d..0000000 --- a/build/grunt/browserSync.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - dev: { - bsFiles: { - src : [ - 'www/assets/styles/**/*.css' - ,'www/assets/scripts/**/*.js' - ,'www/assets/images/**/*.svg' - ,'www/**/*.php' - ] - }, - options: { - proxy: "localhost", - port: 3000, - watchTask: true, - notify: false - } - } -}; diff --git a/build/grunt/browserify.js b/build/grunt/browserify.js deleted file mode 100644 index bf48e60..0000000 --- a/build/grunt/browserify.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - dev: { - options: { - transform: [['babelify', { presets: ['es2015'] }]], - watch : true, // use watchify for incremental builds! - browserifyOptions : { - debug : true // source mapping - } - }, - files: { - 'www/assets/scripts/app.js': [ - 'assets/scripts/**/*.js', - '!assets/scripts/vendors/*.js' - ] - } - }, - prod: { - options: { - transform: [['babelify', { presets: ['es2015'] }]], - browserifyOptions: { debug: false }, - exclude: '' - }, - files: { - 'www/assets/scripts/app.js': [ - 'assets/scripts/**/*.js', - '!assets/scripts/vendors/*.js' - ] - } - } -}; diff --git a/build/grunt/concat.js b/build/grunt/concat.js deleted file mode 100644 index 1f58eb0..0000000 --- a/build/grunt/concat.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - vendors: { - src: [ - 'assets/scripts/vendors/*.js' - ], - dest: 'www/assets/scripts/vendors.js' - } -}; diff --git a/build/grunt/config/aliases.json b/build/grunt/config/aliases.json new file mode 100644 index 0000000..ab2c3cb --- /dev/null +++ b/build/grunt/config/aliases.json @@ -0,0 +1,41 @@ +{ + "default": [ + "build" + ], + + "sync": [ + "browserSync", + "browserify:dev", + "watch", + "notify:watch" + ], + + "build": [ + "sass", + "postcss", + "cssmin", + "browserify:prod", + "uglify", + "svgstore", + "svgmin", + "notify:build" + ], + + "w": [ + "browserify:dev", + "watch", + "notify:watch" + ], + + "c": [ + "csscomb" + ], + + "j": [ + "eslint" + ], + + "p": [ + "phplint" + ] +} diff --git a/build/grunt/config/browserSync.js b/build/grunt/config/browserSync.js new file mode 100644 index 0000000..652c649 --- /dev/null +++ b/build/grunt/config/browserSync.js @@ -0,0 +1,18 @@ +module.exports = { + options: { + proxy : 'localhost', + port : 3000, + watchTask : true, + notify : false + }, + dev: { + bsFiles: { + src : [ + '<%= paths.css.dist %>/**/*.css', + '<%= paths.js.dist %>/**/*.js', + '<%= paths.img.dist %>/**/*.svg', + '**/*.php' + ] + } + } +}; diff --git a/build/grunt/config/browserify.js b/build/grunt/config/browserify.js new file mode 100644 index 0000000..be8b7c8 --- /dev/null +++ b/build/grunt/config/browserify.js @@ -0,0 +1,34 @@ +module.exports = { + options: { + browserifyOptions: { + debug: false + }, + exclude: "", + transform: [ + [ 'babelify', { presets: [ 'es2015' ] } ] + ] + }, + dev: { + options: { + browserifyOptions: { + debug: true + }, + watch: true + }, + src: [ + '<%= paths.js.src %>/**/*.js', + '!<%= paths.js.src %>/vendors/**/*.js' + ], + dest: '<%= paths.js.dist %>/app.js' + }, + prod: { + options: { + banner: '/*! <%= package.title %> - <%= grunt.template.today("yyyy-mm-dd") %> */\n' + }, + src: [ + '<%= paths.js.src %>/**/*.js', + '!<%= paths.js.src %>/vendors/**/*.js' + ], + dest: '<%= paths.js.dist %>/app.js' + } +}; diff --git a/build/grunt/config/concat.js b/build/grunt/config/concat.js new file mode 100644 index 0000000..2690861 --- /dev/null +++ b/build/grunt/config/concat.js @@ -0,0 +1,12 @@ +module.exports = { + options: { + stripBanners: true + }, + prod: { + options: { + banner: '/*! Dependencies for <%= package.title %> - <%= grunt.template.today("yyyy-mm-dd") %> */\n' + }, + src : [ '<%= paths.js.src %>/vendors/**/*.js' ], + dest : '<%= paths.js.dist %>/vendors.js' + } +}; diff --git a/build/grunt/config/csscomb.js b/build/grunt/config/csscomb.js new file mode 100644 index 0000000..ef10ae8 --- /dev/null +++ b/build/grunt/config/csscomb.js @@ -0,0 +1,15 @@ +module.exports = { + options: { + config: '.csscomb.json' + }, + dev: { + files: [ + { + expand : true, + cwd : '<%= paths.css.src %>', + src : [ '**/*.scss', '!base/_fonts.scss' ], + dest : '<%= paths.css.src %>' + } + ] + } +}; diff --git a/build/grunt/config/cssmin.js b/build/grunt/config/cssmin.js new file mode 100644 index 0000000..9cb4286 --- /dev/null +++ b/build/grunt/config/cssmin.js @@ -0,0 +1,13 @@ +module.exports = { + options: {}, + prod: { + files: [ + { + expand : true, + cwd : '<%= paths.css.dist %>', + src : [ '**/*.css', '!**/*.min.css' ], + dest : '<%= paths.css.dist %>' + } + ] + } +}; diff --git a/build/grunt/config/eslint.js b/build/grunt/config/eslint.js new file mode 100644 index 0000000..0e90f5b --- /dev/null +++ b/build/grunt/config/eslint.js @@ -0,0 +1,11 @@ +module.exports = { + options: { + quiet : false, + format : require('eslint-tap'), + configFile : '.eslintrc' + }, + dev: [ + '<%= paths.js.src %>/**/*.js', + '!<%= paths.js.src %>/vendors/**/*.js' + ] +}; diff --git a/build/grunt/notify.js b/build/grunt/config/notify.js similarity index 68% rename from build/grunt/notify.js rename to build/grunt/config/notify.js index c89ecb0..8f0ea0a 100644 --- a/build/grunt/notify.js +++ b/build/grunt/config/notify.js @@ -1,31 +1,35 @@ module.exports = { + notify_hooks: { + options: { + enabled : true, + success : true, + duration : 3, + title : '<%= package.name %>', + max_jshint_notifications : 5 + } + }, watch: { options: { - // title: '<%= pkg.title %>', message: 'Keeping an eye out, Chief!' } }, build: { options: { - // title: '<%= pkg.title %>', message: 'Everything is ready to go!' } }, sass: { options: { - // title: '<%= pkg.title %>', message: 'CSS is compiled' } }, javascript: { options: { - // title: '<%= pkg.title %>', message: 'JavaScript is compiled' } }, svg: { options: { - // title: '<%= pkg.title %>', message: 'SVG is concatenated' } } diff --git a/build/grunt/phplint.js b/build/grunt/config/phplint.js similarity index 66% rename from build/grunt/phplint.js rename to build/grunt/config/phplint.js index ac8fa4a..d8c4ad1 100644 --- a/build/grunt/phplint.js +++ b/build/grunt/config/phplint.js @@ -1,14 +1,12 @@ module.exports = { options: { - swapPath: '/tmp', - phpArgs : { + swapPath : '/tmp', + phpArgs : { // add -f for fatal errors '-lf': null } }, - - project: [ + dev: [ '**/*.php' ] -} -; +}; diff --git a/build/grunt/config/postcss.js b/build/grunt/config/postcss.js new file mode 100644 index 0000000..ff195af --- /dev/null +++ b/build/grunt/config/postcss.js @@ -0,0 +1,27 @@ +module.exports = function (grunt, options) +{ + return { + options: { + map: false, + processors: [ + require('autoprefixer')({ + browsers: [ 'last 2 versions', '> 1%', 'ie >= 9' ] + }), + require('postcss-banner')({ + banner: grunt.template.process('! <%= package.title %> - <%= grunt.template.today("yyyy-mm-dd") %> ', { data: options }) + }) + ] + }, + prod: { + files: [ + { + expand : true, + flatten : true, + cwd : '<%= paths.css.dist %>', + src : [ '**/*.css', '!**/*.min.css' ], + dest : '<%= paths.css.dist %>' + } + ] + } + } +}; diff --git a/build/grunt/config/sass.js b/build/grunt/config/sass.js new file mode 100644 index 0000000..5423326 --- /dev/null +++ b/build/grunt/config/sass.js @@ -0,0 +1,17 @@ +module.exports = { + options: { + sourceMap : false, + outputStyle : 'expanded' + }, + prod: { + files: [ + { + expand : true, + cwd : '<%= paths.css.src %>', + src : [ '**/*.scss' ], + dest : '<%= paths.css.dist %>', + ext : '.css' + } + ] + } +}; diff --git a/build/grunt/svgmin.js b/build/grunt/config/svgmin.js similarity index 75% rename from build/grunt/svgmin.js rename to build/grunt/config/svgmin.js index ac00f17..4f24572 100644 --- a/build/grunt/svgmin.js +++ b/build/grunt/config/svgmin.js @@ -14,11 +14,9 @@ module.exports = { ] }, dist: { - expand: true, - cwd: 'www/assets/images/', - src: '*.svg', - dest: 'www/assets/images/', - ext: '.svg', - extDot: 'first' + expand : true, + cwd : '<%= paths.img.dist %>', + src : '*.svg', + dest : '<%= paths.img.dist %>' } }; diff --git a/build/grunt/config/svgstore.js b/build/grunt/config/svgstore.js new file mode 100644 index 0000000..7e52d7e --- /dev/null +++ b/build/grunt/config/svgstore.js @@ -0,0 +1,8 @@ +module.exports = { + options: {}, + prod: { + files: { + '<%= paths.img.dist %>/sprite.svg': [ '<%= paths.img.src %>/sprite/*.svg' ] + } + } +}; diff --git a/build/grunt/config/uglify.js b/build/grunt/config/uglify.js new file mode 100644 index 0000000..a5b2c0d --- /dev/null +++ b/build/grunt/config/uglify.js @@ -0,0 +1,13 @@ +module.exports = { + options: {}, + prod: { + files: [ + { + expand : true, + cwd : '<%= paths.js.dist %>', + src : [ '**/*.js', '!**/*.min.js' ], + dest : '<%= paths.js.dist %>' + } + ] + } +}; diff --git a/build/grunt/config/watch.js b/build/grunt/config/watch.js new file mode 100644 index 0000000..06132ed --- /dev/null +++ b/build/grunt/config/watch.js @@ -0,0 +1,27 @@ +module.exports = { + options: { + spawn: false, + livereload: false + }, + javascript_vendors: { + files: [ '<%= paths.js.src %>/vendors/**/*.js' ], + tasks: [ 'concat:vendors', 'notify:javascript' ] + }, + sass: { + files: [ '<%= paths.css.src %>/**/*.scss' ], + tasks: [ 'sass', 'postcss', 'notify:sass' ] + }, + svg: { + files: [ '<%= paths.img.src %>/**/*.svg' ], + tasks: [ 'svgstore', 'notify:svg' ] + }, + tasks: { + options: { + reload: true + }, + files: [ + 'Gruntfile.js', + '<%= paths.grunt %>/**/*' + ] + } +}; diff --git a/build/grunt/csscomb.js b/build/grunt/csscomb.js deleted file mode 100644 index f4e4991..0000000 --- a/build/grunt/csscomb.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - options: { - config: '.csscomb.json' - }, - build: { - expand: true, - cwd: 'assets/styles/', - src: ['**/*.scss', '!base/_fonts.scss'], - dest: 'assets/styles/' - } -}; diff --git a/build/grunt/cssmin.js b/build/grunt/cssmin.js deleted file mode 100644 index f08a820..0000000 --- a/build/grunt/cssmin.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - combine: { - files: [{ - expand: true, - cwd: 'www/assets/styles/', - src: '*.css', - dest: 'www/assets/styles/' - }] - } -}; diff --git a/build/grunt/eslint.js b/build/grunt/eslint.js deleted file mode 100644 index 93c440d..0000000 --- a/build/grunt/eslint.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - options: { - format: require('eslint-tap'), - configFile: '.eslintrc' - }, - target: [ - 'assets/scripts/**/*.js', - '!assets/scripts/vendors/*.js' - ], -}; diff --git a/build/grunt/postcss.js b/build/grunt/postcss.js deleted file mode 100644 index ae903f4..0000000 --- a/build/grunt/postcss.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - postcss: { - options: { - processors: [ - require('autoprefixer')({ - browsers: ['last 2 versions', '> 1%', 'ie >= 9'] - }), - ] - }, - files: [ - { - src : ['www/assets/styles/*.css'], - dest : 'www/assets/styles/', - expand : true, - flatten : true - } - ] - } -}; diff --git a/build/grunt/sass.js b/build/grunt/sass.js deleted file mode 100644 index 8a5eeff..0000000 --- a/build/grunt/sass.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - options: { - sourceMap: false - }, - dist: { - files: { - 'www/assets/styles/main.css': 'assets/styles/main.scss' - } - } -}; diff --git a/build/grunt/svgstore.js b/build/grunt/svgstore.js deleted file mode 100644 index a96d8c0..0000000 --- a/build/grunt/svgstore.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - options: { - - }, - default : { - files: { - 'www/assets/images/sprite.svg': ['assets/images/sprite/*.svg'], - } - } -}; diff --git a/build/grunt/uglify.js b/build/grunt/uglify.js deleted file mode 100644 index 46def23..0000000 --- a/build/grunt/uglify.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - target: { - files: [{ - expand: true, - cwd: 'www/assets/scripts/', - src: '**/*.js', - dest: 'www/assets/scripts/' - }] - } -}; diff --git a/build/grunt/watch.js b/build/grunt/watch.js deleted file mode 100644 index b5872c0..0000000 --- a/build/grunt/watch.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - javascript_vendors: { - files: [ - 'assets/scripts/vendors/*.js' - ], - tasks: ['concat:vendors', 'notify:javascript'] - }, - sass: { - files: ['assets/styles/**/*.scss'], - tasks: ['sass', 'postcss', 'notify:sass'], - options: { - spawn: false, - livereload: true - } - }, - svg: { - files: ['assets/images/**/*.svg'], - tasks: ['svgstore', 'notify:svg'] - }, - tasks: { - files: ['build/grunt/*.js'], - options: { - reload: true - } - } -}; diff --git a/package.json b/package.json index e57922f..c75b216 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,7 @@ { - "name": "boilerplate", + "private": true, + "name": "@locomotivemtl/boilerplate", + "title": "Locomotive Boilerplate", "version": "1.0.0", "author": "Locomotive ", "devDependencies": { @@ -12,7 +14,7 @@ "grunt-browser-sync": "2.2.0", "grunt-browserify": "4.0.1", "grunt-contrib-concat": "1.0.0", - "grunt-contrib-cssmin": "1.0.0", + "grunt-contrib-cssmin": "^1.0.1", "grunt-contrib-uglify": "1.0.0", "grunt-contrib-watch": "0.6.1", "grunt-csscomb": "3.1.0", @@ -23,6 +25,7 @@ "grunt-sass": "1.1.0", "grunt-svgmin": "3.1.2", "grunt-svgstore": "1.0.0", - "load-grunt-tasks": "3.4.1" + "load-grunt-config": "^0.19.1", + "postcss-banner": "^1.2.0" } }