diff --git a/.jshintrc b/.jshintrc index b3a00dc361..c65e1c7214 100644 --- a/.jshintrc +++ b/.jshintrc @@ -9,7 +9,7 @@ "curly": false, // Require {} for every new block or scope. "eqeqeq": true, // Require triple equals i.e. `===`. "immed": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );` - "latedef": true, // Prohibit variable use before definition. + "latedef": "nofunc", // Prohibit variable use before definition. "newcap": true, // Require capitalization of all constructor functions e.g. `new F()`. "noarg": true, // Prohibit use of `arguments.caller` and `arguments.callee`. "quotmark": "single", // Define quotes to string values. diff --git a/config/assets/default.js b/config/assets/default.js index 42f1b1062a..093b784bec 100644 --- a/config/assets/default.js +++ b/config/assets/default.js @@ -33,10 +33,13 @@ module.exports = { 'modules/*/client/*.js', 'modules/*/client/**/*.js' ], - views: ['modules/*/client/views/**/*.html'] + views: ['modules/*/client/views/**/*.html'], + templates: ['build/templates.js'] }, server: { - allJS: ['gruntfile.js', 'server.js', 'config/**/*.js', 'modules/*/server/**/*.js'], + gruntConfig: 'gruntfile.js', + gulpConfig: 'gulpfile.js', + allJS: ['server.js', 'config/**/*.js', 'modules/*/server/**/*.js'], models: 'modules/*/server/models/**/*.js', routes: ['modules/!(core)/server/routes/**/*.js', 'modules/core/server/routes/**/*.js'], sockets: 'modules/*/server/sockets/**/*.js', diff --git a/gruntfile.js b/gruntfile.js index 132e209dc3..b22485c52b 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -78,7 +78,7 @@ module.exports = function (grunt) { options: { nodeArgs: ['--debug'], ext: 'js,html', - watch: _.union(defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config) + watch: _.union(defaultAssets.server.gruntConfig, defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config) } } }, @@ -91,7 +91,7 @@ module.exports = function (grunt) { }, jshint: { all: { - src: _.union(defaultAssets.server.allJS, defaultAssets.client.js, testAssets.tests.server, testAssets.tests.client, testAssets.tests.e2e), + src: _.union(defaultAssets.server.gruntConfig, defaultAssets.server.allJS, defaultAssets.client.js, testAssets.tests.server, testAssets.tests.client, testAssets.tests.e2e), options: { jshintrc: true, node: true, diff --git a/gulpfile.js b/gulpfile.js index c9b0fe6c12..f86462ca7f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,7 +9,13 @@ var _ = require('lodash'), gulp = require('gulp'), gulpLoadPlugins = require('gulp-load-plugins'), runSequence = require('run-sequence'), - plugins = gulpLoadPlugins(); + plugins = gulpLoadPlugins({ + rename: { + 'gulp-angular-templatecache': 'templateCache' + } + }), + path = require('path'), + endOfLine = require('os').EOL; // Set NODE_ENV to 'test' gulp.task('env:test', function () { @@ -32,23 +38,29 @@ gulp.task('nodemon', function () { script: 'server.js', nodeArgs: ['--debug'], ext: 'js,html', - watch: _.union(defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config) + watch: _.union(defaultAssets.server.gulpConfig, defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config) }); }); // Watch Files For Changes -gulp.task('watch', function() { +gulp.task('watch', function () { // Start livereload plugins.livereload.listen(); // Add watch rules gulp.watch(defaultAssets.server.views).on('change', plugins.livereload.changed); gulp.watch(defaultAssets.server.allJS, ['jshint']).on('change', plugins.livereload.changed); - gulp.watch(defaultAssets.client.views).on('change', plugins.livereload.changed); gulp.watch(defaultAssets.client.js, ['jshint']).on('change', plugins.livereload.changed); gulp.watch(defaultAssets.client.css, ['csslint']).on('change', plugins.livereload.changed); gulp.watch(defaultAssets.client.sass, ['sass', 'csslint']).on('change', plugins.livereload.changed); gulp.watch(defaultAssets.client.less, ['less', 'csslint']).on('change', plugins.livereload.changed); + + if (process.env.NODE_ENV === 'production') { + gulp.watch(defaultAssets.client.views, ['templatecache', 'jshint']).on('change', plugins.livereload.changed); + gulp.watch(defaultAssets.server.gulpConfig, ['templatecache', 'lint']).on('change', plugins.livereload.changed); + } else { + gulp.watch(defaultAssets.server.gulpConfig, ['lint']).on('change', plugins.livereload.changed); + } }); // CSS linting task @@ -65,7 +77,16 @@ gulp.task('csslint', function (done) { // JS linting task gulp.task('jshint', function () { - return gulp.src(_.union(defaultAssets.server.allJS, defaultAssets.client.js, testAssets.tests.server, testAssets.tests.client, testAssets.tests.e2e)) + var assets = _.union( + defaultAssets.server.gulpConfig, + defaultAssets.server.allJS, + defaultAssets.client.js, + testAssets.tests.server, + testAssets.tests.client, + testAssets.tests.e2e + ); + + return gulp.src(assets) .pipe(plugins.jshint()) .pipe(plugins.jshint.reporter('default')) .pipe(plugins.jshint.reporter('fail')); @@ -74,7 +95,12 @@ gulp.task('jshint', function () { // JS minifying task gulp.task('uglify', function () { - return gulp.src(defaultAssets.client.js) + var assets = _.union( + defaultAssets.client.js, + defaultAssets.client.templates + ); + + return gulp.src(assets) .pipe(plugins.ngAnnotate()) .pipe(plugins.uglify({ mangle: false @@ -95,8 +121,9 @@ gulp.task('cssmin', function () { gulp.task('sass', function () { return gulp.src(defaultAssets.client.sass) .pipe(plugins.sass()) - .pipe(plugins.rename(function (path) { - path.dirname = path.dirname.replace('/scss', '/css'); + .pipe(plugins.autoprefixer()) + .pipe(plugins.rename(function (file) { + file.dirname = file.dirname.replace(path.sep + 'scss', path.sep + 'css'); })) .pipe(gulp.dest('./modules/')); }); @@ -105,12 +132,31 @@ gulp.task('sass', function () { gulp.task('less', function () { return gulp.src(defaultAssets.client.less) .pipe(plugins.less()) - .pipe(plugins.rename(function (path) { - path.dirname = path.dirname.replace('/less', '/css'); + .pipe(plugins.autoprefixer()) + .pipe(plugins.rename(function (file) { + file.dirname = file.dirname.replace(path.sep + 'less', path.sep + 'css'); })) .pipe(gulp.dest('./modules/')); }); +// Angular template cache task +gulp.task('templatecache', function () { + var re = new RegExp('\\' + path.sep + 'client\\' + path.sep, 'g'); + + return gulp.src(defaultAssets.client.views) + .pipe(plugins.templateCache('templates.js', { + root: 'modules/', + module: 'core', + templateHeader: '(function () {' + endOfLine + ' \'use strict\';' + endOfLine + endOfLine + ' angular' + endOfLine + ' .module(\'<%= module %>\'<%= standalone %>)' + endOfLine + ' .run(templates);' + endOfLine + endOfLine + ' templates.$inject = [\'$templateCache\'];' + endOfLine + endOfLine + ' function templates($templateCache) {' + endOfLine, + templateBody: ' $templateCache.put(\'<%= url %>\', \'<%= contents %>\');', + templateFooter: ' }' + endOfLine + '})();' + endOfLine, + transformUrl: function (url) { + return url.replace(re, path.sep); + } + })) + .pipe(gulp.dest('build')); +}); + // Mocha tests task gulp.task('mocha', function (done) { // Open mongoose connections @@ -118,7 +164,7 @@ gulp.task('mocha', function (done) { var error; // Connect mongoose - mongoose.connect(function() { + mongoose.connect(function () { // Run the tests gulp.src(testAssets.tests.server) .pipe(plugins.mocha({ @@ -128,9 +174,9 @@ gulp.task('mocha', function (done) { // If an error occurs, save it error = err; }) - .on('end', function() { + .on('end', function () { // When the tests are done, disconnect mongoose and pass the error state back to gulp - mongoose.disconnect(function() { + mongoose.disconnect(function () { done(error); }); }); @@ -163,31 +209,39 @@ gulp.task('protractor', function () { }); // Lint CSS and JavaScript files. -gulp.task('lint', function(done) { +gulp.task('lint', function (done) { runSequence('less', 'sass', ['csslint', 'jshint'], done); }); // Lint project files and minify them into two production files. -gulp.task('build', function(done) { - runSequence('env:dev' ,'lint', ['uglify', 'cssmin'], done); +gulp.task('build', function (done) { + runSequence('env:dev', 'lint', ['uglify', 'cssmin'], done); }); // Run the project tests -gulp.task('test', function(done) { +gulp.task('test', function (done) { runSequence('env:test', ['karma', 'mocha'], done); }); +gulp.task('test:server', function (done) { + runSequence('env:test', ['mocha'], done); +}); + +gulp.task('test:client', function (done) { + runSequence('env:test', ['karma'], done); +}); + // Run the project in development mode -gulp.task('default', function(done) { +gulp.task('default', function (done) { runSequence('env:dev', 'lint', ['nodemon', 'watch'], done); }); // Run the project in debug mode -gulp.task('debug', function(done) { +gulp.task('debug', function (done) { runSequence('env:dev', 'lint', ['nodemon', 'watch'], done); }); // Run the project in production mode -gulp.task('prod', function(done) { - runSequence('build', 'lint', ['nodemon', 'watch'], done); +gulp.task('prod', function (done) { + runSequence('templatecache', 'build', 'env:prod', ['nodemon', 'watch'], done); }); diff --git a/modules/core/server/views/layout.server.view.html b/modules/core/server/views/layout.server.view.html index 8fefeb6cc9..d4c9d33bbb 100644 --- a/modules/core/server/views/layout.server.view.html +++ b/modules/core/server/views/layout.server.view.html @@ -48,7 +48,7 @@
-