blob: b9e609d4c988729932b1a0ac5115cb5b2f362793 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*global module:false,require:false */
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
karma: {
unit: {
configFile: 'src/test/karma.conf.js',
autoWatch: true
},
continuous: {
configFile: 'src/test/karma.conf.js',
singleRun: true,
browsers: ['PhantomJS']
}
},
jshint: {
// only check BrowserMap files and Gruntfile.js
files: {
src: [
'Gruntfile.js',
'src/main/js/*.js'
]
},
options: {
browser: true,
curly: true,
forin: true,
camelcase: true,
quotmark: true,
undef: true,
unused: true,
trailing: true,
maxlen: 140,
multistr: true
}
},
copy: {
browsermap: {
files: [
{src: ['src/main/js/*.js'], dest: 'target/libs/browsermap/', expand: true, flatten: true},
{cwd: 'src/main/resources/demo/', src: ['**'], dest: 'target/demo/', expand: true},
{cwd: 'src/main/lib/', src: ['**'], dest: 'target/libs/externals/', expand: true},
{src: ['NOTICE'], dest: 'target/', expand: true}
]
},
minified: {
files: [
{src: ['target/libs/min/browsermap.min.js'], dest: 'target/demo/js/browsermap.min.js'}
]
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %> */\n',
mangle: {
except: ['BrowserMap', 'BrowserMapUtil', 'Modernizr']
}
},
target: {
files: {
'target/libs/min/browsermap.min.js': [
'target/libs/browsermap/bmaputil.js',
'target/libs/browsermap/bmap.js',
'target/libs/externals/modernizr/modernizr.custom.js',
'target/libs/externals/matchMedia/matchMedia.js',
'target/libs/browsermap/probes.js',
'target/libs/browsermap/devicegroups.js'
]
}
}
},
jsdoc: {
dist: {
src: ['src/main/js/*.js', 'README.md'],
dest: 'target/doc'
}
},
compress: {
source: {
options: {
archive: 'target/browsermap-<%= pkg.version %>-incubating.tar.gz',
mode: 'tgz',
pretty: true
},
files: [
// the following entries provide the source files in the archive
{cwd: 'src/', src: ['**/*.js'], dest: 'browsermap-<%= pkg.version %>-incubating/src/', expand: true},
{cwd: 'src/', src: ['**/*.css'], dest: 'browsermap-<%= pkg.version %>-incubating/src/', expand: true},
{cwd: 'src/', src: ['**/*.html'], dest: 'browsermap-<%= pkg.version %>-incubating/src/', expand: true},
{cwd: 'target/', src: ['NOTICE'], dest: 'browsermap-<%= pkg.version %>-incubating/', expand: true},
{
src: [
'.gitignore', '.travis.yml', 'Gruntfile.js', 'package.json', 'README.md', 'LICENSE', 'DISCLAIMER', 'rat.exclude'
],
dest: 'browsermap-<%= pkg.version %>-incubating/'
},
{src: ['ci/**'], dest: 'browsermap-<%= pkg.version %>-incubating/'}
]
},
dist: {
options: {
archive: 'target/browsermap-<%= pkg.version %>-incubating-dist.tar.gz',
mode: 'tgz',
pretty: true
},
files: [
{src: ['LICENSE', 'README.md', 'DISCLAIMER'], dest: 'browsermap-<%= pkg.version %>-incubating-dist/'},
{cwd: 'target/demo', src: ['**'], dest: 'browsermap-<%= pkg.version %>-incubating-dist/demo/', expand: true},
{cwd: 'target/doc/', src: ['**'], dest: 'browsermap-<%= pkg.version %>-incubating-dist/doc/', expand: true},
{cwd: 'target/', src: ['NOTICE'], dest: 'browsermap-<%= pkg.version %>-incubating-dist/', expand: true},
{cwd: 'target/libs/min/', src: ['*.js'], dest: 'browsermap-<%= pkg.version %>-incubating-dist/', expand: true}
]
}
},
qunit: {
options: {
'--web-security': 'no',
coverage: {
disposeCollector: true,
src: ['src/main/js/bmap.js', 'src/main/js/bmaputil.js'],
instrumentedFiles: 'target/report/ins/',
htmlReport: 'target/report/coverage',
coberturaReport: 'target/report/',
linesThresholdPct: 50
}
},
all: ['src/test/resources/**/*.html']
},
clean: ['target/'],
demo: {
demoFolder: 'target/demo/',
templateFile: 'index.html',
selectors: [
'browser',
'highResolutionDisplay',
'oldBrowser',
'smartphone.highResolutionDisplay',
'smartphone',
'tablet.highResolutionDisplay',
'tablet'
]
},
sourcetemplates: {
files: ['target/libs/browsermap/bmap.js', 'target/NOTICE']
}
});
grunt.registerTask('demo', 'Provides the demo pages', function() {
grunt.task.requires('clean', 'test', 'copy:browsermap', 'minify', 'copy:minified');
var data = grunt.config('demo'),
evaluatedContent,
path = require('path');
if (data) {
if (!data.demoFolder) {
grunt.log.error('No demo folder has been defined (demo.demoFolder).');
return;
}
if (!data.templateFile) {
grunt.log.error('No template file has been defined (demo.templateFile).');
return;
}
if (!data.selectors || data.selectors.length < 1) {
grunt.log.error('No selectors have been defined (demo.selectors).');
return;
}
var templateFile = path.join(data.demoFolder, data.templateFile);
evaluatedContent = grunt.template.process(grunt.file.read(templateFile));
grunt.file.write(templateFile, evaluatedContent);
for (var i = 0; i < data.selectors.length; i++) {
var fileName = data.templateFile.replace('.html', '.' + data.selectors[i] + '.html');
grunt.file.write(path.join(data.demoFolder, fileName), evaluatedContent);
}
grunt.log.writeln('Generated demo site at ' + data.demoFolder);
} else {
grunt.log.error('Cannot find a configuration for the demo task!');
return;
}
});
grunt.registerTask('sourcetemplates', 'Replaces templates from source files', function() {
grunt.task.requires('clean', 'test', 'copy:browsermap');
var data = grunt.config('sourcetemplates'),
path = require('path'),
files,
file,
content;
if (data) {
files = data.files;
if (!files || !(files instanceof Array)) {
grunt.log.error('No files array defined.');
return;
}
for (var i = 0; i < files.length; i++) {
file = path.normalize(files[i]);
content = grunt.template.process(grunt.file.read(file));
grunt.file.write(file, content);
grunt.log.writeln('Replaced template variables at ' + file);
}
} else {
grunt.log.error('Cannot find a configuration for the sourcetemplates task!');
return;
}
});
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-jsdoc');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-compress');
grunt.loadNpmTasks('grunt-qunit-istanbul');
grunt.registerTask('minify', ['uglify']);
grunt.registerTask('coverage', ['qunit-cov']);
grunt.registerTask('test', ['jshint', 'karma:continuous', 'qunit']);
grunt.registerTask('package', ['clean', 'test', 'copy:browsermap', 'sourcetemplates', 'minify', 'copy:minified', 'demo', 'jsdoc',
'compress:source', 'compress:dist']);
};