Skip to content

Instantly share code, notes, and snippets.

@aearly
Last active December 22, 2015 21:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aearly/6530898 to your computer and use it in GitHub Desktop.
Save aearly/6530898 to your computer and use it in GitHub Desktop.
Yeoman modified for CommonJS/Browserify
"use strict";
var LIVERELOAD_PORT = 35729;
var lrSnippet = require("connect-livereload")({port: LIVERELOAD_PORT});
var mountFolder = function (connect, dir) {
return connect.static(require("path").resolve(dir));
};
// # Globbing
// for performance reasons we"re only matching one level down:
// "test/spec/{,*/}*.js"
// use this if you want to match all subfolders:
// "test/spec/**/*.js"
// templateFramework: "lodash"
module.exports = function (grunt) {
// load all grunt tasks
require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks);
// configurable paths
var yeomanConfig = {
app: "app",
dist: "dist"
};
grunt.initConfig({
yeoman: yeomanConfig,
watch: {
options: {
nospawn: true,
livereload: true
},
compass: {
files: ["<%= yeoman.app %>/styles/{,*/}*.{scss,sass}"],
tasks: ["compass:server", "autoprefixer" ]
},
styles: {
files: ["<%= yeoman.app %>/styles/{,*/}*.css"],
tasks: ["copy:styles", "autoprefixer"]
},
images: {
files: ["<%= yeoman.app %>/images/{,*/}*"],
tasks: ["copy:styles", "autoprefixer"]
},
scripts: {
files: [
"<%= yeoman.app %>/scripts/{,*/}*.js",
"!<%= yeoman.app %>/scripts/*.browserify.js",
"!<%= yeoman.app %>/scripts/vendor/**",
"<%= yeoman.app %>/scripts/templates/{,*/}*.hbs"
],
tasks: ["browserify:dist", "concat"]
},
vendor: {
files: [
"<%= yeoman.app %>/scripts/vendor/**",
"<%= yeoman.app %>/bower_components/**"
],
tasks: ["browserify", "concat"]
},
livereload: {
options: {
livereload: LIVERELOAD_PORT
},
files: [
"<%= yeoman.app %>/*.html",
"{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css",
"{.tmp,<%= yeoman.app %>}/scripts/main.browserify.js",
"<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}"
]
}
},
connect: {
options: {
port: 9000,
// change this to "0.0.0.0" to access the server from outside
hostname: "localhost"
},
livereload: {
options: {
middleware: function (connect) {
return [
lrSnippet,
mountFolder(connect, ".tmp"),
mountFolder(connect, yeomanConfig.app)
];
}
}
},
test: {
options: {
middleware: function (connect) {
return [
mountFolder(connect, ".tmp"),
mountFolder(connect, "test"),
mountFolder(connect, yeomanConfig.app)
];
}
}
},
dist: {
options: {
middleware: function (connect) {
return [
mountFolder(connect, yeomanConfig.dist)
];
}
}
}
},
open: {
server: {
path: "http://localhost:<%= connect.options.port %>"
}
},
clean: {
dist: [".tmp", "<%= yeoman.dist %>/*"],
server: ".tmp"
},
jshint: {
options: {
jshintrc: ".jshintrc"
},
all: [
"Gruntfile.js",
"<%= yeoman.app %>/scripts/{,*/}*.js",
"!<%= yeoman.app %>/scripts/*.browserify.js",
"!<%= yeoman.app %>/scripts/vendor/*",
"test/spec/{,*/}*.js"
]
},
mocha: {
all: {
options: {
run: true,
urls: ["http://localhost:<%= connect.options.port %>/index.html"]
}
}
},
compass: {
options: {
sassDir: "<%= yeoman.app %>/styles",
cssDir: ".tmp/styles",
imagesDir: "<%= yeoman.app %>/images",
javascriptsDir: "<%= yeoman.app %>/scripts",
fontsDir: "<%= yeoman.app %>/styles/fonts",
importPath: "<%= yeoman.app %>/bower_components",
relativeAssets: true
},
dist: {},
server: {
options: {
debugInfo: true
}
}
},
autoprefixer: {
options: {
browsers: ["last 1 version"]
},
dist: {
files: [{
expand: true,
cwd: ".tmp/styles/",
src: "{,*/}*.css",
dest: ".tmp/styles/"
}]
}
},
// not used since Uglify task does concat,
// but still available if needed
/*concat: {
dist: {}
},*/
browserify: {
vendor: {
files: {
"app/scripts/vendor.browserify.js": ["app/scripts/vendor/no_conflict.js"]
},
options: {
shim: {
jquery: {path: "app/bower_components/jquery/jquery.js", exports: "$"},
chart: {path: "app/scripts/vendor/chart.js", exports: "Chart"},
backbone: {
path: "app/bower_components/backbone/backbone",
exports: "Backbone",
depends: {
underscore: "_",
jquery: "jQuery"
}
},
marionette: {
path: "app/scripts/vendor/backbone.marionette",
exports: "Marionette",
depends: {
underscore: "_",
backbone: "Backbone"
}
},
bootstrap: {
path: "app/scripts/vendor/bootstrap",
depends: {jquery: "jQuery"},
exports: null
},
"bootstrap-lightbox": {
path: "app/scripts/vendor/bootstrap-lightbox",
depends: {jquery: "jQuery"},
exports: null
},
"bootstrap-datepicker": {
path: "app/bower_components/bootstrap-datepicker/js/bootstrap-datepicker",
depends: {jquery: "jQuery"},
exports: null
},
pagination: {
path: "app/scripts/vendor/jquery.simplePagination.js",
depends: {jquery: "jQuery"},
exports: null
},
classyCompare: {
path: "app/scripts/vendor/jquery.classycompare.js",
depends: {jquery: "jQuery"},
exports: null
}
}
}
},
dist: {
files: {
"app/scripts/app.browserify.js": ["app/scripts/app.js"]
},
options: {
transform: ["brfs"], // so we can load mustache templates from the file system
external: [
"jquery",
"chart",
"backbone",
"marionette",
"bootstrap",
"bootstrap-datepicker",
"bootstrap-lightbox",
"pagination",
"classyCompare"
]
}
}
},
concat: {
main: {
src: ["app/scripts/vendor.browserify.js", "app/scripts/app.browserify.js"],
dest: "app/scripts/main.browserify.js",
options: {
banner: "(function(){var oldRequire = window.require, oldWindow = Object.keys(window);",
footer: "window.require = oldRequire; console.log('global leaks:'); Object.keys(window).forEach(function (key) {" +
" !~oldWindow.indexOf(key) && console.log(key); })}());"
}
}
},
useminPrepare: {
html: "<%= yeoman.app %>/index.html",
options: {
dest: "<%= yeoman.dist %>"
}
},
usemin: {
html: ["<%= yeoman.dist %>/*.html"],
css: ["<%= yeoman.dist %>/styles/{,*/}*.css"],
options: {
dirs: ["<%= yeoman.dist %>"]
}
},
rev: {
dist: {
files: {
src: [
"<%= yeoman.dist %>/scripts/{,*/}*.js",
"<%= yeoman.dist %>/styles/{,*/}*.css",
"<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}",
"<%= yeoman.dist %>/styles/fonts/*"
]
}
}
},
cssmin: {
dist: {
files: {
"<%= yeoman.dist %>/styles/main.css": [
".tmp/styles/{,*/}*.css",
"<%= yeoman.app %>/styles/{,*/}*.css"
]
}
}
},
// Put files not handled in other tasks here
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: "<%= yeoman.app %>",
dest: "<%= yeoman.dist %>",
src: [
"*.{ico,png,txt}",
".htaccess",
"images/**",
"styles/fonts/*",
"index.html"
]
}, {
expand: true,
cwd: ".tmp/images",
dest: "<%= yeoman.dist %>/images",
src: [
"generated/*"
]
}, {
expand: true,
cwd: "<%= yeoman.app %>/bower_components/sass-bootstrap/fonts/",
src: "*",
dest: "<%= yeoman.dist %>/styles/fonts"
}]
},
styles: {
files: [{
expand: true,
dot: true,
cwd: "<%= yeoman.app %>/styles",
dest: ".tmp/styles/",
src: "{,*/}*.css"
}, {
expand: true,
dot: true,
cwd: "<%= yeoman.app %>/styles/fonts/",
dest: ".tmp/styles/fonts/",
src: "*"
}, {
expand: true,
dot: true,
cwd: "<%= yeoman.app %>/images",
dest: ".tmp/images/",
src: "*"
}]
}
},
concurrent: {
server: [
"compass",
"copy:styles"
],
test: [
"copy:styles"
],
dist: [
"compass",
"copy:styles"
]
},
bower: {
// options: {
// exclude: ["modernizr"]
// },
all: {
dest: ["app/bower_components"]
}
},
aws: require("./config/environment").aws,
aws_s3: {
options: {
accessKeyId: "<%= aws.accessKeyId %>",
secretAccessKey: "<%= aws.secretAccessKey %>",
bucket: "<%= aws.bucket %>",
region: "<%= aws.region %>",
access: "public-read"
},
dev: {
files: [
{expand: true, cwd: "dist", src: ["**"], dest: "dist"}
]
}
}
});
grunt.registerTask("server", function (target) {
if (target === "dist") {
return grunt.task.run(["build", "open", "connect:dist:keepalive"]);
}
grunt.task.run([
"clean:server",
"compass:server",
"browserify",
"concat",
"concurrent:server",
"autoprefixer",
"connect:livereload",
//"open",
"watch"
]);
});
grunt.registerTask("test", [
"clean:server",
"compass",
"concurrent:test",
"autoprefixer",
"connect:test",
"mocha"
]);
grunt.registerTask("build", [
"jshint",
"test",
"clean:dist",
"compass:dist",
"useminPrepare",
"concurrent:dist",
"autoprefixer",
"browserify",
"concat",
//"cssmin",
//"uglify",
"copy",
"rev",
"usemin"
]);
grunt.registerTask("deploy", [
"build",
"aws_s3"
]);
grunt.registerTask("default", [
"build"
]);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment