|
'use strict'; |
|
var SERVER_PORT = 9000; |
|
|
|
// # Globbing |
|
// for performance reasons we're only matching one level down: |
|
// 'test/spec/{,*/}*.js' |
|
// use this if you want to match all subfolders: |
|
// 'test/spec/**/*.js' |
|
// templateFramework: 'lodash' |
|
|
|
module.exports = function (grunt) { |
|
// show elapsed time at the end |
|
require('time-grunt')(grunt); |
|
// load all grunt tasks |
|
require('load-grunt-tasks')(grunt); |
|
|
|
// configurable paths |
|
var yeomanConfig = { |
|
app: 'app', |
|
dist: 'dist' |
|
}; |
|
|
|
grunt.initConfig({ |
|
yeoman: yeomanConfig, |
|
watch: { |
|
// options: { |
|
// nospawn: true, |
|
// livereload: true |
|
// }, |
|
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'] |
|
}, |
|
jst: { |
|
files: [ '<%= yeoman.app %>/scripts/templates/*.ejs' ], |
|
tasks: ['jst'] |
|
}, |
|
test: { |
|
files: ['<%= yeoman.app %>/scripts/{,*/}*.js', 'test/spec/**/*.js'], |
|
tasks: ['test:true'] |
|
} |
|
}, |
|
express: { |
|
livereload: { |
|
options: { |
|
port: SERVER_PORT, |
|
// change this to '0.0.0.0' to access the server from outside |
|
hostname: 'localhost', |
|
bases: ['.tmp', yeomanConfig.app], |
|
server: 'server/main.js', |
|
livereload: true, |
|
serverreload: true, |
|
open: true |
|
} |
|
}, |
|
|
|
test: { |
|
options: { |
|
port: 9001, |
|
bases: ['.tmp', yeomanConfig.app], |
|
server: 'server/main.js', |
|
open: true |
|
} |
|
}, |
|
|
|
dist: { |
|
options: { |
|
port: SERVER_PORT, |
|
hostname: '0.0.0.0', |
|
bases: [yeomanConfig.dist], |
|
server: 'server/main.js' |
|
} |
|
} |
|
}, |
|
clean: { |
|
dist: ['.tmp', '<%= yeoman.dist %>/*'], |
|
server: '.tmp' |
|
}, |
|
jshint: { |
|
options: { |
|
jshintrc: '.jshintrc', |
|
reporter: require('jshint-stylish') |
|
}, |
|
all: [ |
|
'Gruntfile.js', |
|
'<%= yeoman.app %>/scripts/{,*/}*.js', |
|
'!<%= yeoman.app %>/scripts/vendor/*', |
|
'test/spec/{,*/}*.js' |
|
] |
|
}, |
|
mocha: { |
|
all: { |
|
options: { |
|
run: true, |
|
urls: ['http://localhost:<%= express.test.options.port %>/index.html'] |
|
} |
|
} |
|
}, |
|
coffee: { |
|
dist: { |
|
files: [{ |
|
// rather than compiling multiple files here you should |
|
// require them into your main .coffee file |
|
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', |
|
imagesDir: '<%= yeoman.app %>/images', |
|
javascriptsDir: '<%= yeoman.app %>/scripts', |
|
fontsDir: '<%= yeoman.app %>/styles/fonts', |
|
importPath: '<%= yeoman.app %>/bower_components', |
|
relativeAssets: true |
|
}, |
|
dist: {}, |
|
server: { |
|
options: { |
|
debugInfo: true |
|
} |
|
} |
|
}, |
|
requirejs: { |
|
dist: { |
|
// Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js |
|
options: { |
|
// `name` and `out` is set by grunt-usemin |
|
baseUrl: '.tmp/scripts', |
|
optimize: 'none', |
|
paths: { |
|
'templates': '../../.tmp/scripts/templates', |
|
'jquery': '../../app/bower_components/jquery/jquery', |
|
'underscore': '../../app/bower_components/underscore/underscore', |
|
'backbone': '../../app/bower_components/backbone/backbone' |
|
}, |
|
// TODO: Figure out how to make sourcemaps work with grunt-usemin |
|
// https://github.com/yeoman/grunt-usemin/issues/30 |
|
//generateSourceMaps: true, |
|
// required to support SourceMaps |
|
// http://requirejs.org/docs/errors.html#sourcemapcomments |
|
preserveLicenseComments: false, |
|
useStrict: true, |
|
wrap: true |
|
//uglify2: {} // https://github.com/mishoo/UglifyJS2 |
|
} |
|
} |
|
}, |
|
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: { |
|
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', |
|
dest: '<%= yeoman.dist %>' |
|
}] |
|
} |
|
}, |
|
copy: { |
|
dist: { |
|
files: [{ |
|
expand: true, |
|
dot: true, |
|
cwd: '<%= yeoman.app %>', |
|
dest: '<%= yeoman.dist %>', |
|
src: [ |
|
'*.{ico,txt}', |
|
'.htaccess', |
|
'images/{,*/}*.{webp,gif}', |
|
'styles/fonts/{,*/}*.*', |
|
'bower_components/sass-bootstrap/fonts/*.*' |
|
] |
|
}] |
|
} |
|
}, |
|
bower: { |
|
all: { |
|
rjsConfig: '<%= yeoman.app %>/scripts/main.js' |
|
} |
|
}, |
|
jst: { |
|
options: { |
|
amd: true |
|
}, |
|
compile: { |
|
files: { |
|
'.tmp/scripts/templates.js': ['<%= yeoman.app %>/scripts/templates/*.ejs'] |
|
} |
|
} |
|
}, |
|
rev: { |
|
dist: { |
|
files: { |
|
src: [ |
|
'<%= yeoman.dist %>/scripts/{,*/}*.js', |
|
'<%= yeoman.dist %>/styles/{,*/}*.css', |
|
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}', |
|
'/styles/fonts/{,*/}*.*', |
|
'bower_components/sass-bootstrap/fonts/*.*' |
|
] |
|
} |
|
} |
|
} |
|
}); |
|
|
|
grunt.registerTask('createDefaultTemplate', function () { |
|
grunt.file.write('.tmp/scripts/templates.js', 'this.JST = this.JST || {};'); |
|
}); |
|
|
|
grunt.registerTask('serve', function (target) { |
|
if (target === 'dist') { |
|
return grunt.task.run(['build', 'open:server', 'connect:dist:keepalive']); |
|
} |
|
|
|
if (target === 'test') { |
|
return grunt.task.run([ |
|
'clean:server', |
|
'coffee', |
|
'createDefaultTemplate', |
|
'jst', |
|
'compass:server', |
|
'express:test', |
|
'open:test', |
|
]); |
|
} |
|
|
|
grunt.task.run([ |
|
'clean:server', |
|
'coffee:dist', |
|
'createDefaultTemplate', |
|
'jst', |
|
'compass:server', |
|
'express:livereload', |
|
]); |
|
}); |
|
|
|
grunt.registerTask('test', function (isConnected) { |
|
isConnected = Boolean(isConnected); |
|
var testTasks = [ |
|
'clean:server', |
|
'coffee', |
|
'createDefaultTemplate', |
|
'jst', |
|
'compass', |
|
'express:test', |
|
'mocha', |
|
'watch:test' |
|
]; |
|
|
|
if(!isConnected) { |
|
return grunt.task.run(testTasks); |
|
} else { |
|
// already connected so not going to connect again, remove the connect:test task |
|
testTasks.splice(testTasks.indexOf('connect:test'), 1); |
|
return grunt.task.run(testTasks); |
|
} |
|
}); |
|
|
|
grunt.registerTask('build', [ |
|
'clean:dist', |
|
'coffee', |
|
'createDefaultTemplate', |
|
'jst', |
|
'compass:dist', |
|
'useminPrepare', |
|
'requirejs', |
|
'imagemin', |
|
'htmlmin', |
|
'concat', |
|
'cssmin', |
|
'uglify', |
|
'copy', |
|
'rev', |
|
'usemin' |
|
]); |
|
|
|
grunt.registerTask('default', [ |
|
'jshint', |
|
'test', |
|
'build' |
|
]); |
|
}; |