Add modified gruntfile.js and tasks

This commit is contained in:
Ben Ramey
2014-03-08 18:37:19 -06:00
parent 5476fa7c46
commit e2f0837cbf
13 changed files with 447 additions and 470 deletions

View File

@@ -1,416 +1,59 @@
/**
* 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) { module.exports = function(grunt) {
// load config functio
function loadConfig(path) {
var glob = require('glob');
var object = {};
var key;
glob.sync('*', {
cwd: path
/** }).forEach(function(option) {
* CSS files to inject in order key = option.replace(/.js$/, '');
* (uses Grunt-style wildcard/glob/splat expressions) object[key] = require(path + option)(config);
*
* By default, Sails also supports LESS in development and production.
* To use SASS/SCSS, Stylus, etc., edit the `sails-linker:devStyles` task
* below for more options. For this to work, you may need to install new
* dependencies, e.g. `npm install grunt-contrib-sass`
*/
var cssFilesToInject = [
'linker/**/*.css'
];
/**
* Javascript files to inject in order
* (uses Grunt-style wildcard/glob/splat expressions)
*
* To use client-side CoffeeScript, TypeScript, etc., edit the
* `sails-linker:devJs` task below for more options.
*/
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
'linker/js/socket.io.js',
// then beef it up with some convenience logic for talking to Sails.js
'linker/js/sails.io.js',
// A simpler boilerplate library for getting you up and running w/ an
// automatic listener for incoming messages from Socket.io.
'linker/js/app.js',
// *-> put other dependencies here <-*
// All of the rest of your app scripts imported here
'linker/**/*.js'
];
/**
* Client-side HTML templates are injected using the sources below
* The ordering of these templates shouldn't matter.
* (uses Grunt-style wildcard/glob/splat expressions)
*
* By default, Sails uses JST templates and precompiles them into
* functions for you. If you want to use jade, handlebars, dust, etc.,
* edit the relevant sections below.
*/
var templateFilesToInject = [
'linker/**/*.html'
];
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
// DANGER:
//
// With great power comes great responsibility.
//
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// Modify css file injection paths to use
cssFilesToInject = cssFilesToInject.map(function (path) {
return '.tmp/public/' + path;
}); });
// Modify js file injection paths to use return object;
jsFilesToInject = jsFilesToInject.map(function (path) { }
return '.tmp/public/' + path;
});
require('load-grunt-tasks')(grunt);
templateFilesToInject = templateFilesToInject.map(function (path) { grunt.loadTasks('tasks');
return 'assets/' + path;
});
// Get path to core grunt dependencies from Sails
var depsPath = grunt.option('gdsrc') || 'node_modules/sails/node_modules';
grunt.loadTasks(depsPath + '/grunt-contrib-clean/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-copy/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-concat/tasks');
grunt.loadTasks(depsPath + '/grunt-sails-linker/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-jst/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-watch/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-uglify/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-cssmin/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-less/tasks');
grunt.loadTasks(depsPath + '/grunt-contrib-coffee/tasks');
// Project configuration. // Project configuration.
grunt.initConfig({ var config = {
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),
env: process.env,
cssFilesToInject: [
'linker/**/*.css'
].map(function(path) {
return '.tmp/public/' + path;
}),
jsFilesToInject: [
'linker/js/vendor/socket.io.js',
'linker/js/vendor/sails.io.js',
'linker/js/vendor/jquery-2.1.0.js',
'linker/js/vendor/underscore.js',
'linker/js/vender/json2.js',
'linker/js/vendor/backbone.js',
'linker/js/vendor/bootstrap.js',
'linker/js/app.js',
'linker/js/models/*.js',
'linker/js/collections/*.js',
'linker/js/views/*.js',
'linker/**/*.js'
].map(function(path) {
return '.tmp/public/' + path;
}),
templateFilesToInject: [
'linker/**/*.html'
].map(function(path) {
return 'assets/' + path;
})
};
copy: { grunt.util._.extend(config, loadConfig('./tasks/options/'));
dev: { grunt.initConfig(config);
files: [
{
expand: true,
cwd: './assets',
src: ['**/*.!(coffee)'],
dest: '.tmp/public'
}
]
},
build: {
files: [
{
expand: true,
cwd: '.tmp/public',
src: ['**/*'],
dest: 'www'
}
]
}
},
clean: { // task aliases
dev: ['.tmp/public/**'],
build: ['www']
},
jst: {
dev: {
// To use other sorts of templates, specify the regexp below:
// options: {
// templateSettings: {
// interpolate: /\{\{(.+?)\}\}/g
// }
// },
files: {
'.tmp/public/jst.js': templateFilesToInject
}
}
},
less: {
dev: {
files: [
{
expand: true,
cwd: 'assets/styles/',
src: ['*.less'],
dest: '.tmp/public/styles/',
ext: '.css'
}, {
expand: true,
cwd: 'assets/linker/styles/',
src: ['*.less'],
dest: '.tmp/public/linker/styles/',
ext: '.css'
}
]
}
},
coffee: {
dev: {
options:{
bare:true
},
files: [
{
expand: true,
cwd: 'assets/js/',
src: ['**/*.coffee'],
dest: '.tmp/public/js/',
ext: '.js'
}, {
expand: true,
cwd: 'assets/linker/js/',
src: ['**/*.coffee'],
dest: '.tmp/public/linker/js/',
ext: '.js'
}
]
}
},
concat: {
js: {
src: jsFilesToInject,
dest: '.tmp/public/concat/production.js'
},
css: {
src: cssFilesToInject,
dest: '.tmp/public/concat/production.css'
}
},
uglify: {
dist: {
src: ['.tmp/public/concat/production.js'],
dest: '.tmp/public/min/production.js'
}
},
cssmin: {
dist: {
src: ['.tmp/public/concat/production.css'],
dest: '.tmp/public/min/production.css'
}
},
'sails-linker': {
devJs: {
options: {
startTag: '<!--SCRIPTS-->',
endTag: '<!--SCRIPTS END-->',
fileTmpl: '<script src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/**/*.html': jsFilesToInject,
'views/**/*.html': jsFilesToInject,
'views/**/*.ejs': jsFilesToInject
}
},
prodJs: {
options: {
startTag: '<!--SCRIPTS-->',
endTag: '<!--SCRIPTS END-->',
fileTmpl: '<script src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/**/*.html': ['.tmp/public/min/production.js'],
'views/**/*.html': ['.tmp/public/min/production.js'],
'views/**/*.ejs': ['.tmp/public/min/production.js']
}
},
devStyles: {
options: {
startTag: '<!--STYLES-->',
endTag: '<!--STYLES END-->',
fileTmpl: '<link rel="stylesheet" href="%s">',
appRoot: '.tmp/public'
},
// cssFilesToInject defined up top
files: {
'.tmp/public/**/*.html': cssFilesToInject,
'views/**/*.html': cssFilesToInject,
'views/**/*.ejs': cssFilesToInject
}
},
prodStyles: {
options: {
startTag: '<!--STYLES-->',
endTag: '<!--STYLES END-->',
fileTmpl: '<link rel="stylesheet" href="%s">',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/index.html': ['.tmp/public/min/production.css'],
'views/**/*.html': ['.tmp/public/min/production.css'],
'views/**/*.ejs': ['.tmp/public/min/production.css']
}
},
// Bring in JST template object
devTpl: {
options: {
startTag: '<!--TEMPLATES-->',
endTag: '<!--TEMPLATES END-->',
fileTmpl: '<script type="text/javascript" src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/index.html': ['.tmp/public/jst.js'],
'views/**/*.html': ['.tmp/public/jst.js'],
'views/**/*.ejs': ['.tmp/public/jst.js']
}
},
/*******************************************
* Jade linkers (TODO: clean this up)
*******************************************/
devJsJADE: {
options: {
startTag: '// SCRIPTS',
endTag: '// SCRIPTS END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': jsFilesToInject
}
},
prodJsJADE: {
options: {
startTag: '// SCRIPTS',
endTag: '// SCRIPTS END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/min/production.js']
}
},
devStylesJADE: {
options: {
startTag: '// STYLES',
endTag: '// STYLES END',
fileTmpl: 'link(rel="stylesheet", href="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': cssFilesToInject
}
},
prodStylesJADE: {
options: {
startTag: '// STYLES',
endTag: '// STYLES END',
fileTmpl: 'link(rel="stylesheet", href="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/min/production.css']
}
},
// Bring in JST template object
devTplJADE: {
options: {
startTag: '// TEMPLATES',
endTag: '// TEMPLATES END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/jst.js']
}
}
/************************************
* Jade linker end
************************************/
},
watch: {
api: {
// API files to watch:
files: ['api/**/*']
},
assets: {
// Assets to watch:
files: ['assets/**/*'],
// When assets are changed:
tasks: ['compileAssets', 'linkAssets']
}
}
});
// When Sails is lifted: // When Sails is lifted:
grunt.registerTask('default', [ grunt.registerTask('default', [
@@ -422,13 +65,13 @@ module.exports = function (grunt) {
grunt.registerTask('compileAssets', [ grunt.registerTask('compileAssets', [
'clean:dev', 'clean:dev',
'jst:dev', 'jst:dev',
'jade:templates',
'less:dev', 'less:dev',
'copy:dev', 'copy:dev',
'coffee:dev' 'coffee:dev'
]); ]);
grunt.registerTask('linkAssets', [ grunt.registerTask('linkAssets', [
// Update link/script/template references in `assets` index.html // Update link/script/template references in `assets` index.html
'sails-linker:devJs', 'sails-linker:devJs',
'sails-linker:devStyles', 'sails-linker:devStyles',
@@ -438,7 +81,6 @@ module.exports = function (grunt) {
'sails-linker:devTplJADE' 'sails-linker:devTplJADE'
]); ]);
// Build the assets into a web accessible folder. // Build the assets into a web accessible folder.
// (handy for phone gap apps, chrome extensions, etc.) // (handy for phone gap apps, chrome extensions, etc.)
grunt.registerTask('build', [ grunt.registerTask('build', [

44
tasks/load-asv.js Normal file
View File

@@ -0,0 +1,44 @@
module.exports = function(grunt) {
grunt.registerTask('load-asv', "Loads the ASV verses", function() {
var done = this.async();
var path = '../dbs/t_asv.json';
var json = grunt.file.readJSON(path).resultset.row;
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost/BibleDev', function(err, db) {
if(err) throw err;
var versesColl = db.collection('verse');
grunt.log.writeln('Got collection: ' + versesColl);
grunt.log.writeln('Going to process ' + json.length + ' verses.');
for(var i = 0; i < json.length; i++) {
var verse = {};
for(var k = 0; k < json[i].field.length; k++) {
var value = json[i].field[k]['_'];
var key = json[i].field[k]['$']['name'];
if(key == 'c') key = 'chapter';
else if (key == 'v') key = 'verse';
else if (key == 'b') key = 'book';
else if (key == 't') key = 'text';
else if (key == 'id') key = 'reference';
verse[key] = value;
verse['number'] = i;
}
versesColl.insert(verse, function(err, results) {
if(err) throw err;
});
}
versesColl.count(function(err, count) {
if(err) throw err;
grunt.log.writeln('Wrote ' + count + ' verse(s).');
done();
});
});
});
};

7
tasks/options/clean.js Normal file
View File

@@ -0,0 +1,7 @@
// clean
module.exports = function(config) {
return {
dev: ['.tmp/public/**'],
build: ['www']
};
};

23
tasks/options/coffee.js Normal file
View File

@@ -0,0 +1,23 @@
// coffee
module.exports = function(config) {
return {
dev: {
options: {
bare: true
},
files: [{
expand: true,
cwd: 'assets/js/',
src: ['**/*.coffee'],
dest: '.tmp/public/js/',
ext: '.js'
}, {
expand: true,
cwd: 'assets/linker/js/',
src: ['**/*.coffee'],
dest: '.tmp/public/linker/js/',
ext: '.js'
}]
}
};
};

13
tasks/options/concat.js Normal file
View File

@@ -0,0 +1,13 @@
// concat
module.exports = function(config) {
return {
js: {
src: config.jsFilesToInject,
dest: '.tmp/public/concat/production.js'
},
css: {
src: config.cssFilesToInject,
dest: '.tmp/public/concat/production.css'
}
};
};

21
tasks/options/copy.js Normal file
View File

@@ -0,0 +1,21 @@
// copy
module.exports = function(config) {
return {
dev: {
files: [{
expand: true,
cwd: './assets',
src: ['**/*.!(coffee|jade)'],
dest: '.tmp/public'
}]
},
build: {
files: [{
expand: true,
cwd: '.tmp/public',
src: ['**/*'],
dest: 'www'
}]
}
};
};

9
tasks/options/cssmin.js Normal file
View File

@@ -0,0 +1,9 @@
// cssmin
module.exports = function(config) {
return {
dist: {
src: ['.tmp/public/concat/production.css'],
dest: '.tmp/public/min/production.css'
}
};
};

14
tasks/options/jade.js Normal file
View File

@@ -0,0 +1,14 @@
// jade
module.exports = function(config) {
return {
templates: {
files: [{
expand: true,
cwd: './assets/linker/templates/',
src: ['*.jade'],
dest: './assets/linker/templates/',
ext: '.html'
}]
}
};
};

17
tasks/options/jst.js Normal file
View File

@@ -0,0 +1,17 @@
// jst
module.exports = function(config) {
return {
dev: {
options: {
namespace: 'App.Templates',
templateSettings: {
interpolate: /\{\{(.+?)\}\}/g
}
},
files: {
'.tmp/public/templates.js': config.templateFilesToInject
}
}
};
};

20
tasks/options/less.js Normal file
View File

@@ -0,0 +1,20 @@
// less
module.exports = function(config) {
return {
dev: {
files: [{
expand: true,
cwd: 'assets/styles/',
src: ['*.less'],
dest: '.tmp/public/styles/',
ext: '.css'
}, {
expand: true,
cwd: 'assets/linker/styles/',
src: ['*.less'],
dest: '.tmp/public/linker/styles/',
ext: '.css'
}]
}
};
};

View File

@@ -0,0 +1,141 @@
// sails-linker
module.exports = function(config) { return {
devJs: {
options: {
startTag: '<!--SCRIPTS-->',
endTag: '<!--SCRIPTS END-->',
fileTmpl: '<script src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/**/*.html': config.jsFilesToInject,
'views/**/*.html': config.jsFilesToInject,
'views/**/*.ejs': config.jsFilesToInject
}
},
prodJs: {
options: {
startTag: '<!--SCRIPTS-->',
endTag: '<!--SCRIPTS END-->',
fileTmpl: '<script src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/**/*.html': ['.tmp/public/min/production.js'],
'views/**/*.html': ['.tmp/public/min/production.js'],
'views/**/*.ejs': ['.tmp/public/min/production.js']
}
},
devStyles: {
options: {
startTag: '<!--STYLES-->',
endTag: '<!--STYLES END-->',
fileTmpl: '<link rel="stylesheet" href="%s">',
appRoot: '.tmp/public'
},
// config.cssFilesToInject defined up top
files: {
'.tmp/public/**/*.html': config.cssFilesToInject,
'views/**/*.html': config.cssFilesToInject,
'views/**/*.ejs': config.cssFilesToInject
}
},
prodStyles: {
options: {
startTag: '<!--STYLES-->',
endTag: '<!--STYLES END-->',
fileTmpl: '<link rel="stylesheet" href="%s">',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/index.html': ['.tmp/public/min/production.css'],
'views/**/*.html': ['.tmp/public/min/production.css'],
'views/**/*.ejs': ['.tmp/public/min/production.css']
}
},
// Bring in JST template object
devTpl: {
options: {
startTag: '<!--TEMPLATES-->',
endTag: '<!--TEMPLATES END-->',
fileTmpl: '<script type="text/javascript" src="%s"></script>',
appRoot: '.tmp/public'
},
files: {
'.tmp/public/index.html': ['.tmp/public/templates.js'],
'views/**/*.html': ['.tmp/public/templates.js'],
'views/**/*.ejs': ['.tmp/public/templates.js']
}
},
/*******************************************
* Jade linkers (TODO: clean this up)
*******************************************/
devJsJADE: {
options: {
startTag: '// SCRIPTS',
endTag: '// SCRIPTS END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': config.jsFilesToInject
}
},
prodJsJADE: {
options: {
startTag: '// SCRIPTS',
endTag: '// SCRIPTS END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/min/production.js']
}
},
devStylesJADE: {
options: {
startTag: '// STYLES',
endTag: '// STYLES END',
fileTmpl: 'link(rel="stylesheet", href="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': config.cssFilesToInject
}
},
prodStylesJADE: {
options: {
startTag: '// STYLES',
endTag: '// STYLES END',
fileTmpl: 'link(rel="stylesheet", href="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/min/production.css']
}
},
// Bring in JST template object
devTplJADE: {
options: {
startTag: '// TEMPLATES',
endTag: '// TEMPLATES END',
fileTmpl: 'script(type="text/javascript", src="%s")',
appRoot: '.tmp/public'
},
files: {
'views/**/*.jade': ['.tmp/public/templates.js']
}
}
};};

9
tasks/options/uglify.js Normal file
View File

@@ -0,0 +1,9 @@
// uglify
module.exports = function(config) {
return {
dist: {
src: ['.tmp/public/concat/production.js'],
dest: '.tmp/public/min/production.js'
}
};
};

17
tasks/options/watch.js Normal file
View File

@@ -0,0 +1,17 @@
// watch
module.exports = function(config) {
return {
api: {
// API files to watch:
files: ['api/**/*']
},
assets: {
// Assets to watch:
files: ['assets/**/*'],
// When assets are changed:
tasks: ['compileAssets', 'linkAssets']
}
};
};