Gruntfile.js (166 lines of code) (raw):

// 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-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']); };