Browse Source

Modularize grunt tasks

Rashid Khan 12 years ago
parent
commit
ec964a13b9

+ 13 - 378
Gruntfile.js

@@ -7,390 +7,25 @@ module.exports = function (grunt) {
     srcDir: 'src',
     srcDir: 'src',
     destDir: 'dist',
     destDir: 'dist',
     tempDir: 'tmp',
     tempDir: 'tmp',
-    meta: {
-      banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
-        '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
-        '<%= pkg.homepage ? " * " + pkg.homepage + "\\n" : "" %>' +
-        ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
-        ' Licensed <%= pkg.license %> */\n\n'
-    },
-    clean: {
-      on_start: ['<%= destDir %>', '<%= tempDir %>'],
-      temp: ['<%= tempDir %>'],
-    },
-    less: {
-      // this is the only task, other than copy, that runs on the src directory, since we don't really need
-      // the less files in the dist. Everything else runs from on temp, and require copys everything
-      // from temp -> dist
-      dist:{
-        expand: true,
-        cwd:'<%= srcDir %>/vendor/bootstrap/less/',
-        src: ['bootstrap.dark.less', 'bootstrap.light.less'],
-        dest: '<%= tempDir %>/css/',
-      },
-      // Compile in place when not building
-      src:{
-        options: {
-          paths: ["<%= srcDir %>/vendor/bootstrap/less"],
-          yuicompress:true
-        },
-        files: {
-          "<%= srcDir %>/css/bootstrap.dark.min.css": "<%= srcDir %>/vendor/bootstrap/less/bootstrap.dark.less",
-          "<%= srcDir %>/css/bootstrap.light.min.css": "<%= srcDir %>/vendor/bootstrap/less/bootstrap.light.less"
-        }
-      }
-    },
-    copy: {
-      // copy source to temp, we will minify in place for the dist build
-      everything_but_less_to_temp: {
-        cwd: '<%= srcDir %>',
-        expand: true,
-        src: ['**/*', '!**/*.less'],
-        dest: '<%= tempDir %>'
-      }
-    },
-    jshint: {
-      // just lint the source dir
-      source: {
-        files: {
-          src: ['Gruntfile.js', '<%= srcDir %>/app/**/*.js']
-        }
-      },
-      options: {
-        jshintrc: '.jshintrc'
-      }
-    },
-    htmlmin:{
-      build: {
-        options:{
-          removeComments: true,
-          collapseWhitespace: true
-        },
-        expand: true,
-        cwd: '<%= tempDir %>',
-        src: [
-          'index.html',
-          'app/panels/**/*.html',
-          'app/partials/**/*.html'
-        ],
-        dest: '<%= tempDir %>'
-      }
-    },
-    cssmin: {
-      build: {
-        expand: true,
-        cwd: '<%= tempDir %>',
-        src: '**/*.css',
-        dest: '<%= tempDir %>'
-      }
-    },
-    ngmin: {
-      build: {
-        expand:true,
-        cwd:'<%= tempDir %>',
-        src: [
-          'app/controllers/**/*.js',
-          'app/directives/**/*.js',
-          'app/services/**/*.js',
-          'app/filters/**/*.js',
-          'app/panels/**/*.js',
-          'app/app.js',
-          'vendor/angular/**/*.js',
-          'vendor/elasticjs/elastic-angular-client.js'
-        ],
-        dest: '<%= tempDir %>'
-      }
-    },
-    requirejs: {
-      build: {
-        options: {
-          appDir: '<%= tempDir %>',
-          dir: '<%= destDir %>',
-
-          mainConfigFile: '<%= tempDir %>/app/components/require.config.js',
-          modules: [], // populated below
-
-          optimize: 'none',
-          optimizeCss: 'none',
-          optimizeAllPluginResources: false,
-
-          removeCombined: true,
-          findNestedDependencies: true,
-          normalizeDirDefines: 'all',
-          inlineText: true,
-          skipPragmas: true,
-
-          done: function (done, output) {
-            var duplicates = require('rjs-build-analysis').duplicates(output);
-
-            if (duplicates.length > 0) {
-              grunt.log.subhead('Duplicates found in requirejs build:');
-              grunt.log.warn(duplicates);
-              done(new Error('r.js built duplicate modules, please check the excludes option.'));
-            }
-
-            done();
-          }
-        }
-      }
-    },
-    uglify: {
-      dest: {
-        expand: true,
-        src: ['**/*.js', '!config.js', '!app/dashboards/*.js'],
-        dest: '<%= destDir %>',
-        cwd: '<%= destDir %>',
-        options: {
-          quite: true,
-          compress: true,
-          preserveComments: false,
-          banner: '<%= meta.banner %>'
-        }
-      }
-    },
-    'git-describe': {
-      me: {
-        // Target-specific file lists and/or options go here.
-      },
-    },
-    compress: {
-      zip: {
-        options: {
-          archive: '<%= tempDir %>/<%= pkg.name %>-latest.zip'
-        },
-        files : [
-          {
-            expand: true,
-            cwd: '<%= destDir %>',
-            src: ['**/*'],
-            dest: '<%= pkg.name %>-latest'
-          },
-          {
-            expand: true,
-            src: ['LICENSE.md', 'README.md'],
-            dest: '<%= pkg.name %>-latest'
-          }
-        ]
-      },
-      tgz: {
-        options: {
-          archive: '<%= tempDir %>/<%= pkg.name %>-latest.tar.gz'
-        },
-        files : [
-          {
-            expand: true,
-            cwd: '<%= destDir %>',
-            src: ['**/*'],
-            dest: '<%= pkg.name %>-latest'
-          },
-          {
-            expand: true,
-            src: ['LICENSE.md', 'README.md'],
-            dest: '<%= pkg.name %>-latest'
-          }
-        ]
-      },
-      zip_release: {
-        options: {
-          archive: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.zip'
-        },
-        files : [
-          {
-            expand: true,
-            cwd: '<%= destDir %>',
-            src: ['**/*'],
-            dest: '<%= pkg.name %>-<%= pkg.version %>'
-          },
-          {
-            expand: true,
-            src: ['LICENSE.md', 'README.md'],
-            dest: '<%= pkg.name %>-<%= pkg.version %>'
-          }
-        ]
-      },
-      tgz_release: {
-        options: {
-          archive: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.tar.gz'
-        },
-        files : [
-          {
-            expand: true,
-            cwd: '<%= destDir %>',
-            src: ['**/*'],
-            dest: '<%= pkg.name %>-<%= pkg.version %>'
-          },
-          {
-            expand: true,
-            src: ['LICENSE.md', 'README.md'],
-            dest: '<%= pkg.name %>-<%= pkg.version %>'
-          }
-        ]
-      }
-    },
-    s3: {
-      dist: {
-        bucket: 'download.elasticsearch.org',
-        access: 'private',
-        // debug: true, // uncommment to prevent actual upload
-        upload: [
-          {
-            src: '<%= tempDir %>/<%= pkg.name %>-latest.zip',
-            dest: 'kibana/kibana/<%= pkg.name %>-latest.zip',
-          },
-          {
-            src: '<%= tempDir %>/<%= pkg.name %>-latest.tar.gz',
-            dest: 'kibana/kibana/<%= pkg.name %>-latest.tar.gz',
-          }
-        ]
-      },
-      release: {
-        bucket: 'download.elasticsearch.org',
-        access: 'private',
-        // debug: true, // uncommment to prevent actual upload
-        upload: [
-          {
-            src: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.zip',
-            dest: 'kibana/kibana/<%= pkg.name %>-<%= pkg.version %>.zip',
-          },
-          {
-            src: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.tar.gz',
-            dest: 'kibana/kibana/<%= pkg.name %>-<%= pkg.version %>.tar.gz',
-          }
-        ]
-      }
-    }
   };
   };
 
 
