Closed am17an closed 9 years ago
+1
\ Gruntfile.js **
// Generated on 2014-09-28 using generator-angular-fullstack 2.0.13
'use strict';
module.exports = function (grunt) {
var localConfig;
try {
localConfig = require('./server/config/local.env');
} catch(e) {
localConfig = {};
}
// Load grunt tasks automatically, when needed
require('jit-grunt')(grunt, {
express: 'grunt-express-server',
useminPrepare: 'grunt-usemin',
ngtemplates: 'grunt-angular-templates',
cdnify: 'grunt-google-cdn',
protractor: 'grunt-protractor-runner',
injector: 'grunt-asset-injector',
buildcontrol: 'grunt-build-control'
});
// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);
// Define the configuration for all the tasks
grunt.initConfig({
// Project settings
pkg: grunt.file.readJSON('package.json'),
yeoman: {
// configurable paths
client: require('./bower.json').appPath || 'client',
dist: 'dist'
},
express: {
options: {
port: process.env.PORT || 9000
},
dev: {
options: {
script: 'server/app.js',
debug: true
}
},
prod: {
options: {
script: 'dist/server/app.js'
}
}
},
open: {
server: {
url: 'http://localhost:<%= express.options.port %>'
}
},
watch: {
injectJS: {
files: [
'<%= yeoman.client %>/{app,components}/**/*.js',
'!<%= yeoman.client %>/{app,components}/**/*.spec.js',
'!<%= yeoman.client %>/{app,components}/**/*.mock.js',
'!<%= yeoman.client %>/app/app.js'],
tasks: ['injector:scripts']
},
injectCss: {
files: [
'<%= yeoman.client %>/{app,components}/**/*.css'
],
tasks: ['injector:css']
},
mochaTest: {
files: ['server/**/*.spec.js'],
tasks: ['env:test', 'mochaTest']
},
jsTest: {
files: [
'<%= yeoman.client %>/{app,components}/**/*.spec.js',
'<%= yeoman.client %>/{app,components}/**/*.mock.js'
],
tasks: ['newer:jshint:all', 'karma']
},
injectLess: {
files: [
'<%= yeoman.client %>/{app,components}/**/*.less'],
tasks: ['injector:less']
},
less: {
files: [
'<%= yeoman.client %>/{app,components}/**/*.less'],
tasks: ['less', 'autoprefixer']
},
gruntfile: {
files: ['Gruntfile.js']
},
livereload: {
files: [
'{.tmp,<%= yeoman.client %>}/{app,components}/**/*.css',
'{.tmp,<%= yeoman.client %>}/{app,components}/**/*.html',
'{.tmp,<%= yeoman.client %>}/{app,components}/**/*.js',
'!{.tmp,<%= yeoman.client %>}{app,components}/**/*.spec.js',
'!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js',
'<%= yeoman.client %>/assets/images/{,*//*}*.{png,jpg,jpeg,gif,webp,svg}'
],
options: {
livereload: true
}
},
express: {
files: [
'server/**/*.{js,json}'
],
tasks: ['express:dev', 'wait'],
options: {
livereload: true,
nospawn: true //Without this option specified express won't be reloaded
}
}
},
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: '<%= yeoman.client %>/.jshintrc',
reporter: require('jshint-stylish')
},
server: {
options: {
jshintrc: 'server/.jshintrc'
},
src: [
'server/**/*.js',
'!server/**/*.spec.js'
]
},
serverTest: {
options: {
jshintrc: 'server/.jshintrc-spec'
},
src: ['server/**/*.spec.js']
},
all: [
'<%= yeoman.client %>/{app,components}/**/*.js',
'!<%= yeoman.client %>/{app,components}/**/*.spec.js',
'!<%= yeoman.client %>/{app,components}/**/*.mock.js'
],
test: {
src: [
'<%= yeoman.client %>/{app,components}/**/*.spec.js',
'<%= yeoman.client %>/{app,components}/**/*.mock.js'
]
}
},
// Empties folders to start fresh
clean: {
dist: {
files: [{
dot: true,
src: [
'.tmp',
'<%= yeoman.dist %>/*',
'!<%= yeoman.dist %>/.git*',
'!<%= yeoman.dist %>/.openshift',
'!<%= yeoman.dist %>/Procfile'
]
}]
},
server: '.tmp'
},
// Add vendor prefixed styles
autoprefixer: {
options: {
browsers: ['last 1 version']
},
dist: {
files: [{
expand: true,
cwd: '.tmp/',
src: '{,*/}*.css',
dest: '.tmp/'
}]
}
},
// Debugging with node inspector
'node-inspector': {
custom: {
options: {
'web-host': 'localhost'
}
}
},
// Use nodemon to run server in debug mode with an initial breakpoint
nodemon: {
debug: {
script: 'server/app.js',
options: {
nodeArgs: ['--debug-brk'],
env: {
PORT: process.env.PORT || 9000
},
callback: function (nodemon) {
nodemon.on('log', function (event) {
console.log(event.colour);
});
// opens browser on initial server start
nodemon.on('config:update', function () {
setTimeout(function () {
require('open')('http://localhost:8080/debug?port=5858');
}, 500);
});
}
}
}
},
// Automatically inject Bower components into the app
wiredep: {
target: {
src: '<%= yeoman.client %>/index.html',
ignorePath: '<%= yeoman.client %>/',
exclude: [/nouislider/, /jquery/, /lodash/, /bootstrap-sass-official/, /bootstrap.js/, '/json3/', '/es5-shim/', /bootstrap.css/, /font-awesome.css/ ]
}
},
// Renames files for browser caching purposes
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/public/{,*/}*.js',
'<%= yeoman.dist %>/public/{,*/}*.css',
'<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/public/assets/fonts/*'
]
}
}
},
// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
html: ['<%= yeoman.client %>/index.html'],
options: {
dest: '<%= yeoman.dist %>/public'
}
},
// Performs rewrites based on rev and the useminPrepare configuration
usemin: {
html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
js: ['<%= yeoman.dist %>/public/{,*/}*.js'],
options: {
assetsDirs: [
'<%= yeoman.dist %>/public',
'<%= yeoman.dist %>/public/assets/images'
],
// This is so we update image references in our ng-templates
patterns: {
js: [
[/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
]
}
}
},
// The following *-min tasks produce minified files in the dist folder
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.client %>/assets/images',
src: '{,*/}*.{png,jpg,jpeg,gif}',
dest: '<%= yeoman.dist %>/public/assets/images'
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.client %>/assets/images',
src: '{,*/}*.svg',
dest: '<%= yeoman.dist %>/public/assets/images'
}]
}
},
uncss: {
stylesheets: '.tmp/app/app.css',
files: {
'.tmp/app/app.css': 'client/{app,components}/**/*.html'
}
},
// Allow the use of non-minsafe AngularJS files. Automatically makes it
// minsafe compatible so Uglify does not destroy the ng references
ngAnnotate: {
dist: {
files: [{
expand: true,
cwd: '.tmp/concat',
src: '*/**.js',
dest: '.tmp/concat'
}]
}
},
// Package all the html partials into a single javascript payload
ngtemplates: {
options: {
// This should be the name of your apps angular module
module: 'svrApp',
htmlmin: {
collapseBooleanAttributes: true,
collapseWhitespace: true,
removeAttributeQuotes: true,
removeEmptyAttributes: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true
},
usemin: 'app/app.js'
},
main: {
cwd: '<%= yeoman.client %>',
src: ['{app,components}/**/*.html'],
dest: '.tmp/templates.js'
},
tmp: {
cwd: '.tmp',
src: ['{app,components}/**/*.html'],
dest: '.tmp/tmp-templates.js'
}
},
// Replace Google CDN references
cdnify: {
dist: {
html: ['<%= yeoman.dist %>/public/*.html']
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%= yeoman.client %>',
dest: '<%= yeoman.dist %>/public',
src: [
'*.{ico,png,txt}',
'.htaccess',
'bower_components/**/*',
'assets/images/{,*/}*.{webp}',
'assets/fonts/**/*',
'index.html'
]
}, {
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/public/assets/images',
src: ['generated/*']
}, {
expand: true,
dest: '<%= yeoman.dist %>',
src: [
'package.json',
'server/**/*'
]
}]
},
styles: {
expand: true,
cwd: '<%= yeoman.client %>',
dest: '.tmp/',
src: ['{app,components}/**/*.css']
}
},
buildcontrol: {
options: {
dir: 'dist',
commit: true,
push: true,
connectCommits: false,
message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%'
},
heroku: {
options: {
remote: 'heroku',
branch: 'master'
}
},
openshift: {
options: {
remote: 'openshift',
branch: 'master'
}
}
},
// Run some tasks in parallel to speed up the build process
concurrent: {
server: [
'less',
],
test: [
'less',
],
debug: {
tasks: [
'nodemon',
'node-inspector'
],
options: {
logConcurrentOutput: true
}
},
dist: [
'less',
'imagemin',
'svgmin'
]
},
// Test settings
karma: {
unit: {
configFile: 'karma.conf.js',
singleRun: true
}
},
mochaTest: {
options: {
reporter: 'spec'
},
src: ['server/**/*.spec.js']
},
protractor: {
options: {
configFile: 'protractor.conf.js'
},
chrome: {
options: {
args: {
browser: 'chrome'
}
}
}
},
env: {
test: {
NODE_ENV: 'test'
},
prod: {
NODE_ENV: 'production'
},
all: localConfig
},
// Compiles Less to CSS
less: {
options: {
paths: [
'<%= yeoman.client %>/bower_components',
'<%= yeoman.client %>/app',
'<%= yeoman.client %>/components'
]
},
server: {
files: {
'.tmp/app/app.css' : '<%= yeoman.client %>/app/app.less'
}
},
},
injector: {
options: {
},
// Inject application script files into index.html (doesn't include bower)
scripts: {
options: {
transform: function(filePath) {
filePath = filePath.replace('/client/', '');
filePath = filePath.replace('/.tmp/', '');
return '<script src="' + filePath + '"></script>';
},
starttag: '<!-- injector:js -->',
endtag: '<!-- endinjector -->'
},
files: {
'<%= yeoman.client %>/index.html': [
['{.tmp,<%= yeoman.client %>}/{app,components}/**/*.js',
'!{.tmp,<%= yeoman.client %>}/app/app.js',
'!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.spec.js',
'!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js']
]
}
},
// Inject component less into app.less
less: {
options: {
transform: function(filePath) {
filePath = filePath.replace('/client/app/', '');
filePath = filePath.replace('/client/components/', '');
return '@import \'' + filePath + '\';';
},
starttag: '// injector',
endtag: '// endinjector'
},
files: {
'<%= yeoman.client %>/app/app.less': [
'<%= yeoman.client %>/{app,components}/**/*.less',
'!<%= yeoman.client %>/app/app.less'
]
}
},
// Inject component css into index.html
css: {
options: {
transform: function(filePath) {
filePath = filePath.replace('/client/', '');
filePath = filePath.replace('/.tmp/', '');
return '<link rel="stylesheet" href="' + filePath + '">';
},
starttag: '<!-- injector:css -->',
endtag: '<!-- endinjector -->'
},
files: {
'<%= yeoman.client %>/index.html': [
'<%= yeoman.client %>/{app,components}/**/*.css'
]
}
}
},
});
// Used for delaying livereload until after server has restarted
grunt.registerTask('wait', function () {
grunt.log.ok('Waiting for server reload...');
var done = this.async();
setTimeout(function () {
grunt.log.writeln('Done waiting!');
done();
}, 1500);
});
grunt.registerTask('express-keepalive', 'Keep grunt running', function() {
this.async();
});
grunt.registerTask('serve', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'wait', 'open', 'express-keepalive']);
}
if (target === 'debug') {
return grunt.task.run([
'clean:server',
'env:all',
'injector:less',
'concurrent:server',
'injector',
'wiredep',
'autoprefixer',
'concurrent:debug'
]);
}
grunt.task.run([
'clean:server',
'env:all',
'injector:less',
'concurrent:server',
'injector',
'wiredep',
'autoprefixer',
'express:dev',
'wait',
'open',
'watch'
]);
});
grunt.registerTask('server', function () {
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
grunt.task.run(['serve']);
});
grunt.registerTask('test', function(target) {
if (target === 'server') {
return grunt.task.run([
'env:all',
'env:test',
'mochaTest'
]);
}
else if (target === 'client') {
return grunt.task.run([
'clean:server',
'env:all',
'injector:less',
'concurrent:test',
'injector',
'autoprefixer',
'karma'
]);
}
else if (target === 'e2e') {
return grunt.task.run([
'clean:server',
'env:all',
'env:test',
'injector:less',
'concurrent:test',
'injector',
'wiredep',
'autoprefixer',
'express:dev',
'protractor'
]);
}
else grunt.task.run([
'test:server',
'test:client'
]);
});
grunt.registerTask('build', [
'clean:dist',
'injector:less',
'concurrent:dist',
'injector',
'wiredep',
'useminPrepare',
'autoprefixer',
'ngtemplates',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'rev',
'usemin'
]);
grunt.registerTask('default', [
'newer:jshint',
'test',
'build'
]);
};
❯ grunt build --verbose
Initializing
Command-line options: --verbose
Reading "Gruntfile.js" Gruntfile...OK
Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Loading "Gruntfile.js" tasks...OK
+ build, default, express-keepalive, serve, server, test, wait
Running tasks: build
Running "build" task
Loading "grunt-contrib-clean
Registering "/Users/chance/Sites/svr/node_modules/grunt-contrib-clean/tasks" tasks.
Loading "clean.js" tasks...OK
+ clean
>> Plugin loaded.
Running "clean:dist" (clean) task
Verifying property clean.dist exists in config...OK
Files: .tmp, dist/public
Options: force=false, no-write=false
Options: force=false, no-write=false
Cleaning .tmp...OK
Cleaning dist/public...OK
Loading "grunt-asset-injector
Registering "/Users/chance/Sites/svr/node_modules/grunt-asset-injector/tasks" tasks.
Loading "injector.js" tasks...OK
+ injector
>> Plugin loaded.
Running "injector:less" (injector) task
Verifying property injector.less exists in config...OK
Files: client/app/account/login/login.less, client/app/admin/admin.less, client/app/layout.less, client/app/main/main.less, client/app/property/styles/property.less, client/app/property/styles/property.search.less, client/app/property/styles/property.show.less, client/app/styles/animations.less, client/app/styles/svr-font.less, client/components/bootstrap-checkbox/ng-check.less, client/components/navbar/navbar.less, client/components/nouislider/slider.less -> client/app/app.less
Options: min=false, template=null, bowerPrefix=null, addRootSlash, starttag="// injector", endtag="// endinjector", transform=undefined
Missing option `template`, using `dest` as template instead
Reading client/app/app.less...OK
Injecting less files (12 files)
>> Nothing changed
Loading "grunt-concurrent
Registering "/Users/chance/Sites/svr/node_modules/grunt-concurrent/tasks" tasks.
Loading "concurrent.js" tasks...OK
+ concurrent
>> Plugin loaded.
Running "concurrent:dist" (concurrent) task
Verifying property concurrent.dist exists in config...OK
Files: [no src] -> dist
Options: limit=8
Initializing
Command-line options: --verbose
Reading "Gruntfile.js" Gruntfile...OK
Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Loading "Gruntfile.js" tasks...OK
+ build, default, express-keepalive, serve, server, test, wait
Running tasks: svgmin
Loading "grunt-svgmin
Registering "/Users/chance/Sites/svr/node_modules/grunt-svgmin/tasks" tasks.
Loading "svgmin.js" tasks...OK
+ svgmin
>> Plugin loaded.
Running "svgmin" task
Running "svgmin:dist" (svgmin) task
Verifying property svgmin.dist exists in config...OK
Files: client/assets/images/agent.svg -> dist/public/assets/images/agent.svg
Files: client/assets/images/apartment.svg -> dist/public/assets/images/apartment.svg
Files: client/assets/images/auction.svg -> dist/public/assets/images/auction.svg
Files: client/assets/images/bath.svg -> dist/public/assets/images/bath.svg
Files: client/assets/images/bathtub.svg -> dist/public/assets/images/bathtub.svg
Files: client/assets/images/bed.svg -> dist/public/assets/images/bed.svg
Files: client/assets/images/bid.svg -> dist/public/assets/images/bid.svg
Files: client/assets/images/check.svg -> dist/public/assets/images/check.svg
Files: client/assets/images/construct.svg -> dist/public/assets/images/construct.svg
Files: client/assets/images/door.svg -> dist/public/assets/images/door.svg
Files: client/assets/images/fan.svg -> dist/public/assets/images/fan.svg
Files: client/assets/images/fence.svg -> dist/public/assets/images/fence.svg
Files: client/assets/images/find-home.svg -> dist/public/assets/images/find-home.svg
Files: client/assets/images/fireplace.svg -> dist/public/assets/images/fireplace.svg
Files: client/assets/images/footage.svg -> dist/public/assets/images/footage.svg
Files: client/assets/images/for-sale.svg -> dist/public/assets/images/for-sale.svg
Files: client/assets/images/garage.svg -> dist/public/assets/images/garage.svg
Files: client/assets/images/house1.svg -> dist/public/assets/images/house1.svg
Files: client/assets/images/house2.svg -> dist/public/assets/images/house2.svg
Files: client/assets/images/house3.svg -> dist/public/assets/images/house3.svg
Files: client/assets/images/key.svg -> dist/public/assets/images/key.svg
Files: client/assets/images/land.svg -> dist/public/assets/images/land.svg
Files: client/assets/images/mansion.svg -> dist/public/assets/images/mansion.svg
Files: client/assets/images/no-pets.svg -> dist/public/assets/images/no-pets.svg
Files: client/assets/images/parking.svg -> dist/public/assets/images/parking.svg
Files: client/assets/images/pool.svg -> dist/public/assets/images/pool.svg
Files: client/assets/images/rv.svg -> dist/public/assets/images/rv.svg
Files: client/assets/images/stairs.svg -> dist/public/assets/images/stairs.svg
Files: client/assets/images/subdivision.svg -> dist/public/assets/images/subdivision.svg
Files: client/assets/images/svr-text.svg -> dist/public/assets/images/svr-text.svg
Files: client/assets/images/svr-tree.svg -> dist/public/assets/images/svr-tree.svg
Files: client/assets/images/window.svg -> dist/public/assets/images/window.svg
Options: (none)
Reading client/assets/images/agent.svg...OK
✔ client/assets/images/agent.svg (saved 671 B 33%)
Writing dist/public/assets/images/agent.svg...OK
Reading client/assets/images/apartment.svg...OK
✔ client/assets/images/apartment.svg (saved 453 B 55%)
Writing dist/public/assets/images/apartment.svg...OK
Reading client/assets/images/auction.svg...OK
✔ client/assets/images/auction.svg (saved 582 B 43%)
Writing dist/public/assets/images/auction.svg...OK
Reading client/assets/images/bath.svg...OK
✔ client/assets/images/bath.svg (saved 429 B 46%)
Writing dist/public/assets/images/bath.svg...OK
Reading client/assets/images/bathtub.svg...OK
✔ client/assets/images/bathtub.svg (saved 1.58 kB 36%)
Writing dist/public/assets/images/bathtub.svg...OK
Reading client/assets/images/bed.svg...OK
✔ client/assets/images/bed.svg (saved 403 B 51%)
Writing dist/public/assets/images/bed.svg...OK
Reading client/assets/images/bid.svg...OK
✔ client/assets/images/bid.svg (saved 581 B 38%)
Writing dist/public/assets/images/bid.svg...OK
Reading client/assets/images/check.svg...OK
✔ client/assets/images/check.svg (saved 785 B 30%)
Writing dist/public/assets/images/check.svg...OK
Reading client/assets/images/construct.svg...OK
✔ client/assets/images/construct.svg (saved 660 B 53%)
Writing dist/public/assets/images/construct.svg...OK
Reading client/assets/images/door.svg...OK
✔ client/assets/images/door.svg (saved 388 B 63%)
Writing dist/public/assets/images/door.svg...OK
Reading client/assets/images/fan.svg...OK
✔ client/assets/images/fan.svg (saved 510 B 35%)
Writing dist/public/assets/images/fan.svg...OK
Reading client/assets/images/fence.svg...OK
✔ client/assets/images/fence.svg (saved 473 B 43%)
Writing dist/public/assets/images/fence.svg...OK
Reading client/assets/images/find-home.svg...OK
✔ client/assets/images/find-home.svg (saved 425 B 48%)
Writing dist/public/assets/images/find-home.svg...OK
Reading client/assets/images/fireplace.svg...OK
✔ client/assets/images/fireplace.svg (saved 725 B 39%)
Writing dist/public/assets/images/fireplace.svg...OK
Reading client/assets/images/footage.svg...OK
✔ client/assets/images/footage.svg (saved 404 B 53%)
Writing dist/public/assets/images/footage.svg...OK
Reading client/assets/images/for-sale.svg...OK
✔ client/assets/images/for-sale.svg (saved 411 B 65%)
Writing dist/public/assets/images/for-sale.svg...OK
Reading client/assets/images/garage.svg...OK
✔ client/assets/images/garage.svg (saved 392 B 59%)
Writing dist/public/assets/images/garage.svg...OK
Reading client/assets/images/house1.svg...OK
✔ client/assets/images/house1.svg (saved 493 B 59%)
Writing dist/public/assets/images/house1.svg...OK
Reading client/assets/images/house2.svg...OK
✔ client/assets/images/house2.svg (saved 494 B 56%)
Writing dist/public/assets/images/house2.svg...OK
Reading client/assets/images/house3.svg...OK
✔ client/assets/images/house3.svg (saved 447 B 55%)
Writing dist/public/assets/images/house3.svg...OK
Reading client/assets/images/key.svg...OK
✔ client/assets/images/key.svg (saved 513 B 34%)
Writing dist/public/assets/images/key.svg...OK
Reading client/assets/images/land.svg...OK
✔ client/assets/images/land.svg (saved 507 B 38%)
Writing dist/public/assets/images/land.svg...OK
Reading client/assets/images/mansion.svg...OK
✔ client/assets/images/mansion.svg (saved 425 B 49%)
Writing dist/public/assets/images/mansion.svg...OK
Reading client/assets/images/no-pets.svg...OK
✔ client/assets/images/no-pets.svg (saved 573 B 37%)
Writing dist/public/assets/images/no-pets.svg...OK
Reading client/assets/images/parking.svg...OK
✔ client/assets/images/parking.svg (saved 427 B 44%)
Writing dist/public/assets/images/parking.svg...OK
Reading client/assets/images/pool.svg...OK
✔ client/assets/images/pool.svg (saved 1.34 kB 26%)
Writing dist/public/assets/images/pool.svg...OK
Reading client/assets/images/rv.svg...OK
✔ client/assets/images/rv.svg (saved 471 B 38%)
Writing dist/public/assets/images/rv.svg...OK
Reading client/assets/images/stairs.svg...OK
✔ client/assets/images/stairs.svg (saved 602 B 50%)
Writing dist/public/assets/images/stairs.svg...OK
Reading client/assets/images/subdivision.svg...OK
✔ client/assets/images/subdivision.svg (saved 1.11 kB 34%)
Writing dist/public/assets/images/subdivision.svg...OK
Reading client/assets/images/svr-text.svg...OK
✔ client/assets/images/svr-text.svg (saved 4.75 kB 27%)
Writing dist/public/assets/images/svr-text.svg...OK
Reading client/assets/images/svr-tree.svg...OK
✔ client/assets/images/svr-tree.svg (saved 17.67 kB 30%)
Writing dist/public/assets/images/svr-tree.svg...OK
Reading client/assets/images/window.svg...OK
✔ client/assets/images/window.svg (saved 398 B 67%)
Writing dist/public/assets/images/window.svg...OK
Total saved: 40.1 kB
Done, without errors.
Execution Time (2014-11-10 07:39:06 UTC)
loading tasks 111ms ▇▇▇▇▇▇▇▇▇▇▇▇▇ 26%
svgmin:dist 321ms ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 74%
Total 434ms
Initializing
Command-line options: --verbose
Reading "Gruntfile.js" Gruntfile...OK
Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Loading "Gruntfile.js" tasks...OK
+ build, default, express-keepalive, serve, server, test, wait
Running tasks: less
Loading "grunt-contrib-less
Registering "/Users/chance/Sites/svr/node_modules/grunt-contrib-less/tasks" tasks.
Loading "less.js" tasks...OK
+ less
>> Plugin loaded.
Running "less" task
Running "less:server" (less) task
Verifying property less.server exists in config...OK
Files: client/app/app.less -> .tmp/app/app.css
Options: report="min", banner="", paths=["client/bower_components","client/app","client/components"]
Reading client/app/app.less...OK
Writing .tmp/app/app.css...OK
File .tmp/app/app.css created: 0 B → 334.19 kB
Done, without errors.
Execution Time (2014-11-10 07:39:06 UTC)
loading tasks 134ms ▇▇▇▇▇▇▇▇▇ 18%
less:server 618ms ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 82%
Total 752ms
Initializing
Command-line options: --verbose
Reading "Gruntfile.js" Gruntfile...OK
Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Loading "Gruntfile.js" tasks...OK
+ build, default, express-keepalive, serve, server, test, wait
Running tasks: imagemin
Loading "grunt-contrib-imagemin
Registering "/Users/chance/Sites/svr/node_modules/grunt-contrib-imagemin/tasks" tasks.
Loading "imagemin.js" tasks...OK
+ imagemin
>> Plugin loaded.
Running "imagemin" task
Running "imagemin:dist" (imagemin) task
Verifying property imagemin.dist exists in config...OK
Files: client/assets/images/commercial.jpg -> dist/public/assets/images/commercial.jpg
Files: client/assets/images/construction.jpg -> dist/public/assets/images/construction.jpg
Files: client/assets/images/envelope.png -> dist/public/assets/images/envelope.png
Files: client/assets/images/houses/h1.jpg -> dist/public/assets/images/houses/h1.jpg
Files: client/assets/images/houses/h2.jpg -> dist/public/assets/images/houses/h2.jpg
Files: client/assets/images/houses/h3.jpg -> dist/public/assets/images/houses/h3.jpg
Files: client/assets/images/houses/h4.jpg -> dist/public/assets/images/houses/h4.jpg
Files: client/assets/images/houses/h5.jpg -> dist/public/assets/images/houses/h5.jpg
Files: client/assets/images/houses/h6.jpg -> dist/public/assets/images/houses/h6.jpg
Files: client/assets/images/i.png -> dist/public/assets/images/i.png
Files: client/assets/images/kitchen.jpg -> dist/public/assets/images/kitchen.jpg
Files: client/assets/images/map-bg.jpg -> dist/public/assets/images/map-bg.jpg
Files: client/assets/images/new_files/usr.png -> dist/public/assets/images/new_files/usr.png
Files: client/assets/images/placeholder.png -> dist/public/assets/images/placeholder.png
Files: client/assets/images/residential-services@1172x718.jpg -> dist/public/assets/images/residential-services@1172x718.jpg
Files: client/assets/images/residential.jpg -> dist/public/assets/images/residential.jpg
Files: client/assets/images/sellyourhome.jpg -> dist/public/assets/images/sellyourhome.jpg
Files: client/assets/images/sold-bg.jpg -> dist/public/assets/images/sold-bg.jpg
Files: client/assets/images/svr-logo-menu.png -> dist/public/assets/images/svr-logo-menu.png
Files: client/assets/images/svr-logo.png -> dist/public/assets/images/svr-logo.png
Files: client/assets/images/yeoman.png -> dist/public/assets/images/yeoman.png
Options: interlaced, optimizationLevel=3, progressive
✔ client/assets/images/houses/h2.jpg (already optimized)
✔ client/assets/images/houses/h5.jpg (saved 867 B - 3%)
✔ client/assets/images/houses/h1.jpg (saved 719 B - 2%)
✔ client/assets/images/houses/h3.jpg (already optimized)
✔ client/assets/images/houses/h4.jpg (saved 146 B - 0%)
✔ client/assets/images/houses/h6.jpg (already optimized)
✔ client/assets/images/commercial.jpg (saved 5.22 kB - 5%)
✔ client/assets/images/i.png (saved 825 B - 87%)
✔ client/assets/images/kitchen.jpg (already optimized)
✔ client/assets/images/map-bg.jpg (saved 3.04 kB - 2%)
✔ client/assets/images/residential-services@1172x718.jpg (saved 2.88 kB - 2%)
✔ client/assets/images/sellyourhome.jpg (already optimized)
✔ client/assets/images/sold-bg.jpg (saved 5.44 kB - 5%)
✔ client/assets/images/residential.jpg (saved 4.26 kB - 2%)
✔ client/assets/images/svr-logo-menu.png (saved 1.11 kB - 26%)
✔ client/assets/images/construction.jpg (already optimized)
✔ client/assets/images/yeoman.png (saved 3.73 kB - 30%)
✔ client/assets/images/new_files/usr.png (saved 1.01 kB - 18%)
✔ client/assets/images/placeholder.png (saved 4.87 kB - 47%)
✔ client/assets/images/svr-logo.png (saved 13.92 kB - 45%)
✔ client/assets/images/envelope.png (saved 932 B - 9%)
Minified 21 images (saved 48.97 kB)
Done, without errors.
Execution Time (2014-11-10 07:39:06 UTC)
loading tasks 209ms ▇▇▇▇▇▇▇▇▇▇▇ 23%
imagemin:dist 708ms ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 77%
Total 917ms
Running "injector" task
Running "injector:scripts" (injector) task
Verifying property injector.scripts exists in config...OK
Files: client/app/account/account.js, client/app/account/login/login.controller.js, client/app/account/settings/settings.controller.js, client/app/account/signup/signup.controller.js, client/app/admin/admin.controller.js, client/app/admin/admin.js, client/app/main/main.controller.js, client/app/main/main.js, client/app/property/controllers/search.controller.js, client/app/property/controllers/show.controller.js, client/app/property/filters/search.filter.js, client/app/property/services/property.search.service.js, client/app/property/services/property.service.js, client/app/property/services/search.service.js, client/app/property/states.js, client/components/auth/auth.service.js, client/components/auth/user.service.js, client/components/bootstrap-checkbox/angular-bootstrap-checkbox.js, client/components/filter/flatcurrency.filter.js, client/components/filter/plaintext.filter.js, client/components/filter/range.filter.js, client/components/geocode/geocode.service.js, client/components/mongoose-error/mongoose-error.directive.js, client/components/navbar/navbar.controller.js, client/components/ngupload/ng-s3upload.js, client/components/property-search-field/property-search-field.directive.js, client/components/slick/slick.js, client/components/socket/socket.service.js, client/components/switcher/ng-switcher.js -> client/index.html
Options: min=false, template=null, bowerPrefix=null, addRootSlash, starttag="<!-- injector:js -->", endtag="<!-- endinjector -->", transform=undefined
Missing option `template`, using `dest` as template instead
Reading client/index.html...OK
Injecting js files (29 files)
>> Nothing changed
Running "injector:less" (injector) task
Verifying property injector.less exists in config...OK
Files: client/app/account/login/login.less, client/app/admin/admin.less, client/app/layout.less, client/app/main/main.less, client/app/property/styles/property.less, client/app/property/styles/property.search.less, client/app/property/styles/property.show.less, client/app/styles/animations.less, client/app/styles/svr-font.less, client/components/bootstrap-checkbox/ng-check.less, client/components/navbar/navbar.less, client/components/nouislider/slider.less -> client/app/app.less
Options: min=false, template=null, bowerPrefix=null, addRootSlash, starttag="// injector", endtag="// endinjector", transform=undefined
Missing option `template`, using `dest` as template instead
Reading client/app/app.less...OK
Injecting less files (12 files)
>> Nothing changed
Running "injector:css" (injector) task
Verifying property injector.css exists in config...OK
Files: client/components/switcher/ng-switcher.css -> client/index.html
Options: min=false, template=null, bowerPrefix=null, addRootSlash, starttag="<!-- injector:css -->", endtag="<!-- endinjector -->", transform=undefined
Missing option `template`, using `dest` as template instead
Reading client/index.html...OK
Injecting css files (1 files)
>> Nothing changed
Loading "grunt-wiredep
Registering "/Users/chance/Sites/svr/node_modules/grunt-wiredep/tasks" tasks.
Loading "wiredep.js" tasks...OK
+ wiredep
>> Plugin loaded.
Running "wiredep" task
Running "wiredep:target" (wiredep) task
Verifying property wiredep.target exists in config...OK
Files: client/index.html
Verifying property wiredep.target.src exists in config...OK
Loading "grunt-usemin
Registering "/Users/chance/Sites/svr/node_modules/grunt-usemin/tasks" tasks.
Loading "usemin.js" tasks...OK
+ usemin, useminPrepare
>> Plugin loaded.
Running "useminPrepare" task
Running "useminPrepare:html" (useminPrepare) task
Verifying property useminPrepare.html exists in config...OK
Files: client/index.html -> html
Options: dest="dist/public"
Going through client/index.html to update the config
Looking for build script HTML comment blocks
Configuration is now:
concat:
{ generated:
{ files:
[ { dest: '.tmp/concat/app/vendor.css',
src:
[ 'client/bower_components/bootstrap/dist/css/bootstrap.css',
'client/bower_components/font-awesome/css/font-awesome.css',
'client/bower_components/slick-carousel/slick/slick.css',
'client/assets/redactor/redactor.css',
'client/bower_components/angular-busy/dist/angular-busy.css',
'client/bower_components/animate/animate.css',
'client/bower_components/ngDialog/css/ngDialog.css',
'client/bower_components/ngDialog/css/ngDialog-theme-default.css' ] },
{ dest: '.tmp/concat/app/app.css',
src:
[ '{.tmp,client}/app/app.css',
'{.tmp,client}/components/switcher/ng-switcher.css' ] },
{ dest: '.tmp/concat/app/vendor.js',
src:
[ 'client/bower_components/jquery/dist/jquery.js',
'client/bower_components/jquery-bridget/jquery.bridget.js',
'client/assets/redactor/redactor.js',
'client/bower_components/lodash/dist/lodash.underscore.js',
'client/bower_components/angular/angular.js',
'client/bower_components/angular-resource/angular-resource.js',
'client/bower_components/angular-cookies/angular-cookies.js',
'client/bower_components/angular-sanitize/angular-sanitize.js',
'client/bower_components/angular-socket-io/socket.js',
'client/bower_components/angular-ui-router/release/angular-ui-router.js',
'client/bower_components/angular-redactor/angular-redactor.js',
'client/bower_components/angular-pageslide-directive/dist/angular-pageslide-directive.js',
'client/bower_components/get-style-property/get-style-property.js',
'client/bower_components/get-size/get-size.js',
'client/bower_components/eventie/eventie.js',
'client/bower_components/doc-ready/doc-ready.js',
'client/bower_components/eventEmitter/EventEmitter.js',
'client/bower_components/matches-selector/matches-selector.js',
'client/bower_components/outlayer/item.js',
'client/bower_components/outlayer/outlayer.js',
'client/bower_components/masonry/masonry.js',
'client/bower_components/angular-once/once.js',
'client/bower_components/angular-google-maps/dist/angular-google-maps.js',
'client/bower_components/slick-carousel/slick/slick.min.js',
'client/bower_components/angular-animate/angular-animate.js',
'client/bower_components/angular-busy/dist/angular-busy.js',
'client/bower_components/ui-router-extras/release/ct-ui-router-extras.js',
'client/bower_components/angular-local-storage/angular-local-storage.js',
'client/bower_components/imagesloaded/imagesloaded.js',
'client/bower_components/angular-masonry-directive/src/angular-masonry-directive.js',
'client/bower_components/angular-parallax/scripts/angular-parallax.js',
'client/bower_components/angular-scroll/angular-scroll.min.js',
'client/bower_components/ng-parallax/angular-parallax.min.js',
'client/bower_components/ngDialog/js/ngDialog.js',
'client/socket.io-client/socket.io.js',
'client/bower_components/nouislider/jquery.nouislider.js',
'client/bower_components/nouislider/Link.js',
'client/bower_components/angular-nouislider/src/nouislider.js' ] },
{ dest: '.tmp/concat/app/app.js',
src:
[ '{.tmp,client}/app/app.js',
'{.tmp,client}/util/lodash-mixins.js',
'{.tmp,client}/app/account/account.js',
'{.tmp,client}/app/account/login/login.controller.js',
'{.tmp,client}/app/account/settings/settings.controller.js',
'{.tmp,client}/app/account/signup/signup.controller.js',
'{.tmp,client}/app/admin/admin.controller.js',
'{.tmp,client}/app/admin/admin.js',
'{.tmp,client}/app/main/main.controller.js',
'{.tmp,client}/app/main/main.js',
'{.tmp,client}/app/property/controllers/search.controller.js',
'{.tmp,client}/app/property/controllers/show.controller.js',
'{.tmp,client}/app/property/filters/search.filter.js',
'{.tmp,client}/app/property/services/property.search.service.js',
'{.tmp,client}/app/property/services/property.service.js',
'{.tmp,client}/app/property/services/search.service.js',
'{.tmp,client}/app/property/states.js',
'{.tmp,client}/components/auth/auth.service.js',
'{.tmp,client}/components/auth/user.service.js',
'{.tmp,client}/components/bootstrap-checkbox/angular-bootstrap-checkbox.js',
'{.tmp,client}/components/filter/flatcurrency.filter.js',
'{.tmp,client}/components/filter/plaintext.filter.js',
'{.tmp,client}/components/filter/range.filter.js',
'{.tmp,client}/components/geocode/geocode.service.js',
'{.tmp,client}/components/mongoose-error/mongoose-error.directive.js',
'{.tmp,client}/components/navbar/navbar.controller.js',
'{.tmp,client}/components/ngupload/ng-s3upload.js',
'{.tmp,client}/components/property-search-field/property-search-field.directive.js',
'{.tmp,client}/components/slick/slick.js',
'{.tmp,client}/components/socket/socket.service.js',
'{.tmp,client}/components/switcher/ng-switcher.js' ] } ] } }
uglify:
{ generated:
{ files:
[ { dest: 'dist/public/app/vendor.js',
src: [ '.tmp/concat/app/vendor.js' ] },
{ dest: 'dist/public/app/app.js',
src: [ '.tmp/concat/app/app.js' ] } ] } }
cssmin:
{ generated:
{ files:
[ { dest: 'dist/public/app/vendor.css',
src: [ '.tmp/concat/app/vendor.css' ] },
{ dest: 'dist/public/app/app.css',
src: [ '.tmp/concat/app/app.css' ] } ] } }
Loading "grunt-autoprefixer
Registering "/Users/chance/Sites/svr/node_modules/grunt-autoprefixer/tasks" tasks.
Loading "autoprefixer.js" tasks...OK
+ autoprefixer
>> Plugin loaded.
Running "autoprefixer" task
Running "autoprefixer:dist" (autoprefixer) task
Verifying property autoprefixer.dist exists in config...OK
Files: .tmp/app/app.css -> .tmp/app/app.css
Options: cascade, diff=false, map=false, silent=false, browsers=["last 1 version"]
Reading .tmp/app/app.css...OK
Writing .tmp/app/app.css...OK
File .tmp/app/app.css created.
Loading "grunt-angular-templates
Registering "/Users/chance/Sites/svr/node_modules/grunt-angular-templates/tasks" tasks.
Loading "angular-templates.js" tasks...OK
+ ngtemplates
>> Plugin loaded.
Running "ngtemplates" task
Running "ngtemplates:main" (ngtemplates) task
Verifying property ngtemplates.main exists in config...OK
Files: app/account/login/login.html, app/account/settings/settings.html, app/account/signup/signup.html, app/admin/admin.html, app/main/main.html, app/property/views/common/property.card.html, app/property/views/index.html, app/property/views/search/_details.html, app/property/views/search/_filter.html, app/property/views/search/search.html, app/property/views/show/_highlights.html, app/property/views/show/_photos.html, app/property/views/show/_social-actions.html, app/property/views/show/_view-actions.html, app/property/views/show/show.html, components/navbar/navbar.html, components/ngupload/ngupload.html, components/property-search-field/property-found.html, components/property-search-field/property-search-field.html -> .tmp/templates.js
Options: angular="angular", bootstrap=undefined, concat=null, htmlmin={"collapseBooleanAttributes":true,"collapseWhitespace":true,"removeAttributeQuotes":true,"removeEmptyAttributes":true,"removeRedundantAttributes":true,"removeScriptTypeAttributes":true,"removeStyleLinkTypeAttributes":true}, module="svrApp", prefix="", source=undefined, standalone=false, url=undefined, usemin="app/app.js", append=false
Options: angular="angular", bootstrap=undefined, concat=null, htmlmin={"collapseBooleanAttributes":true,"collapseWhitespace":true,"removeAttributeQuotes":true,"removeEmptyAttributes":true,"removeRedundantAttributes":true,"removeScriptTypeAttributes":true,"removeStyleLinkTypeAttributes":true}, module="svrApp", prefix="", source=undefined, standalone=false, url=undefined, usemin="app/app.js", append=false
Reading client/app/account/login/login.html...OK
Reading client/app/account/settings/settings.html...OK
Reading client/app/account/signup/signup.html...OK
Reading client/app/admin/admin.html...OK
Reading client/app/main/main.html...OK
Reading client/app/property/views/common/property.card.html...OK
Reading client/app/property/views/index.html...OK
Reading client/app/property/views/search/_details.html...OK
Reading client/app/property/views/search/_filter.html...OK
Reading client/app/property/views/search/search.html...OK
Reading client/app/property/views/show/_highlights.html...OK
Reading client/app/property/views/show/_photos.html...OK
Reading client/app/property/views/show/_social-actions.html...OK
Reading client/app/property/views/show/_view-actions.html...OK
Reading client/app/property/views/show/show.html...OK
Reading client/components/navbar/navbar.html...OK
Reading client/components/ngupload/ngupload.html...OK
Reading client/components/property-search-field/property-found.html...OK
Reading client/components/property-search-field/property-search-field.html...OK
So far, every issue we've had involving "hanging", errors, etc. has been due to htmlmin
. I'd remove that part entirely & see if it still persists. There's not really anything this script is doing that would cause hanging :)
Yea, I'm sorry I missed this. In my case, the issue was due to a malformed tag.
I just commented out the entire htmlmin
config object, and now it works. I am minifying html in another grunt task after concat, so no problem at all.
Annoying bug, but with a workaround.
I'm going to have to remove htmlmin. This thing is the cause for all recent issues.
An extra quote following a space would hang running ngtemplates:
<div ng-class="{top:$first}" ">
no error codes just hanged but worked after removing the extra quote from my code
<div ng-class="{top:$first}">
If you use git for version control just do a git bisect until you find the commit with the invalid html. From there you can git checkout HEAD~1 an_html_file.html
for each html file and then run grunt ngtemplates
or whatever your grunt task is, until you find the bad file. Then fix it and you're good to go!
@activeiz +1, I hade same mistake.. Thanks.
This is in relation to #43
the
ngtemplates
task is configured asWhen I run
grunt ngtemplates --verbose
I getAfter this it just hangs. FWIW, I haven't touched the grunt file after yeomaning it from angular-fullstack I'm using version 0.5.7