Gruntfile.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*!
  2. * Ratchet's Gruntfile
  3. * http://goratchet.com
  4. * Copyright 2014 Connor Sears
  5. * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
  6. */
  7. /* jshint node: true */
  8. module.exports = function(grunt) {
  9. 'use strict';
  10. // Force use of Unix newlines
  11. grunt.util.linefeed = '\n';
  12. RegExp.quote = function (string) {
  13. return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
  14. };
  15. var generateRatchiconsData = require('./grunt/ratchicons-data-generator.js');
  16. // Project configuration.
  17. grunt.initConfig({
  18. pkg: grunt.file.readJSON('package.json'),
  19. // Metadata.
  20. meta: {
  21. distPath: 'dist/',
  22. docsPath: 'docs/dist/',
  23. docsAssetsPath: 'docs/assets/'
  24. },
  25. banner: '/*!\n' +
  26. ' * =====================================================\n' +
  27. ' * Ratchet v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
  28. ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
  29. ' * Licensed under <%= pkg.license %> (https://github.com/twbs/ratchet/blob/master/LICENSE)\n' +
  30. ' *\n' +
  31. ' * v<%= pkg.version %> designed by @connors.\n' +
  32. ' * =====================================================\n' +
  33. ' */\n',
  34. clean: {
  35. dist: ['<%= meta.distPath %>', '<%= meta.docsPath %>']
  36. },
  37. concat: {
  38. ratchet: {
  39. options: {
  40. banner: '<%= banner %>'
  41. },
  42. src: [
  43. 'js/modals.js',
  44. 'js/popovers.js',
  45. 'js/push.js',
  46. 'js/segmented-controllers.js',
  47. 'js/sliders.js',
  48. 'js/toggles.js'
  49. ],
  50. dest: '<%= meta.distPath %>js/<%= pkg.name %>.js'
  51. }
  52. },
  53. sass: {
  54. options: {
  55. banner: '<%= banner %>',
  56. style: 'expanded',
  57. unixNewlines: true
  58. },
  59. dist: {
  60. files: {
  61. '<%= meta.distPath %>css/<%= pkg.name %>.css': 'sass/ratchet.scss',
  62. '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css': 'sass/theme-ios.scss',
  63. '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css': 'sass/theme-android.scss',
  64. '<%= meta.docsAssetsPath %>css/docs.css': 'sass/docs.scss'
  65. }
  66. }
  67. },
  68. csscomb: {
  69. options: {
  70. config: 'sass/.csscomb.json'
  71. },
  72. dist: {
  73. files: {
  74. '<%= meta.distPath %>/css/<%= pkg.name %>.css': '<%= meta.distPath %>/css/<%= pkg.name %>.css',
  75. '<%= meta.distPath %>/css/<%= pkg.name %>-theme-android.css': '<%= meta.distPath %>/css/<%= pkg.name %>-theme-android.css',
  76. '<%= meta.distPath %>/css/<%= pkg.name %>-theme-ios.css': '<%= meta.distPath %>/css/<%= pkg.name %>-theme-ios.css'
  77. }
  78. },
  79. docs: {
  80. files: {
  81. '<%= meta.docsAssetsPath %>/css/docs.css': '<%= meta.docsAssetsPath %>/css/docs.css'
  82. }
  83. }
  84. },
  85. copy: {
  86. fonts: {
  87. expand: true,
  88. src: 'fonts/*',
  89. dest: '<%= meta.distPath %>/'
  90. },
  91. docs: {
  92. expand: true,
  93. cwd: '<%= meta.distPath %>',
  94. src: [
  95. '**/*'
  96. ],
  97. dest: '<%= meta.docsPath %>'
  98. }
  99. },
  100. cssmin: {
  101. options: {
  102. banner: '', // set to empty; see bellow
  103. keepSpecialComments: '*' // set to '*' because we already add the banner in sass
  104. },
  105. ratchet: {
  106. src: '<%= meta.distPath %>css/<%= pkg.name %>.css',
  107. dest: '<%= meta.distPath %>css/<%= pkg.name %>.min.css'
  108. },
  109. theme: {
  110. files: {
  111. '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.min.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css',
  112. '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.min.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css'
  113. }
  114. },
  115. docs: {
  116. src: [
  117. '<%= meta.docsAssetsPath %>css/docs.css',
  118. '<%= meta.docsAssetsPath %>css/pygments-manni.css'
  119. ],
  120. dest: '<%= meta.docsAssetsPath %>css/docs.min.css'
  121. }
  122. },
  123. uglify: {
  124. options: {
  125. banner: '<%= banner %>',
  126. compress: true,
  127. mangle: true,
  128. preserveComments: false
  129. },
  130. ratchet: {
  131. src: '<%= concat.ratchet.dest %>',
  132. dest: '<%= meta.distPath %>js/<%= pkg.name %>.min.js'
  133. },
  134. docs: {
  135. src: [
  136. '<%= meta.docsAssetsPath %>js/docs.js',
  137. '<%= meta.docsAssetsPath %>js/fingerblast.js'
  138. ],
  139. dest: '<%= meta.docsAssetsPath %>js/docs.min.js'
  140. }
  141. },
  142. watch: {
  143. scripts: {
  144. files: [
  145. '<%= meta.srcPath %>/**/*.scss'
  146. ],
  147. tasks: ['sass']
  148. }
  149. },
  150. jekyll: {
  151. docs: {}
  152. },
  153. jshint: {
  154. options: {
  155. jshintrc: 'js/.jshintrc'
  156. },
  157. grunt: {
  158. src: ['Gruntfile.js', 'grunt/*.js']
  159. },
  160. src: {
  161. src: 'js/*.js'
  162. },
  163. docs: {
  164. src: ['<%= meta.docsAssetsPath %>/js/docs.js', '<%= meta.docsAssetsPath %>/js/fingerblast.js']
  165. }
  166. },
  167. jscs: {
  168. options: {
  169. config: 'js/.jscsrc'
  170. },
  171. grunt: {
  172. src: '<%= jshint.grunt.src %>'
  173. },
  174. src: {
  175. src: '<%= jshint.src.src %>'
  176. },
  177. docs: {
  178. src: '<%= jshint.docs.src %>'
  179. }
  180. },
  181. csslint: {
  182. options: {
  183. csslintrc: 'sass/.csslintrc'
  184. },
  185. src: [
  186. '<%= meta.distPath %>/css/<%= pkg.name %>.css',
  187. '<%= meta.distPath %>/css/<%= pkg.name %>-theme-android.css',
  188. '<%= meta.distPath %>/css/<%= pkg.name %>-theme-ios.css'
  189. ],
  190. docs: {
  191. options: {
  192. ids: false
  193. },
  194. src: ['<%= meta.docsAssetsPath %>/css/docs.css']
  195. }
  196. },
  197. validation: {
  198. options: {
  199. charset: 'utf-8',
  200. doctype: 'HTML5',
  201. failHard: true,
  202. reset: true,
  203. relaxerror: [
  204. 'Bad value apple-mobile-web-app-title for attribute name on element meta: Keyword apple-mobile-web-app-title is not registered.',
  205. 'Bad value apple-mobile-web-app-status-bar-style for attribute name on element meta: Keyword apple-mobile-web-app-status-bar-style is not registered.',
  206. 'Bad value X-UA-Compatible for attribute http-equiv on element meta.',
  207. 'Attribute ontouchstart not allowed on element body at this point.'
  208. ]
  209. },
  210. files: {
  211. src: '_site/**/*.html'
  212. }
  213. },
  214. sed: {
  215. versionNumber: {
  216. pattern: (function () {
  217. var old = grunt.option('oldver');
  218. return old ? RegExp.quote(old) : old;
  219. })(),
  220. replacement: grunt.option('newver'),
  221. recursive: true
  222. }
  223. }
  224. });
  225. // Load the plugins
  226. require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
  227. require('time-grunt')(grunt);
  228. // Default task(s).
  229. grunt.registerTask('dist-css', ['sass', 'csscomb', 'cssmin']);
  230. grunt.registerTask('dist-js', ['concat', 'uglify']);
  231. grunt.registerTask('dist', ['clean', 'dist-css', 'dist-js', 'copy', 'build-ratchicons-data']);
  232. grunt.registerTask('validate-html', ['jekyll', 'validation']);
  233. grunt.registerTask('build', ['dist']);
  234. grunt.registerTask('default', ['dist']);
  235. grunt.registerTask('test', ['dist', 'csslint', 'jshint', 'jscs', 'validate-html']);
  236. grunt.registerTask('build-ratchicons-data', generateRatchiconsData);
  237. // Version numbering task.
  238. // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
  239. // This can be overzealous, so its changes should always be manually reviewed!
  240. grunt.registerTask('change-version-number', 'sed');
  241. };