-  // setup the modules require will build
-  var requireModules = config.requirejs.build.options.modules = [
-    {
-      // main/common module
-      name: 'app',
-      include: [
-        'css',
-        'kbn',
-        'text',
-        'jquery',
-        'angular',
-        'settings',
-        'bootstrap',
-        'modernizr',
-        'elasticjs',
-        'timepicker',
-        'datepicker',
-        'underscore',
-        'filters/all',
-        'jquery.flot',
-        'services/all',
-        'angular-strap',
-        'directives/all',
-        'jquery.flot.pie',
-        'angular-sanitize',
-        'angular-dragdrop'
-      ]
-    }
-  ];
-
-  // create a module for each directory in src/app/panels/
-  require('fs')
-    .readdirSync(config.srcDir+'/app/panels')
-    .forEach(function (panelName) {
-      requireModules.push({
-        name: 'panels/'+panelName+'/module',
-        exclude: ['app']
-      });
-    });
-
-  // exclude the literal config definition from all modules
-  requireModules
-    .forEach(function (module) {
-      module.excludeShallow = module.excludeShallow || [];
-      module.excludeShallow.push('config');
-    });
-
-  // Run jshint
-  grunt.registerTask('default', ['jshint:source', 'less:src']);
-
-  // Concat and Minify the src directory into dist
-  grunt.registerTask('build', [
-    'jshint:source',
-    'clean:on_start',
-    'less:dist',
-    'copy:everything_but_less_to_temp',
-    'htmlmin:build',
-    'cssmin:build',
-    'ngmin:build',
-    'requirejs:build',
-    'clean:temp',
-    'build:write_revision',
-    'uglify:dest'
-  ]);
-
-  // run a string replacement on the require config, using the latest revision number as the cache buster
-  grunt.registerTask('build:write_revision', function() {
-    grunt.event.once('git-describe', function (desc) {
-      grunt.config('string-replace.config', {
-        src: '<%= destDir %>/app/components/require.config.js',
-        dest: '<%= destDir %>/app/components/require.config.js',
-        options: {
-          replacements: [
-            {
-              pattern: /(?:^|\/\/)(.*)@REV@/,
-              replacement: '$1'+desc.object
-            }
-          ]
-        }
-      });
-
-      grunt.task.run('string-replace:config');
-    });
-    grunt.task.run('git-describe');
-  });
-
-  // build, then zip and upload to s3
-  grunt.registerTask('distribute', [
-    'distribute:load_s3_config',
-    'build',
-    'compress:zip',
-    'compress:tgz',
-    's3:dist',
-    'clean:temp'
-  ]);
+  // load plugins
+  require('load-grunt-tasks')(grunt);
 
 
-  // build, then zip and upload to s3
-  grunt.registerTask('release', [
-    'distribute:load_s3_config',
-    'build',
-    'compress:zip_release',
-    'compress:tgz_release',
-    's3:release',
-    'clean:temp'
-  ]);
+  // load task definitions
+  grunt.loadTasks('tasks');
 
 
-  // collect the key and secret from the .aws-config.json file, finish configuring the s3 task
-  grunt.registerTask('distribute:load_s3_config', function () {
-    var config = grunt.file.readJSON('.aws-config.json');
-    grunt.config('s3.options', {
-      key: config.key,
-      secret: config.secret
+  // Utility function to load plugin configurations into an object
+  function loadConfig(path) {
+    var object = {};
+    require('glob').sync('*', {cwd: path}).forEach(function(option) {
+      object[option.replace(/\.js$/,'')] = require(path + option)(config);
     });
     });
-  });
-
-  // load plugins
-  grunt.loadNpmTasks('grunt-s3');
-  grunt.loadNpmTasks('grunt-ngmin');
-  grunt.loadNpmTasks('grunt-contrib-copy');
-  grunt.loadNpmTasks('grunt-contrib-less');
-  grunt.loadNpmTasks('grunt-git-describe');
-  grunt.loadNpmTasks('grunt-contrib-clean');
-  grunt.loadNpmTasks('grunt-contrib-jshint');
-  grunt.loadNpmTasks('grunt-contrib-cssmin');
-  grunt.loadNpmTasks('grunt-contrib-uglify');
-  grunt.loadNpmTasks('grunt-string-replace');
-  grunt.loadNpmTasks('grunt-contrib-htmlmin');
-  grunt.loadNpmTasks('grunt-contrib-requirejs');
-  grunt.loadNpmTasks('grunt-contrib-compress');
+    return object;
+  }
 
 
+  // Merge that object with what with whatever we have here
+  grunt.util._.extend(config, loadConfig('./tasks/options/'));
 
 
   // pass the config to grunt
   // pass the config to grunt
   grunt.initConfig(config);
   grunt.initConfig(config);

