/** * Gruntfile * * If you created your Sails app with `sails new foo --linker`, * the following files will be automatically injected (in order) * into the EJS and HTML files in your `views` and `assets` folders. * * At the top part of this file, you'll find a few of the most commonly * configured options, but Sails' integration with Grunt is also fully * customizable. If you'd like to work with your assets differently * you can change this file to do anything you like! * * More information on using Grunt to work with static assets: * http://gruntjs.com/configuring-tasks */ module.exports = function (grunt) { var cssFilesToInject = [ // Vendors 'styles/vendor/**/*.css', // All of the rest of your app styles imported here 'styles/**/*.css' ]; var jsFilesToInject = [ // Below, as a demonstration, you'll see the built-in dependencies // linked in the proper order order // Bring in the socket.io client //'scripts/vendor/socket.io.js', // A simpler boilerplate library for getting you up and running w/ an // automatic listener for incoming messages from Socket.io. //'scripts/vendor/app.js', // Vendors 'scripts/vendor/**/*.js', // Marionnette Application 'scripts/config/**/*.js', 'scripts/app.js', 'scripts/controllers/**/*.js', 'scripts/entities/**/*.js', 'scripts/views/**/*.js', 'scripts/components/**/*.js', 'scripts/apps/**/*.js', // All of the rest of your app scripts imported here 'scripts/**/*.js' ]; var templateFilesToInject = [ 'templates/**/*.html', ]; var ecoFilesToInject = [ 'templates/**/*.eco', 'scripts/**/*.eco', 'scripts/apps/**/**/templates/*.eco' ]; // Modify css file injection paths to use cssFilesToInject = cssFilesToInject.map(function (path) { return 'www/' + path; }); // Modify js file injection paths to use jsFilesToInject = jsFilesToInject.map(function (path) { return 'www/' + path; }); templateFilesToInject = templateFilesToInject.map(function (path) { return 'assets/' + path; }); ecoFilesToInject = ecoFilesToInject.map(function (path) { return 'assets/' + path; }); // Get path to core grunt dependencies grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-run'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-sails-linker'); grunt.loadNpmTasks('grunt-contrib-jst'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-contrib-less'); grunt.loadNpmTasks('grunt-contrib-coffee'); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.loadNpmTasks('grunt-eco'); grunt.loadNpmTasks('grunt-groc'); // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), copy: { reload: { files: [ { expand: true, cwd: './assets', src: ['templates/core/reload.html'], dest: 'www', rename: function(dest, src) { return dest + '/index.html' } } ] }, dev: { files: [ { expand: true, cwd: './assets', src: ['**/*.!(coffee|scss|sass|eco|haml)'], dest: 'www' } ] }, build: { files: [ { expand: true, cwd: 'www', src: ['**/*'], dest: 'www' } ] } }, clean: { dev: [ 'www/scripts', 'www/styles', 'www/images', 'www/fonts', 'www/templates', 'www/index.html', 'www/templates.js' ], build: ['www'] }, jst: { dev: { // To use other sorts of templates, specify the regexp below: // options: { // templateSettings: { // interpolate: /\{\{(.+?)\}\}/g // } // }, files: { // 'www/jst.js': templateFilesToInject } } }, eco: { dev: { files: { 'www/templates.js': ecoFilesToInject } } }, less: { dev: { files: [ { expand: true, cwd: 'assets/styles/', src: ['*.less'], dest: 'www/styles/', ext: '.css' } ] } }, sass: { dev: { files: [ { expand: true, cwd: 'assets/styles/', src: ['*.scss', '*.sass'], dest: 'www/styles/', ext: '.css' } ] } }, groc: { markdown: [ "README.md" ], coffeescript: [ "assets/scripts/*.coffee", "assets/scripts/**/*.coffee" ], javascript: [ ], stylesheet: [ "assets/styles/*.scss", "assets/styles/**/*.scss" ], options: { "out": "assets/doc/", "strip": "assets/", "index": "README.md", 'index-page-title': "BambooJS Documentation" } }, coffee: { dev: { options:{ bare:true }, files: [ { expand: true, cwd: 'assets/scripts/', src: ['**/*.coffee'], dest: 'www/scripts/', ext: '.js' } ] } }, concat: { js: { src: jsFilesToInject, dest: 'www/concat/production.js' }, css: { src: cssFilesToInject, dest: 'www/concat/production.css' } }, uglify: { dist: { src: ['www/concat/production.js'], dest: 'www/min/production.js' } }, cssmin: { dist: { src: ['www/concat/production.css'], dest: 'www/min/production.css' } }, 'sails-linker': { devJs: { options: { startTag: '', endTag: '', fileTmpl: '', appRoot: 'www/' }, files: { 'www/**/*.html': jsFilesToInject } }, prodJs: { options: { startTag: '', endTag: '', fileTmpl: '', appRoot: 'www/' }, files: { 'www/**/*.html': ['www/min/production.js'] } }, devStyles: { options: { startTag: '', endTag: '', fileTmpl: '', appRoot: 'www/' }, // cssFilesToInject defined up top files: { 'www/**/*.html': cssFilesToInject } }, prodStyles: { options: { startTag: '', endTag: '', fileTmpl: '', appRoot: 'www/' }, files: { 'www/index.html': ['www/min/production.css'] } }, // Bring in JST template object devTpl: { options: { startTag: '', endTag: '', fileTmpl: '', appRoot: 'www/' }, files: { 'www/index.html': ['www/templates.js'] } }, }, watch: { assets: { // Assets to watch: files: ['assets/**/*'], // When assets are changed: tasks: ['compileAssets', 'linkAssets'] } }, connect: { options: { port: process.env.PORT || 3131, base: 'dist/', }, all: {}, }, concurrent: { options: { logConcurrentOutput: true }, dev: { tasks: ["run:phonegap", "watch"] } }, run: { options: { wait: true//false }, phonegap: { cmd: 'phonegap', args: ['serve', '--no-autoreload', '-p', 3001] } } }); //require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); grunt.registerTask('server', [ 'compileAssets', 'linkAssets', 'concurrent:dev', ]); // When Sails is lifted: grunt.registerTask('default', ['server']); grunt.registerTask('compileAssets', [ 'clean:dev', 'copy:reload', 'jst:dev', 'eco:dev', 'less:dev', 'sass:dev', 'coffee:dev', 'copy:dev' ]); grunt.registerTask('linkAssets', [ // Update link/script/template references in `assets` index.html 'sails-linker:devJs', 'sails-linker:devStyles', 'sails-linker:devTpl' ]); // Build the assets into a web accessible folder. // (handy for phone gap apps, chrome extensions, etc.) grunt.registerTask('build', [ 'compileAssets', 'linkAssets', 'clean:build', 'copy:build' ]); // When sails is lifted in production grunt.registerTask('prod', [ 'clean:dev', 'eco:dev', 'jst:dev', 'less:dev', 'sass:dev', 'copy:dev', 'coffee:dev', 'concat', 'uglify', 'cssmin', 'sails-linker:prodJs', 'sails-linker:prodStyles', 'sails-linker:devTpl' ]); grunt.registerTask('doc', ['groc']); // When API files are changed: // grunt.event.on('watch', function(action, filepath) { // grunt.log.writeln(filepath + ' has ' + action); // // Send a request to a development-only endpoint on the server // // which will reuptake the file that was changed. // var baseurl = grunt.option('baseurl'); // var gruntSignalRoute = grunt.option('signalpath'); // var url = baseurl + gruntSignalRoute + '?action=' + action + '&filepath=' + filepath; // require('http').get(url) // .on('error', function(e) { // console.error(filepath + ' has ' + action + ', but could not signal the Sails.js server: ' + e.message); // }); // }); };