256 lines
8.8 KiB
JavaScript
256 lines
8.8 KiB
JavaScript
// jshint node:true
|
|
|
|
module.exports = function(grunt) {
|
|
// To support Coffeescript, SASS, LESS and others, just install
|
|
// the appropriate grunt package and it will be automatically included
|
|
// in the build process:
|
|
//
|
|
// * for Coffeescript, run `npm install --save-dev grunt-contrib-coffee`
|
|
//
|
|
// * for SCSS (without SASS), run `npm install --save-dev grunt-sass`
|
|
// * for SCSS/SASS support (may be slower), run
|
|
// `npm install --save-dev grunt-contrib-sass`
|
|
// This depends on the ruby sass gem, which can be installed with
|
|
// `gem install sass`
|
|
// * for Compass, run `npm install --save-dev grunt-contrib-compass`
|
|
// This depends on the ruby compass gem, which can be installed with
|
|
// `gem install compass`
|
|
// You should not install SASS if you have installed Compass.
|
|
//
|
|
// * for LESS, run `npm install --save-dev grunt-contrib-less`
|
|
//
|
|
// * for Stylus/Nib, `npm install --save-dev grunt-contrib-stylus`
|
|
//
|
|
// * for Emblem, run the following commands:
|
|
// `npm uninstall --save-dev grunt-ember-templates`
|
|
// `npm install --save-dev grunt-emblem`
|
|
// `bower install emblem.js --save`
|
|
//
|
|
// * For EmberScript, run `npm install --save-dev grunt-ember-script`
|
|
//
|
|
// * for LiveReload, `npm install --save-dev connect-livereload`
|
|
//
|
|
// * for YUIDoc support, `npm install --save-dev grunt-contrib-yuidoc`
|
|
// It is also nice to use a theme other than default. For example,
|
|
// simply do: `npm install yuidoc-theme-blue`
|
|
// Currently, only the `app` directory is used for generating docs.
|
|
// When installed, visit: http[s]://[host:port]/docs
|
|
//
|
|
// * for displaying the execution time of the grunt tasks,
|
|
// `npm install --save-dev time-grunt`
|
|
//
|
|
// * for minimizing the index.html at the end of the dist task
|
|
// `npm install --save-dev grunt-contrib-htmlmin`
|
|
//
|
|
// * for minimizing images in the dist task
|
|
// `npm install --save-dev grunt-contrib-imagemin`
|
|
//
|
|
// * for using images based CSS sprites (http://youtu.be/xD8DW6IQ6r0)
|
|
// `npm install --save-dev grunt-fancy-sprites`
|
|
// `bower install --save fancy-sprites-scss`
|
|
//
|
|
// * for automatically adding CSS vendor prefixes (autoprefixer)
|
|
// `npm install --save-dev grunt-autoprefixer`
|
|
//
|
|
// * for package import validations
|
|
// `npm install --save-dev grunt-es6-import-validate`
|
|
//
|
|
|
|
var Helpers = require('./tasks/helpers'),
|
|
filterAvailable = Helpers.filterAvailableTasks,
|
|
_ = grunt.util._,
|
|
path = require('path');
|
|
|
|
Helpers.pkg = require("./package.json");
|
|
|
|
if (Helpers.isPackageAvailable("time-grunt")) {
|
|
require("time-grunt")(grunt);
|
|
}
|
|
|
|
// Loads task options from `tasks/options/` and `tasks/custom-options`
|
|
// and loads tasks defined in `package.json`
|
|
var config = _.extend({},
|
|
require('load-grunt-config')(grunt, {
|
|
configPath: path.join(__dirname, 'tasks/options'),
|
|
loadGruntTasks: false,
|
|
init: false
|
|
}),
|
|
require('load-grunt-config')(grunt, { // Custom options have precedence
|
|
configPath: path.join(__dirname, 'tasks/custom-options'),
|
|
init: false
|
|
})
|
|
);
|
|
|
|
grunt.loadTasks('tasks'); // Loads tasks in `tasks/` folder
|
|
|
|
config.env = process.env;
|
|
|
|
|
|
// App Kit's Main Tasks
|
|
// ====================
|
|
|
|
|
|
// Generate the production version
|
|
// ------------------
|
|
grunt.registerTask('dist', "Build a minified & production-ready version of your app.", [
|
|
'clean:dist',
|
|
'build:dist',
|
|
'copy:assemble',
|
|
'createDistVersion'
|
|
]);
|
|
|
|
|
|
// Default Task
|
|
// ------------------
|
|
grunt.registerTask('default', "Build (in debug mode) & test your application.", ['test']);
|
|
|
|
|
|
// Servers
|
|
// -------------------
|
|
grunt.registerTask('server', "Run your server in development mode, auto-rebuilding when files change.", function(proxyMethod) {
|
|
var expressServerTask = 'expressServer:debug';
|
|
if (proxyMethod) {
|
|
expressServerTask += ':' + proxyMethod;
|
|
}
|
|
|
|
grunt.task.run(['clean:debug',
|
|
'build:debug',
|
|
expressServerTask,
|
|
'watch'
|
|
]);
|
|
});
|
|
|
|
grunt.registerTask('server:dist', "Build and preview a minified & production-ready version of your app.", [
|
|
'dist',
|
|
'expressServer:dist:keepalive'
|
|
]);
|
|
|
|
|
|
// Testing
|
|
// -------
|
|
grunt.registerTask('test', "Run your apps's tests once. Uses Google Chrome by default.", [
|
|
'clean:debug', 'build:debug', 'testem:ci:basic' ]);
|
|
|
|
grunt.registerTask('test:ci', "Run your app's tests in PhantomJS. For use in continuous integration (i.e. Travis CI).", [
|
|
'clean:debug', 'build:debug', 'testem:ci:basic' ]);
|
|
|
|
grunt.registerTask('test:browsers', "Run your app's tests in multiple browsers (see tasks/options/testem.js for configuration).", [
|
|
'clean:debug', 'build:debug', 'testem:ci:browsers' ]);
|
|
|
|
grunt.registerTask('test:server', "Alias to `testem:run:basic`. Be sure to install testem first using `npm install -g testem`", [
|
|
'testem:run:basic' ]);
|
|
|
|
// Worker tasks
|
|
// =================================
|
|
|
|
grunt.registerTask('build:dist', filterAvailable([
|
|
'createResultDirectory', // Create directoy beforehand, fixes race condition
|
|
'fancySprites:create',
|
|
'concurrent:buildDist', // Executed in parallel, see config below
|
|
]));
|
|
|
|
grunt.registerTask('build:debug', filterAvailable([
|
|
'jshint:tooling',
|
|
'createResultDirectory', // Create directoy beforehand, fixes race condition
|
|
'fancySprites:create',
|
|
'concurrent:buildDebug', // Executed in parallel, see config below
|
|
]));
|
|
|
|
grunt.registerTask('createDistVersion', filterAvailable([
|
|
'useminPrepare', // Configures concat, cssmin and uglify
|
|
'concat', // Combines css and javascript files
|
|
|
|
'cssmin', // Minifies css
|
|
'uglify', // Minifies javascript
|
|
'imagemin', // Optimizes image compression
|
|
// 'svgmin',
|
|
'copy:dist', // Copies files not covered by concat and imagemin
|
|
|
|
'rev', // Appends 8 char hash value to filenames
|
|
'usemin', // Replaces file references
|
|
'htmlmin:dist' // Removes comments and whitespace
|
|
]));
|
|
|
|
// Documentation
|
|
// -------
|
|
grunt.registerTask('docs', "Build YUIDoc documentation.", [
|
|
'buildDocs',
|
|
'server:debug'
|
|
]);
|
|
|
|
|
|
// Parallelize most of the build process
|
|
_.merge(config, {
|
|
concurrent: {
|
|
buildDist: [
|
|
"buildTemplates:dist",
|
|
"buildScripts",
|
|
"buildStyles",
|
|
"buildIndexHTML:dist"
|
|
],
|
|
buildDebug: [
|
|
"buildTemplates:debug",
|
|
"buildScripts",
|
|
"buildStyles",
|
|
"buildIndexHTML:debug"
|
|
]
|
|
}
|
|
});
|
|
|
|
// Templates
|
|
grunt.registerTask('buildTemplates:dist', filterAvailable([
|
|
'emblem:compile',
|
|
'emberTemplates:dist'
|
|
]));
|
|
|
|
grunt.registerTask('buildTemplates:debug', filterAvailable([
|
|
'emblem:compile',
|
|
'emberTemplates:debug'
|
|
]));
|
|
|
|
// Scripts
|
|
grunt.registerTask('buildScripts', filterAvailable([
|
|
'jshint:app',
|
|
'jshint:tests',
|
|
'validate-imports:app',
|
|
'validate-imports:tests',
|
|
'coffee',
|
|
'emberscript',
|
|
'copy:javascriptToTmp',
|
|
'transpile',
|
|
'buildDocs',
|
|
'concat_sourcemap'
|
|
]));
|
|
|
|
// Styles
|
|
grunt.registerTask('buildStyles', filterAvailable([
|
|
'compass:compile',
|
|
'sass:compile',
|
|
'less:compile',
|
|
'stylus:compile',
|
|
'copy:cssToResult',
|
|
'autoprefixer:app'
|
|
]));
|
|
|
|
// Documentation
|
|
grunt.registerTask('buildDocs', filterAvailable([
|
|
'yuidoc:debug',
|
|
]));
|
|
|
|
// Index HTML
|
|
grunt.registerTask('buildIndexHTML:dist', [
|
|
'preprocess:indexHTMLDistApp',
|
|
'preprocess:indexHTMLDistTests'
|
|
]);
|
|
|
|
grunt.registerTask('buildIndexHTML:debug', [
|
|
'preprocess:indexHTMLDebugApp',
|
|
'preprocess:indexHTMLDebugTests'
|
|
]);
|
|
|
|
grunt.registerTask('createResultDirectory', function() {
|
|
grunt.file.mkdir('tmp/result');
|
|
});
|
|
|
|
grunt.initConfig(config);
|
|
};
|