You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

347 lines
10 KiB

  1. 'use strict';
  2. // # Globbing
  3. // for performance reasons we're only matching one level down:
  4. // 'test/spec/{,*/}*.js'
  5. // use this if you want to match all subfolders:
  6. // 'test/spec/**/*.js'
  7. module.exports = function (grunt) {
  8. // load all grunt tasks
  9. require('load-grunt-tasks')(grunt);
  10. // show elapsed time at the end
  11. require('time-grunt')(grunt);
  12. grunt.loadNpmTasks('grunt-npm-command');
  13. // configurable paths
  14. var yeomanConfig = {
  15. app: require('./bower.json').appPath || 'src',
  16. dist: 'dist/'
  17. };
  18. grunt.initConfig({
  19. yeoman: yeomanConfig,
  20. watch: {
  21. less: {
  22. files: ['<%= yeoman.app %>/styles/{,*/}*.less'],
  23. tasks: ['less']
  24. },
  25. gruntfile: {
  26. files: ['Gruntfile.js']
  27. },
  28. includes: {
  29. files: ['<%= yeoman.app %>/*.html', '.tmp/*.html'],
  30. tasks: ['includes:server']
  31. },
  32. livereload: {
  33. options: {
  34. livereload: '<%= connect.options.livereload %>'
  35. },
  36. files: [
  37. '<%= yeoman.app %>/*.html',
  38. '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
  39. '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
  40. '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
  41. ],
  42. tasks: ['includes:server']
  43. }
  44. },
  45. connect: {
  46. options: {
  47. port: 9000,
  48. // change this to '0.0.0.0' to access the server from outside
  49. hostname: 'localhost',
  50. livereload: 35729
  51. },
  52. livereload: {
  53. options: {
  54. open: true,
  55. base: [
  56. '.tmp',
  57. '<%= yeoman.app %>'
  58. ]
  59. }
  60. },
  61. test: {
  62. options: {
  63. port: 9001,
  64. base: [
  65. '.tmp',
  66. 'test',
  67. '<%= yeoman.app %>'
  68. ]
  69. }
  70. },
  71. dist: {
  72. options: {
  73. base: '<%= yeoman.dist %>'
  74. }
  75. }
  76. },
  77. clean: {
  78. dist: {
  79. files: [{
  80. dot: true,
  81. src: [
  82. '.tmp',
  83. '<%= yeoman.dist %>/*',
  84. '!<%= yeoman.dist %>/.git*'
  85. ]
  86. }]
  87. },
  88. server: '.tmp'
  89. },
  90. jshint: {
  91. options: {
  92. jshintrc: '.jshintrc',
  93. reporter: require('jshint-stylish')
  94. },
  95. all: [
  96. 'Gruntfile.js',
  97. '<%= yeoman.app %>/scripts/{,*/}*.js',
  98. '!<%= yeoman.app %>/scripts/vendor/*',
  99. 'test/spec/{,*/}*.js'
  100. ]
  101. },
  102. less: {
  103. dist: {
  104. files: {
  105. '<%= yeoman.app %>/styles/main.css': ['<%= yeoman.app %>/styles/main.less']
  106. },
  107. options: {
  108. sourceMap: true,
  109. sourceMapFilename: '<%= yeoman.app %>/styles/main.css.map',
  110. sourceMapBasepath: '<%= yeoman.app %>/',
  111. sourceMapRootpath: '/'
  112. }
  113. }
  114. },
  115. includes: {
  116. build: {
  117. cwd: '<%= yeoman.app %>',
  118. src: ['*.html', 'includes/*.html'],
  119. dest: '<%= yeoman.dist %>',
  120. options: {
  121. flatten: true,
  122. banner: ''
  123. }
  124. },
  125. server: {
  126. cwd: '<%= yeoman.app %>',
  127. src: ['*.html', 'includes/*.html'],
  128. dest: '.tmp',
  129. options: {
  130. flatten: true,
  131. banner: ''
  132. }
  133. }
  134. },
  135. concat: {
  136. generated: {
  137. files: [
  138. {
  139. dest: '.tmp/scripts/main.js',
  140. src: [
  141. '<%= yeoman.app %>/bower_components/jquery/dist/jquery.js',
  142. '<%= yeoman.app %>/bower_components/uri.js/src/URI.min.js',
  143. '<%= yeoman.app %>/bower_components/bootstrap/js/transition.js',
  144. '<%= yeoman.app %>/bower_components/bootstrap/js/collapse.js',
  145. '<%= yeoman.app %>/scripts/showdown.js',
  146. '<%= yeoman.app %>/scripts/base.js'
  147. ]
  148. },
  149. {
  150. dest: '.tmp/scripts/vendor/modernizr.js',
  151. src: ['<%= yeoman.app %>/bower_components/modernizr/modernizr.js']
  152. },
  153. {
  154. dest: '.tmp/scripts/vendor/video.js',
  155. src: ['<%= yeoman.app %>/bower_components/videojs/dist/video.js']
  156. }
  157. ]
  158. }
  159. },
  160. uglify: {
  161. generated: {
  162. options: {
  163. mangle: {},
  164. compress: {}
  165. },
  166. files: [
  167. {
  168. dest: '<%= yeoman.dist %>/scripts/main.js',
  169. src: ['.tmp/scripts/main.js']
  170. },
  171. {
  172. dest: '<%= yeoman.dist %>/scripts/vendor/modernizr.js',
  173. src: ['.tmp/scripts/vendor/modernizr.js']
  174. },
  175. {
  176. dest: '<%= yeoman.dist %>/scripts/vendor/video.js',
  177. src: ['.tmp/scripts/vendor/video.js']
  178. }
  179. ]
  180. }
  181. },
  182. rev: {
  183. dist: {
  184. files: {
  185. src: [
  186. '<%= yeoman.dist %>/scripts/{,*/}*.js',
  187. '<%= yeoman.dist %>/styles/{,*/}*.css',
  188. '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
  189. '<%= yeoman.dist %>/fonts/{,*/}*.*'
  190. ]
  191. }
  192. }
  193. },
  194. imagemin: {
  195. dist: {
  196. files: [{
  197. expand: true,
  198. cwd: '<%= yeoman.app %>/images',
  199. src: '{,*/}*.{png,jpg,jpeg}',
  200. dest: '<%= yeoman.dist %>/images'
  201. }]
  202. }
  203. },
  204. cssmin: {
  205. dist: {
  206. files: {
  207. '<%= yeoman.dist %>/styles/main.css': [
  208. '.tmp/styles/{,*/}*.css',
  209. '<%= yeoman.app %>/styles/{,*/}*.css'
  210. ]
  211. }
  212. }
  213. },
  214. htmlmin: {
  215. dist: {
  216. options: {
  217. /*removeCommentsFromCDATA: true,
  218. // https://github.com/yeoman/grunt-usemin/issues/44
  219. //collapseWhitespace: true,
  220. collapseBooleanAttributes: true,
  221. removeAttributeQuotes: true,
  222. removeRedundantAttributes: true,
  223. useShortDoctype: true,
  224. removeEmptyAttributes: true,
  225. removeOptionalTags: true*/
  226. },
  227. files: [{
  228. expand: true,
  229. cwd: '<%= yeoman.app %>',
  230. src: '*.html',
  231. dest: '<%= yeoman.dist %>'
  232. }]
  233. }
  234. },
  235. 'npm-command': {
  236. 'videojs-install': {
  237. options: {
  238. cwd: '<%= yeoman.app %>/bower_components/videojs/'
  239. }
  240. },
  241. 'videojs-build': {
  242. options: {
  243. cmd: 'run-script',
  244. args: ['build'],
  245. cwd: '<%= yeoman.app %>/bower_components/videojs/'
  246. }
  247. }
  248. },
  249. copy: {
  250. dist: {
  251. files: [{
  252. expand: true,
  253. dot: true,
  254. cwd: '<%= yeoman.app %>',
  255. dest: '<%= yeoman.dist %>',
  256. src: [
  257. '*.{ico,png,txt}',
  258. 'fonts/{,*/}*.*',
  259. '.htaccess',
  260. 'index.txt',
  261. '404.txt',
  262. 'images/{,*/}*.{webp,gif,svg}'
  263. ]
  264. }]
  265. },
  266. server: {
  267. files: [{
  268. expand: true,
  269. dot: true,
  270. cwd: '<%= yeoman.app %>/bower_components/font-awesome/fonts/',
  271. dest: '<%= yeoman.app %>/fonts/font-awesome',
  272. src: ['*']
  273. }, {
  274. expand: true,
  275. dot: true,
  276. cwd: '<%= yeoman.app %>/bower_components/bootstrap/dist/fonts/',
  277. dest: '<%= yeoman.app %>/fonts/glyphicons',
  278. src: ['*']
  279. }]
  280. }
  281. },
  282. concurrent: {
  283. dist: [
  284. 'less',
  285. 'imagemin',
  286. 'htmlmin'
  287. ]
  288. }
  289. });
  290. grunt.loadNpmTasks('grunt-npm-command');
  291. grunt.registerTask('serve', function (target) {
  292. if (target === 'dist') {
  293. return grunt.task.run(['build', 'connect:dist:keepalive']);
  294. }
  295. grunt.task.run([
  296. 'clean:server',
  297. 'less',
  298. 'includes:server',
  299. 'copy:server',
  300. 'connect:livereload',
  301. 'watch'
  302. ]);
  303. });
  304. grunt.registerTask('server', function () {
  305. grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
  306. grunt.task.run(['serve']);
  307. });
  308. grunt.registerTask('test', [
  309. 'clean:server',
  310. 'less',
  311. 'copy:server',
  312. 'connect:test'
  313. ]);
  314. grunt.registerTask('build', [
  315. 'clean:dist',
  316. 'npm-command',
  317. 'copy:server',
  318. 'concurrent',
  319. 'cssmin',
  320. 'concat',
  321. 'includes:build',
  322. 'uglify',
  323. 'copy'
  324. ]);
  325. grunt.registerTask('default', [
  326. 'jshint',
  327. 'test',
  328. 'build'
  329. ]);
  330. };