blob: 215bbf4a2fe4ee18fcab411743063ebb33e005f7 [file] [log] [blame]
// Licensed 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.
// This is the main application configuration file. It is a Grunt
// configuration file, which you can learn more about here:
// https://github.com/cowboy/grunt/blob/master/docs/configuring.md
/*jslint node: true */
"use strict";
module.exports = function (grunt) {
var helper = require('./tasks/helper.js'),
initHelper = helper.init(grunt),
_ = grunt.util._;
var couch_config = function () {
var default_couch_config = {
fauxton: {
db: helper.couch + 'fauxton',
app: './couchapp.js',
options: {
okay_if_missing: true
}
}
};
var settings_couch_config = initHelper.readSettingsFile().couch_config;
return settings_couch_config || default_couch_config;
}();
var cleanableAddons = function () {
var theListToClean = [];
initHelper.processAddons(function (addon) {
// Only clean addons that are included from a local dir
if (addon.path) {
theListToClean.push("app/addons/" + addon.name);
}
});
return theListToClean;
}();
var cleanable = function () {
// Whitelist files and directories to be cleaned
// You'll always want to clean these two directories
// Now find the external addons you have and add them for cleaning up
return _.union(["dist/", "app/load_addons.js"], cleanableAddons);
}();
var templateSettings = (function getTemplateSettings () {
var settings = initHelper.readSettingsFile();
var i18n = JSON.stringify(initHelper.readI18nFile(), null, ' ');
Object.keys(settings.template).forEach(function (key) {
settings.template[key].variables.generationDate = new Date().toISOString();
if (!settings.template[key].variables.generationLabel) {
settings.template[key].variables.generationLabel = 'Generated: ';
}
settings.template[key].app.i18n = i18n;
});
return settings.template;
})();
var config = {
// The clean task ensures all files are removed from the dist/ directory so
// that no files linger from previous builds.
clean: {
options: {
'force': true
},
release: cleanable
},
template: templateSettings,
// Copy build artifacts and library code into the distribution
// see - http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically
copy: {
couchdb: {
files: [
// this gets built in the template task
{src: "dist/release/index.html", dest: "../../share/www/index.html"},
{src: ["**"], dest: '../../share/www/dashboard.assets/', cwd: 'dist/release/dashboard.assets/', expand: true},
]
},
couchdebug: {
files: [
// this gets built in the template task
{src: "dist/debug/index.html", dest: "../../share/www/index.html"},
]
},
dist:{
files:[
{src: 'dist/debug/index.html', dest: 'dist/release/index.html'},
{src: './favicon.ico', dest: "dist/release/favicon.ico"}
]
},
distDepsRequire: {
files:[
{src: 'assets/**', dest: 'dist/tmp-out/', flatten: false, expand: false},
]
},
debug: {
files:[
{src: './favicon.ico', dest: "dist/debug/favicon.ico"}
]
},
testfiles: {
files:[
{src: ['test/**'], dest: 'dist/debug/', flatten: false, expand: true},
{src: 'assets/**', dest: 'dist/debug/', flatten: false, expand: false},
]
}
},
get_deps: {
"default": {
src: "settings.json"
}
},
gen_load_addons: {
"default": {
src: "settings.json"
}
},
gen_initialize: templateSettings,
checkTestExists: templateSettings,
mkcouchdb: couch_config,
rmcouchdb: couch_config,
couchapp: couch_config,
shell: {
webpack: {
command: 'npm run webpack:dev'
},
webpackrelease: {
command: 'npm run webpack:release'
}
},
exec: {
start_nightWatch: {
command: 'node ' + __dirname + '/node_modules/nightwatch/bin/nightwatch' +
' -c ' + __dirname + '/test/nightwatch_tests/nightwatch.json',
options: {
maxBuffer: 1000 * 1024
}
},
start_nightWatch_with_retries: {
command: 'node ' + __dirname + '/node_modules/nightwatch/bin/nightwatch' +
' -c ' + __dirname + '/test/nightwatch_tests/nightwatch.json' +
' --suiteRetries 3',
options: {
maxBuffer: 1000 * 1024
}
}
},
// generates the nightwatch.json file with appropriate content for this env
initNightwatch: {
default: {
settings: initHelper.readSettingsFile(),
template: 'test/nightwatch_tests/nightwatch.json.underscore',
dest: 'test/nightwatch_tests/nightwatch.json'
}
}
};
grunt.initConfig(config);
/*
* Load Grunt plugins
*/
// Load fauxton specific tasks
grunt.loadTasks('tasks');
grunt.loadNpmTasks('grunt-couchapp');
grunt.loadNpmTasks('grunt-exec');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-shell');
/*
* Default task
*/
// defult task - install minified app to local CouchDB
grunt.registerTask('default', 'couchdb');
/*
* Transformation tasks
*/
grunt.registerTask('test', ['clean:release', 'dependencies', 'copy:debug', 'gen_initialize:development']);
// Fetch dependencies (from git or local dir)
grunt.registerTask('dependencies', ['get_deps', 'gen_load_addons:default']);
// minify code and css, ready for release.
grunt.registerTask('build', ['copy:distDepsRequire', 'shell:webpackrelease']);
/*
* Build the app in either dev, debug, or release mode
*/
// dev server
grunt.registerTask('dev', function () {
console.warn('This is deprecated. Please run npm run dev instead');
});
// build a debug release
grunt.registerTask('debug', ['clean', 'dependencies', "gen_initialize:development",
'copy:debug']);
grunt.registerTask('debugDev', ['clean', 'dependencies', "gen_initialize:development",
'copy:debug', 'shell:webpack']);
grunt.registerTask('devSetup', ['dependencies', "gen_initialize:development",
'copy:debug']);
grunt.registerTask('devSetupWithClean', ['clean', 'devSetup']);
grunt.registerTask('watchRun', ['clean:watch', 'dependencies', 'shell:stylecheck']);
// build a release
grunt.registerTask('release_commons_prefix', ['clean', 'dependencies']);
grunt.registerTask('release_commons_suffix', ['build', 'copy:dist']);
grunt.registerTask('release', ['release_commons_prefix', 'gen_initialize:release', 'release_commons_suffix']);
grunt.registerTask('couchapp_release', ['release_commons_prefix', 'gen_initialize:couchapp', 'release_commons_suffix']);
/*
* Install into CouchDB in either debug, release, or couchapp mode
*/
// make a development install that is server by mochiweb under _utils
grunt.registerTask('couchdebug', ['debug', 'copy:couchdebug']);
// make a minimized install that is server by mochiweb under _utils
grunt.registerTask('couchdb', ['release', 'copy:couchdb']);
// make an install that can be deployed as a couchapp
grunt.registerTask('couchapp_setup', ['couchapp_release']);
// install fauxton as couchapp
grunt.registerTask('couchapp_install', ['rmcouchdb:fauxton', 'mkcouchdb:fauxton', 'couchapp:fauxton']);
// setup and install fauxton as couchapp
grunt.registerTask('couchapp_deploy', ['couchapp_setup', 'couchapp_install']);
/*
* Nightwatch functional testing
*/
//Start Nightwatch test from terminal, using: $ grunt nightwatch
grunt.registerTask('nightwatch', ['initNightwatch', 'exec:start_nightWatch']);
//Same as above but the Nightwatch runner will retry tests 3 times before failing
grunt.registerTask('nightwatch_retries', ['initNightwatch', 'exec:start_nightWatch_with_retries']);
};