Skip to content

Instantly share code, notes, and snippets.

@pocotan001
Last active December 17, 2015 09:49
Show Gist options
  • Save pocotan001/5590345 to your computer and use it in GitHub Desktop.
Save pocotan001/5590345 to your computer and use it in GitHub Desktop.
Gruntfile.coffee
module.exports = (grunt) ->
config =
pkg: grunt.file.readJSON("package.json")
jshintrc: grunt.file.readJSON(".jshintrc")
banner: "/*! <%= pkg.name %> (<%= grunt.template.today(\"yyyy-mm-dd\") %>) */"
server:
base: "."
startup: "doc/html"
dir:
doc: "doc"
src: "src"
concat:
css:
options:
banner: """
<%= banner %>
@charset "utf-8";
"""
process: (src, filepath) ->
src.replace(/(['"]..\/)..\//g, "$1")
files: [
src: [
"<%= dir.src %>/css/common/reset.css"
"<%= dir.src %>/css/common/base.css"
"<%= dir.src %>/css/common/helper.css"
"<%= dir.src %>/css/common/state.css"
"<%= dir.src %>/css/modules/*.css"
"<%= dir.src %>/css/units/*.css"
]
dest: "<%= dir.src %>/css/app.css"
]
app:
options:
banner: """
<%= banner %>
(function(window, document) {
"""
footer: """
})(this, this.document);
"""
files: [
src: [
"<%= dir.src %>/js/app/setup.js"
"<%= dir.src %>/js/app/templates.js"
"<%= dir.src %>/js/app/utils/**/*.js"
"<%= dir.src %>/js/app/models/**/*.js"
"<%= dir.src %>/js/app/collections/**/*.js"
"<%= dir.src %>/js/app/views/**/*.js"
]
dest: "<%= dir.src %>/js/app.js"
]
vendor:
files: [
src: [
"<%= dir.src %>/js/vendor/jquery.js"
"<%= dir.src %>/js/vendor/lodash.js"
"<%= dir.src %>/js/vendor/backbone.js"
"<%= dir.src %>/js/vendor/handlebars.js"
"<%= dir.src %>/js/vendor/plugin/**/*.js"
]
dest: "<%= dir.src %>/js/vendor.js"
]
license:
files: [
src: [
"<%= dir.src %>/js/vendor/_license.js"
"<%= dir.src %>/js/vendor.min.js"
]
dest: "<%= dir.src %>/js/vendor.min.js"
]
replace:
icon:
src: "<%= dir.src %>/css/modules/icon.css"
overwrite: true
replacements: [
from: "/* Icons */"
to: ""
,
from: ".icon_"
to: ".icon--"
,
from: /\.(icon\-\-\.+?)\:/g
to: """
/* ```
<i class="icon $1"></i>
``` */
.$1:
"""
]
dev:
src: "<%= dir.src %>/js/app.js"
overwrite: true
replacements: [
from: /(Backbone\.history\.start\([\s\S]+?root\W*?\:\W*?['"])[\w\W]*?(['"])/
to: "$1/<%= server.startup %>/$2"
,
from: /\(\/\)(['"])/g
to: "(/)(index.html)$1"
]
undebugg:
src: "<%= dir.src %>/js/app.js"
overwrite: true
replacements: [
from: /(?:console\.[\w\W]+?\)|debugger)[;\s]/g
to: ""
]
cssmin:
app:
options:
banner: "<%= banner %>"
keepSpecialComments: 0
report: "min"
files: [
src: "<%= dir.src %>/css/app.css"
dest: "<%= dir.src %>/css/app.min.css"
]
# requires fontforge & ttfautohint `brew install fontforge ttfautohint`
webfont:
icon:
options:
font: "icon"
# types: ["woff", "ttf", "eot"]
types: ["woff", "ttf"]
htmlDemo: false
src: "<%= dir.src %>/font/svg/*.svg"
dest: "<%= dir.src %>/font/"
destCss: "<%= dir.src %>/css/modules/"
handlebars:
compile:
options:
namespace: "App.Templates"
processName: (filepath) ->
filepath.replace("src/js/hbs/", "")
files: [
src: "<%= dir.src %>/js/hbs/**/*.hbs"
dest: "<%= dir.src %>/js/app/templates.js"
]
uglify:
app:
options:
report: "min"
preserveComments: "some"
sourceMap: "<%= dir.src %>/js/app.js.map"
sourceMappingURL: "app.js.map"
sourceMapPrefix: 2
files: [
src: "<%= dir.src %>/js/app.js"
dest: "<%= dir.src %>/js/app.min.js"
]
vendor:
options:
report: "min"
files: [
src: "<%= dir.src %>/js/vendor.js"
dest: "<%= dir.src %>/js/vendor.min.js"
]
jshint:
options: "<%= jshintrc %>"
all: "<%= dir.src %>/js/app/**/*.js"
connect:
server:
options:
livereload: true
base: "<%= server.base %>"
open: "http://localhost:8000/<%= server.startup %>/"
watch:
options:
spawn: false
livereload: true
dateFormat: (time) ->
msg = grunt.log.wordlist(["\n✄---------- Completed in " + time + "s ----------✂\n"], color: "cyan")
grunt.log.writeln(msg)
html:
files: "<%= dir.doc %>/html/**/**/**/*.html"
tasks: []
css:
files: ["<%= dir.src %>/css/**/*.css", "!<%= dir.src %>/css/*.css"]
tasks: ["concat:css", "styleguide"]
js:
files: ["<%= dir.src %>/js/app/**/*.js", "!<%= dir.src %>/js/*.js"]
tasks: ["jshint:all", "concat:app", "replace:dev"]
hbs:
files: ["<%= dir.src %>/js/hbs/**/*.hbs"]
tasks: ["handlebars", "concat:app", "replace:dev"]
grunt.initConfig(config)
# load all grunt tasks
require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks)
# on watch events configure to only run on changed file
grunt.event.on("watch", (action, filepath) ->
grunt.config(["jshint", "all"], filepath)
)
grunt.registerTask("default", ["build"])
grunt.registerTask("build", ["cssbuild", "jsbuild"])
grunt.registerTask("cssbuild", ["concat:css", "cssmin", "styleguide"])
grunt.registerTask("jsbuild", ["concat:vendor", "concat:app", "replace:undebugg", "uglify", "concat:license"])
grunt.registerTask("dev", ["connect", "watch"])
grunt.registerTask("icon", ["webfont:icon", "replace:icon", "concat:css"])
grunt.registerTask("styleguide", ->
src = [
"#{config.dir.src}/css/modules/"
"#{config.dir.src}/css/units/"
]
dest = "#{config.dir.doc}/styleguide/css/styles.css"
content = ""
for path in src
dirname = path.split("/").reverse()[1]
content += "/* ### #{dirname} ### */\n\n"
grunt.file.recurse(path, (abspath, rootdir, subdir, filename) ->
if /\.css$/.test(filename)
content += "@import url(\"../../../#{abspath}\");\n"
)
content += "\n"
content += """
/* <!-- Misc --> */
@import url(\"theme.css\");
@import url(\"highlight/styles/googlecode.css\");
@import url(\"../../../#{config.dir.src}/css/common/reset.css\");
@import url(\"../../../#{config.dir.src}/css/common/base.css\");
@import url(\"../../../#{config.dir.src}/css/common/helper.css\");
@import url(\"../../../#{config.dir.src}/css/common/state.css\");
"""
grunt.file.write(dest, content)
)
{
"name": "boilerplate",
"version": "0.0.0",
"contributors": [
"pocotan001"
],
"scripts": {
"test": "testem -l PhantomJS ci"
},
"devDependencies": {
"grunt": "~0.4.0",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-cssmin": "~0.6.0",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-handlebars": "~0.5.0",
"grunt-contrib-connect": "~0.5.0",
"grunt-contrib-watch": "~0.5.0",
"grunt-text-replace": "~0.3.0",
"grunt-webfont": "~0.1.0",
"grunt-notify": "~0.2.0",
"matchdep": "~0.1.0",
"testem": "~0.3.0",
"coffee-script": "~1.6.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment