-
Notifications
You must be signed in to change notification settings - Fork 0
/
gruntfile.js
256 lines (235 loc) · 7.72 KB
/
gruntfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'), // Read in package variable from package.json
// Construct a banner containing package and build information
banner: '/* <%= pkg.name %> | <%= pkg.url %> | <%= pkg.license %>\n' +
' * <%= pkg.author %> | <%= pkg.contact %>\n' +
' */\n',
filename: '<%= pkg.name %>',
s: 'src/', // The source directory
d: 'dist/', // The distributable directory, where built files will end up
t: 'test/', // The test directory, for unit test files/specs
/**
* Concatenation setup. Concatenated files are built to a temp concat folder, ready to be picked up by the uglify task
* Includes closure banner and footer. Keep these in if you want to wrap concatenated code in closures
*/
concat: {
options: {
banner: '<%= banner %>' +
'\n;(function() {\n\n"use strict";\n\n',
footer: '\n})();\n'
},
dist: {
src: ['<%= s %>js/*.js'], // Define specific files in dependency order if required
dest: '<%= s %>js/concat/<%= filename %>.js' // Build to a temp concat folder (will be picked up by uglify task)
}
},
/**
* Uglification (minification) setup. Uglified files are built to the js directory and get a .min suffix
*/
uglify: {
options: {
banner: '<%= banner %>'
},
dist: {
files: {
'<%= d %>js/<%= filename %>.min.js': ['<%= concat.dist.dest %>'] // Each concatenated file will get an uglified version
}
}
},
/**
* JSHint static analysis setup
*/
jshint: {
files: ['gruntfile.js', '<%= s %>**/*.js', '<%= t %>**/*.js'], // Analyse this file and all source and test files for errors
options: {
browser: true, // Assume general browser globals
globals: {
predef: [] // Any global variables go here, if required
}
}
},
/**
* Jasmine unit test setup. Includes Istanbul code coverage setup with Coveralls-friendly output
*/
jasmine: {
test: {
src: ['<%= s %>js/**/*.js'], // Define specific files in dependency order if required
options: {
specs: '<%= t %>**/*.js',
}
},
dist: {
src: ['<%= s %>js/**/*.js'], // Define specific files in dependency order if required
options: {
specs: '<%= t %>**/*.js',
template: require('grunt-template-jasmine-istanbul'),
templateOptions: {
coverage: 'coverage/coverage.json',
report: [
{ type: 'lcov', options: { dir: 'coverage' }}, // Create .lcov report, required by Coveralls
{ type: 'html', options: { dir: 'coverage/html' }}, // Create an html report, readable by humans
{ type: 'text-summary' } // Output results to console post-build
],
thresholds: {
// Test result thresholds all set to 0 to begin with. Commented values are suggestions
lines: 0, // 75
statements: 0, // 75
branches: 0, // 75
functions: 0 // 75
}
}
}
}
},
/**
* Coveralls setup. Tells Coveralls where to find code coverage information
*/
coveralls: {
options: {
force: true
},
src: 'coverage/lcov.info'
},
/**
* Less setup
*/
less: {
dev: {
options: {
paths: ['<%= s %>less/**/*.less'] // Process all Less files in Less folder
},
files: {
"<%= s %>css/styles.css": "<%= s %>less/_styles.less", // Build app.css based on _styles.less
}
},
dist: {
options: {
paths: '<%= less.dev.options.paths %>',
compress: true
},
files: {
"<%= d %>css/styles.min.css": "<%= s %>less/_styles.less" // Build app.min.css version for build
}
}
},
/**
* Copy setup
*/
copy: {
dist: {
files: [
// Favicon files
{
expand: true,
cwd: '<%= s %>favicon/realFavicon',
src: '*',
dest: '<%= d %>favicon',
filter: 'isFile'
},
// Image files
{
expand: true,
cwd: '<%= s %>img',
src: '*',
dest: '<%= d %>img',
filter: 'isFile'
}
]
}
},
/**
* Process HTML step. Replaces sections of index.html to create a production copy
*/
processhtml: {
dist: {
options: {
data: {
title: '<%= pkg.name %>',
filename: '<%= filename %>'
}
},
files: {
'index.html': ['<%= s %>index.html'] // Create index.html in root to enable easy publication to GitHub Pages
}
}
},
/**
* Favicon setup. The src image will be used to create favicons, manifest etc in the dist html
*/
realFavicon: {
dist: {
src: '<%= s %>favicon/example.png',
dest: '<%= d %>favicon',
options: {
iconsPath: './<%= d %>favicon',
html: [ 'index.html' ],
design: {
ios: {
pictureAspect: 'backgroundAndMargin',
backgroundColor: '#ffffff',
margin: '14%'
},
desktopBrowser: {},
windows: {
pictureAspect: 'whiteSilhouette',
backgroundColor: '#da532c',
onConflict: 'override'
},
androidChrome: {
pictureAspect: 'backgroundAndMargin',
margin: '17%',
backgroundColor: '#ffffff',
themeColor: '#ffffff',
manifest: {
name: 'projectName',
display: 'browser',
orientation: 'notSet',
onConflict: 'override'
}
},
safariPinnedTab: {
pictureAspect: 'blackAndWhite',
threshold: 75,
themeColor: '#5bbad5'
}
},
settings: {
scalingAlgorithm: 'Mitchell',
errorOnImageTooSmall: false
}
}
}
},
/**
* Watch setup. The configured tasks will run when and of the files tested by JSHint are changed
*/
watch: {
js: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'jasmine:test']
},
less: {
files: ['<%= less.dev.options.paths %>'],
tasks: ['less:dev']
}
}
});
// Load tasks in this order
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-jasmine');
grunt.loadNpmTasks('grunt-coveralls');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-processhtml');
grunt.loadNpmTasks('grunt-real-favicon');
grunt.loadNpmTasks('grunt-contrib-watch');
// Register test and build tasks. These can be run from the command line with "grunt test" or "grunt build"
grunt.registerTask('test', ['jshint', 'jasmine:test']);
grunt.registerTask('build', ['jshint', 'jasmine:dist', 'less:dist', 'concat:dist', 'uglify:dist', 'copy:dist', 'processhtml:dist', 'realFavicon:dist']);
// Register travis task. This is used by Travis CI to run the test tasks followed by a call to Coveralls
grunt.registerTask('travis', ['jshint', 'jasmine:dist', 'coveralls']);
// "grunt watch" should be run while developing to notify you when things go wrong
};