+ 3 - 1
package.json

@@ -26,7 +26,9 @@
     "grunt-contrib-requirejs": "~0.4.1",
     "grunt-contrib-requirejs": "~0.4.1",
     "grunt-angular-templates": "~0.3.12",
     "grunt-angular-templates": "~0.3.12",
     "grunt-contrib-compress": "~0.5.2",
     "grunt-contrib-compress": "~0.5.2",
-    "grunt-contrib-uglify": "~0.2.4"
+    "grunt-contrib-uglify": "~0.2.4",
+    "load-grunt-tasks": "~0.2.0",
+    "glob": "~3.2.7"
   },
   },
   "license": "Apache License"
   "license": "Apache License"
 }
 }

+ 38 - 0
tasks/build_task.js

@@ -0,0 +1,38 @@
+module.exports = function(grunt) {
+
+  // Concat and Minify the src directory into dist
+  grunt.registerTask('build', [
+    'jshint:source',
+    'clean:on_start',
+    'less:dist',
+    'copy:everything_but_less_to_temp',
+    'htmlmin:build',
+    'cssmin:build',
+    'ngmin:build',
+    'requirejs:build',
+    'clean:temp',
+    'build:write_revision',
+    'uglify:dest'
+  ]);
+
+  // run a string replacement on the require config, using the latest revision number as the cache buster
+  grunt.registerTask('build:write_revision', function() {
+    grunt.event.once('git-describe', function (desc) {
+      grunt.config('string-replace.config', {
+        src: '<%= destDir %>/app/components/require.config.js',
+        dest: '<%= destDir %>/app/components/require.config.js',
+        options: {
+          replacements: [
+            {
+              pattern: /(?:^|\/\/)(.*)@REV@/,
+              replacement: '$1'+desc.object
+            }
+          ]
+        }
+      });
+
+      grunt.task.run('string-replace:config');
+    });
+    grunt.task.run('git-describe');
+  });
+}

+ 4 - 0
tasks/default_task.js

@@ -0,0 +1,4 @@
+// Lint and build CSS
+module.exports = function(grunt) {
+  grunt.registerTask('default', ['jshint:source', 'less:src']);
+};

+ 31 - 0
tasks/distribute_task.js

@@ -0,0 +1,31 @@
+module.exports = function(grunt) {
+
+  // build, then zip and upload to s3
+  grunt.registerTask('distribute', [
+    'distribute:load_s3_config',
+    'build',
+    'compress:zip',
+    'compress:tgz',
+    's3:dist',
+    'clean:temp'
+  ]);
+
+  // build, then zip and upload to s3
+  grunt.registerTask('release', [
+    'distribute:load_s3_config',
+    'build',
+    'compress:zip_release',
+    'compress:tgz_release',
+    's3:release',
+    'clean:temp'
+  ]);
+
+  // collect the key and secret from the .aws-config.json file, finish configuring the s3 task
+  grunt.registerTask('distribute:load_s3_config', function () {
+    var config = grunt.file.readJSON('.aws-config.json');
+    grunt.config('s3.options', {
+      key: config.key,
+      secret: config.secret
+    });
+  });
+}

+ 6 - 0
tasks/options/clean.js

@@ -0,0 +1,6 @@
+module.exports = function(config) {
+  return {
+    on_start: ['<%= destDir %>', '<%= tempDir %>'],
+    temp: ['<%= tempDir %>'],
+  };
+};

+ 76 - 0
tasks/options/compress.js

@@ -0,0 +1,76 @@
+module.exports = function(config) {
+  return {
+    zip: {
+      options: {
+        archive: '<%= tempDir %>/<%= pkg.name %>-latest.zip'
+      },
+      files : [
+        {
+          expand: true,
+          cwd: '<%= destDir %>',
+          src: ['**/*'],
+          dest: '<%= pkg.name %>-latest'
+        },
+        {
+          expand: true,
+          src: ['LICENSE.md', 'README.md'],
+          dest: '<%= pkg.name %>-latest'
+        }
+      ]
+    },
+    tgz: {
+      options: {
+        archive: '<%= tempDir %>/<%= pkg.name %>-latest.tar.gz'
+      },
+      files : [
+        {
+          expand: true,
+          cwd: '<%= destDir %>',
+          src: ['**/*'],
+          dest: '<%= pkg.name %>-latest'
+        },
+        {
+          expand: true,
+          src: ['LICENSE.md', 'README.md'],
+          dest: '<%= pkg.name %>-latest'
+        }
+      ]
+    },
+    zip_release: {
+      options: {
+        archive: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.zip'
+      },
+      files : [
+        {
+          expand: true,
+          cwd: '<%= destDir %>',
+          src: ['**/*'],
+          dest: '<%= pkg.name %>-<%= pkg.version %>'
+        },
+        {
+          expand: true,
+          src: ['LICENSE.md', 'README.md'],
+          dest: '<%= pkg.name %>-<%= pkg.version %>'
+        }
+      ]
+    },
+    tgz_release: {
+      options: {
+        archive: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.tar.gz'
+      },
+      files : [
+        {
+          expand: true,
+          cwd: '<%= destDir %>',
+          src: ['**/*'],
+          dest: '<%= pkg.name %>-<%= pkg.version %>'
+        },
+        {
+          expand: true,
+          src: ['LICENSE.md', 'README.md'],
+          dest: '<%= pkg.name %>-<%= pkg.version %>'
+        }
+      ]
+    }
+  };
+};

