8c93a47682
* Moved copying server-build/ from grunt to package.json using rsync to make sure to copy exactly what is needed and resolve symlinks correctly.
463 lines
14 KiB
JavaScript
463 lines
14 KiB
JavaScript
'use strict';
|
|
|
|
module.exports = function (grunt) {
|
|
|
|
// Load grunt tasks automatically
|
|
require('load-grunt-tasks')(grunt);
|
|
|
|
// Time how long tasks take. Can help when optimizing build times
|
|
require('time-grunt')(grunt);
|
|
|
|
var serveStatic = require('serve-static');
|
|
|
|
// Define the configuration for all the tasks
|
|
grunt.initConfig({
|
|
|
|
// Project settings
|
|
yeoman: {
|
|
// configurable paths
|
|
app: require('./bower.json').appPath || 'app',
|
|
dist: 'dist'
|
|
},
|
|
|
|
// Watches files for changes and runs tasks based on the changed files
|
|
watch: {
|
|
bower: {
|
|
files: ['bower.json'],
|
|
tasks: ['wiredep']
|
|
},
|
|
js: {
|
|
files: ['<%= yeoman.app %>/scripts/{,**/}*.js', 'shared/{,**/}*.js'],
|
|
tasks: ['newer:jshint:all'],
|
|
options: {
|
|
livereload: true
|
|
}
|
|
},
|
|
compass: {
|
|
files: ['<%= yeoman.app %>/styles/{,**/}*.{scss,sass}'],
|
|
tasks: ['compass:server', 'autoprefixer']
|
|
},
|
|
gruntfile: {
|
|
files: ['Gruntfile.js']
|
|
},
|
|
livereload: {
|
|
options: {
|
|
livereload: '<%= connect.options.livereload %>'
|
|
},
|
|
files: [
|
|
'<%= yeoman.app %>/{,**/}*.html',
|
|
'.tmp/styles/{,**/}*.css',
|
|
'<%= yeoman.app %>/images/{,**/}*.{png,jpg,jpeg,gif,webp,svg}'
|
|
]
|
|
}
|
|
},
|
|
|
|
// The actual grunt server settings
|
|
connect: {
|
|
options: {
|
|
port: 9000,
|
|
// Change this to '0.0.0.0' to access the server from outside.
|
|
hostname: 'localhost',
|
|
livereload: 35729,
|
|
middleware: function (connect, options) {
|
|
if (!Array.isArray(options.base)) {
|
|
options.base = [options.base];
|
|
}
|
|
|
|
// Setup the proxy
|
|
var middlewares = [require('grunt-connect-proxy/lib/utils').proxyRequest];
|
|
|
|
// Serve static files.
|
|
options.base.forEach(function(base) {
|
|
middlewares.push(serveStatic(base));
|
|
});
|
|
|
|
// Make directory browse-able.
|
|
var directory = options.directory || options.base[options.base.length - 1];
|
|
middlewares.push(serveStatic(directory));
|
|
|
|
return middlewares;
|
|
}
|
|
},
|
|
proxies: [{
|
|
context: '/api/',
|
|
host: '127.0.0.1',
|
|
port: 8080
|
|
}, {
|
|
context: '/config.js',
|
|
host: '127.0.0.1',
|
|
port: 8080
|
|
}],
|
|
livereload: {
|
|
options: {
|
|
open: true,
|
|
base: [
|
|
'.tmp',
|
|
'<%= yeoman.app %>'
|
|
]
|
|
}
|
|
},
|
|
dist: {
|
|
options: {
|
|
base: '<%= yeoman.dist %>'
|
|
}
|
|
}
|
|
},
|
|
|
|
// Make sure code styles are up to par and there are no obvious mistakes
|
|
jshint: {
|
|
options: {
|
|
jshintrc: '.jshintrc',
|
|
reporter: require('jshint-stylish')
|
|
},
|
|
all: [
|
|
'Gruntfile.js',
|
|
'<%= yeoman.app %>/scripts/{,**/}*.js',
|
|
'shared/{,**/}*.js',
|
|
'server/{,**/}*.js',
|
|
'!server/templates/{,**/}*.template'
|
|
]
|
|
},
|
|
|
|
// Empties folders to start fresh
|
|
clean: {
|
|
dist: {
|
|
files: [
|
|
{
|
|
dot: true,
|
|
src: [
|
|
'.tmp',
|
|
'<%= yeoman.dist %>/*',
|
|
'!<%= yeoman.dist %>/.git*'
|
|
]
|
|
}
|
|
]
|
|
},
|
|
server: '.tmp'
|
|
},
|
|
|
|
// Add vendor prefixed styles
|
|
autoprefixer: {
|
|
options: {
|
|
browsers: ['last 1 version']
|
|
},
|
|
dist: {
|
|
files: [
|
|
{
|
|
expand: true,
|
|
cwd: '.tmp/styles/',
|
|
src: '{,*/}*.css',
|
|
dest: '.tmp/styles/'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
wiredep: {
|
|
task: {
|
|
src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
|
|
ignorePath: '<%= yeoman.app %>/bower_components/'
|
|
}
|
|
},
|
|
|
|
// Compiles Sass to CSS and generates necessary files if requested
|
|
compass: {
|
|
options: {
|
|
sassDir: '<%= yeoman.app %>/styles',
|
|
cssDir: '.tmp/styles',
|
|
generatedImagesDir: '.tmp/images/generated',
|
|
imagesDir: '<%= yeoman.app %>/images',
|
|
javascriptsDir: '<%= yeoman.app %>/scripts',
|
|
fontsDir: '<%= yeoman.app %>/fonts',
|
|
importPath: '<%= yeoman.app %>/bower_components',
|
|
httpImagesPath: '/images',
|
|
httpGeneratedImagesPath: '/images/generated',
|
|
httpFontsPath: '/fonts',
|
|
relativeAssets: false,
|
|
assetCacheBuster: false,
|
|
raw: 'Sass::Script::Number.precision = 10\n'
|
|
},
|
|
dist: {
|
|
options: {
|
|
generatedImagesDir: '<%= yeoman.dist %>/client/images/generated'
|
|
}
|
|
},
|
|
server: {
|
|
options: {
|
|
debugInfo: true
|
|
}
|
|
}
|
|
},
|
|
|
|
html2js: {
|
|
options: {
|
|
base: 'app',
|
|
htmlmin: {
|
|
collapseBooleanAttributes: true,
|
|
collapseWhitespace: true,
|
|
removeAttributeQuotes: true,
|
|
removeComments: true,
|
|
removeEmptyAttributes: true,
|
|
removeRedundantAttributes: true,
|
|
removeScriptTypeAttributes: true,
|
|
removeStyleLinkTypeAttributes: true
|
|
}
|
|
},
|
|
main: {
|
|
src: ['<%= yeoman.app %>/views/{*,**/*}.html'],
|
|
dest: '.tmp/scripts/templates.js'
|
|
}
|
|
},
|
|
|
|
// Renames files for browser caching purposes
|
|
rev: {
|
|
dist: {
|
|
files: {
|
|
src: [
|
|
'<%= yeoman.dist %>/client/scripts/{,*/}*.js',
|
|
'<%= yeoman.dist %>/client/styles/{,*/}*.css',
|
|
'<%= yeoman.dist %>/client/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
|
|
]
|
|
}
|
|
}
|
|
},
|
|
|
|
// 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.app %>/index.html',
|
|
options: {
|
|
dest: '<%= yeoman.dist %>/client',
|
|
flow: {
|
|
html: {
|
|
steps: {
|
|
js: ['concat', 'uglifyjs'],
|
|
css: ['cssmin']
|
|
},
|
|
post: {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
// Performs rewrites based on rev and the useminPrepare configuration
|
|
usemin: {
|
|
html: ['<%= yeoman.dist %>/client/{,*/}*.html'],
|
|
css: ['<%= yeoman.dist %>/client/styles/{,*/}*.css'],
|
|
options: {
|
|
assetsDirs: ['<%= yeoman.dist %>/client']
|
|
}
|
|
},
|
|
|
|
// The following *-min tasks produce minified files in the dist folder
|
|
cssmin: {
|
|
options: {
|
|
root: '<%= yeoman.app %>'
|
|
}
|
|
},
|
|
|
|
imagemin: {
|
|
dist: {
|
|
files: [
|
|
{
|
|
expand: true,
|
|
cwd: '<%= yeoman.app %>/images',
|
|
src: '{,*/}*.{png,jpg,jpeg,gif}',
|
|
dest: '<%= yeoman.dist %>/client/images'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
svgmin: {
|
|
dist: {
|
|
files: [
|
|
{
|
|
expand: true,
|
|
cwd: '<%= yeoman.app %>/images',
|
|
src: '{,*/}*.svg',
|
|
dest: '<%= yeoman.dist %>/client/images'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
htmlmin: {
|
|
dist: {
|
|
options: {
|
|
collapseWhitespace: true,
|
|
collapseBooleanAttributes: true,
|
|
removeCommentsFromCDATA: true,
|
|
removeOptionalTags: true
|
|
},
|
|
files: [
|
|
{
|
|
expand: true,
|
|
cwd: '<%= yeoman.dist %>/client',
|
|
src: ['*.html', 'views/{,*/}*.html'],
|
|
dest: '<%= yeoman.dist %>/client'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
ngAnnotate: {
|
|
dist: {
|
|
files: [
|
|
{
|
|
expand: true,
|
|
cwd: '.tmp/concat/scripts',
|
|
src: '*.js',
|
|
dest: '.tmp/concat/scripts'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
uglify: {
|
|
options: {
|
|
mangle: false
|
|
}
|
|
},
|
|
|
|
// Copies remaining files to places other tasks can use
|
|
copy: {
|
|
dist: {
|
|
options: {
|
|
mode: true
|
|
},
|
|
files: [
|
|
{
|
|
expand: true,
|
|
dot: true,
|
|
cwd: '<%= yeoman.app %>',
|
|
dest: '<%= yeoman.dist %>/client',
|
|
src: [
|
|
'*.{ico,png,txt}',
|
|
'.htaccess',
|
|
'*.html',
|
|
'views/{,**/}*.html',
|
|
'images/{,**/}*.{webp}',
|
|
'fonts/*'
|
|
]
|
|
},
|
|
{
|
|
expand: true,
|
|
cwd: '<%= yeoman.app %>/bower_components/leaflet-dist/images',
|
|
dest: '<%= yeoman.dist %>/client/styles/images',
|
|
src: ['*.png']
|
|
},
|
|
{
|
|
expand: true,
|
|
cwd: '.tmp/images',
|
|
dest: '<%= yeoman.dist %>/client/images',
|
|
src: ['generated/*']
|
|
},
|
|
{
|
|
expand: true,
|
|
cwd: 'shared',
|
|
dest: '<%= yeoman.dist %>/shared',
|
|
src: ['{,**/}*.js']
|
|
},
|
|
{
|
|
expand: true,
|
|
cwd: '.',
|
|
dest: '<%= yeoman.dist %>/',
|
|
src: [
|
|
'config.json.example',
|
|
'LICENSE',
|
|
'README.md'
|
|
]
|
|
},
|
|
{
|
|
expand: true,
|
|
cwd: 'admin',
|
|
dest: '<%= yeoman.dist %>/admin',
|
|
src: ['{,**}/*.*']
|
|
}
|
|
]
|
|
},
|
|
styles: {
|
|
expand: true,
|
|
cwd: '<%= yeoman.app %>/styles',
|
|
dest: '.tmp/styles/',
|
|
src: '{,**/}*.css'
|
|
}
|
|
},
|
|
|
|
// Toggle private flag in package.json when copying to dist/.
|
|
replace: {
|
|
dist: {
|
|
options: {
|
|
patterns: [{
|
|
match: /"private": true/g,
|
|
replacement: '"private": false'
|
|
}]
|
|
},
|
|
files: [{
|
|
src: ['package.json'],
|
|
dest: 'dist/',
|
|
cwd: '.'
|
|
}]
|
|
}
|
|
},
|
|
|
|
// Run some tasks in parallel to speed up the build process
|
|
concurrent: {
|
|
server: [
|
|
'compass:server'
|
|
],
|
|
dist: [
|
|
'compass:dist',
|
|
'imagemin',
|
|
'svgmin'
|
|
]
|
|
}
|
|
});
|
|
|
|
|
|
grunt.registerTask('serve', function (target) {
|
|
if (target === 'dist') {
|
|
return grunt.task.run(['build', 'connect:dist:keepalive']);
|
|
}
|
|
|
|
return grunt.task.run([
|
|
'clean:server',
|
|
'wiredep',
|
|
'concurrent:server',
|
|
'autoprefixer',
|
|
'configureProxies',
|
|
'connect:livereload',
|
|
'watch'
|
|
]);
|
|
});
|
|
|
|
grunt.registerTask('server', function (target) {
|
|
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
|
|
grunt.task.run(['serve:' + target]);
|
|
});
|
|
|
|
grunt.registerTask('build', [
|
|
'clean:dist',
|
|
'wiredep',
|
|
'html2js',
|
|
'useminPrepare',
|
|
'concurrent:dist',
|
|
'autoprefixer',
|
|
'concat',
|
|
'ngAnnotate',
|
|
'copy:dist',
|
|
'replace:dist',
|
|
'cssmin',
|
|
'uglify',
|
|
'rev',
|
|
'usemin',
|
|
'htmlmin'
|
|
]);
|
|
|
|
grunt.registerTask('default', [
|
|
'newer:jshint',
|
|
'build'
|
|
]);
|
|
};
|