+ 11 - 0
tasks/options/copy.js

@@ -0,0 +1,11 @@
+module.exports = function(config) {
+  return {
+    // copy source to temp, we will minify in place for the dist build
+    everything_but_less_to_temp: {
+      cwd: '<%= srcDir %>',
+      expand: true,
+      src: ['**/*', '!**/*.less'],
+      dest: '<%= tempDir %>'
+    }
+  };
+};

+ 10 - 0
tasks/options/cssmin.js

@@ -0,0 +1,10 @@
+module.exports = function(config) {
+  return {
+    build: {
+      expand: true,
+      cwd: '<%= tempDir %>',
+      src: '**/*.css',
+      dest: '<%= tempDir %>'
+    }
+  };
+};

+ 7 - 0
tasks/options/git-describe.js

@@ -0,0 +1,7 @@
+module.exports = function(config) {
+  return {
+    me: {
+      // Target-specific file lists and/or options go here.
+    }
+  };
+};

+ 18 - 0
tasks/options/htmlmin.js

@@ -0,0 +1,18 @@
+module.exports = function(config) {
+  return {
+    build: {
+      options:{
+        removeComments: true,
+        collapseWhitespace: true
+      },
+      expand: true,
+      cwd: '<%= tempDir %>',
+      src: [
+        'index.html',
+        'app/panels/**/*.html',
+        'app/partials/**/*.html'
+      ],
+      dest: '<%= tempDir %>'
+    }
+  };
+};

+ 13 - 0
tasks/options/jshint.js

@@ -0,0 +1,13 @@
+module.exports = function(config) {
+  return {
+    // just lint the source dir
+    source: {
+      files: {
+        src: ['Gruntfile.js', '<%= srcDir %>/app/**/*.js']
+      }
+    },
+    options: {
+      jshintrc: '.jshintrc'
+    }
+  };
+};

+ 24 - 0
tasks/options/less.js

@@ -0,0 +1,24 @@
+module.exports = function(config) {
+  return {
+    // this is the only task, other than copy, that runs on the src directory, since we don't really need
+    // the less files in the dist. Everything else runs from on temp, and require copys everything
+    // from temp -> dist
+    dist:{
+      expand: true,
+      cwd:'<%= srcDir %>/vendor/bootstrap/less/',
+      src: ['bootstrap.dark.less', 'bootstrap.light.less'],
+      dest: '<%= tempDir %>/css/',
+    },
+    // Compile in place when not building
+    src:{
+      options: {
+        paths: ["<%= srcDir %>/vendor/bootstrap/less"],
+        yuicompress:true
+      },
+      files: {
+        "<%= srcDir %>/css/bootstrap.dark.min.css": "<%= srcDir %>/vendor/bootstrap/less/bootstrap.dark.less",
+        "<%= srcDir %>/css/bootstrap.light.min.css": "<%= srcDir %>/vendor/bootstrap/less/bootstrap.light.less"
+      }
+    }
+  };
+};

+ 9 - 0
tasks/options/meta.js

@@ -0,0 +1,9 @@
+module.exports = function(config) {
+  return {
+    banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
+    '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
+    '<%= pkg.homepage ? " * " + pkg.homepage + "\\n" : "" %>' +
+    ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
+    ' Licensed <%= pkg.license %> */\n\n'
+  };
+};

+ 19 - 0
tasks/options/ngmin.js

@@ -0,0 +1,19 @@
+module.exports = function(config) {
+  return {
+    build: {
+      expand:true,
+      cwd:'<%= tempDir %>',
+      src: [
+        'app/controllers/**/*.js',
+        'app/directives/**/*.js',
+        'app/services/**/*.js',
+        'app/filters/**/*.js',
+        'app/panels/**/*.js',
+        'app/app.js',
+        'vendor/angular/**/*.js',
+        'vendor/elasticjs/elastic-angular-client.js'
+      ],
+      dest: '<%= tempDir %>'
+    }
+  };
+};

+ 84 - 0
tasks/options/requirejs.js

@@ -0,0 +1,84 @@
+module.exports = function(config) {
+  var _c = {
+    build: {
+      options: {
+        appDir: '<%= tempDir %>',
+        dir: '<%= destDir %>',
+
+        mainConfigFile: '<%= tempDir %>/app/components/require.config.js',
+        modules: [], // populated below
+
+        optimize: 'none',
+        optimizeCss: 'none',
+        optimizeAllPluginResources: false,
+
+        removeCombined: true,
+        findNestedDependencies: true,
+        normalizeDirDefines: 'all',
+        inlineText: true,
+        skipPragmas: true,
+
+        done: function (done, output) {
+          var duplicates = require('rjs-build-analysis').duplicates(output);
+
+          if (duplicates.length > 0) {
+            grunt.log.subhead('Duplicates found in requirejs build:');
+            grunt.log.warn(duplicates);
+            done(new Error('r.js built duplicate modules, please check the excludes option.'));
+          }
+
+          done();
+        }
+      }
+    }
+  };
+
+  // setup the modules require will build
+  var requireModules = _c.build.options.modules = [
+    {
+      // main/common module
+      name: 'app',
+      include: [
+        'css',
+        'kbn',
+        'text',
+        'jquery',
+        'angular',
+        'settings',
+        'bootstrap',
+        'modernizr',
+        'elasticjs',
+        'timepicker',
+        'datepicker',
+        'underscore',
+        'filters/all',
+        'jquery.flot',
+        'services/all',
+        'angular-strap',
+        'directives/all',
+        'jquery.flot.pie',
+        'angular-sanitize',
+        'angular-dragdrop'
+      ]
+    }
+  ];
+
+  // create a module for each directory in src/app/panels/
+  require('fs')
+    .readdirSync(config.srcDir+'/app/panels')
+    .forEach(function (panelName) {
+      requireModules.push({
+        name: 'panels/'+panelName+'/module',
+        exclude: ['app']
+      });
+    });
+
+  // exclude the literal config definition from all modules
+  requireModules
+    .forEach(function (module) {
+      module.excludeShallow = module.excludeShallow || [];
+      module.excludeShallow.push('config');
+    });
+
+  return _c;
+};

+ 34 - 0
tasks/options/s3.js

@@ -0,0 +1,34 @@
+module.exports = function(config) {
+  return {
+    dist: {
+      bucket: 'download.elasticsearch.org',
+      access: 'private',
+      // debug: true, // uncommment to prevent actual upload
+      upload: [
+        {
+          src: '<%= tempDir %>/<%= pkg.name %>-latest.zip',
+          dest: 'kibana/kibana/<%= pkg.name %>-latest.zip',
+        },
+        {
+          src: '<%= tempDir %>/<%= pkg.name %>-latest.tar.gz',
+          dest: 'kibana/kibana/<%= pkg.name %>-latest.tar.gz',
+        }
+      ]
+    },
+    release: {
+      bucket: 'download.elasticsearch.org',
+      access: 'private',
+      // debug: true, // uncommment to prevent actual upload
+      upload: [
+        {
+          src: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.zip',
+          dest: 'kibana/kibana/<%= pkg.name %>-<%= pkg.version %>.zip',
+        },
+        {
+          src: '<%= tempDir %>/<%= pkg.name %>-<%= pkg.version %>.tar.gz',
+          dest: 'kibana/kibana/<%= pkg.name %>-<%= pkg.version %>.tar.gz',
+        }
+      ]
+    }
+  };
+};

+ 16 - 0
tasks/options/uglify.js

@@ -0,0 +1,16 @@
+module.exports = function(config) {
+  return {
+    dest: {
+      expand: true,
+      src: ['**/*.js', '!config.js', '!app/dashboards/*.js'],
+      dest: '<%= destDir %>',
+      cwd: '<%= destDir %>',
+      options: {
+        quite: true,
+        compress: true,
+        preserveComments: false,
+        banner: '<%= meta.banner %>'
+      }
+    }
+  };
+};