Gruntfile.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // AdminLTE Gruntfile
  2. module.exports = function (grunt) { // jshint ignore:line
  3. 'use strict';
  4. grunt.initConfig({
  5. pkg : grunt.file.readJSON('package.json'),
  6. watch: {
  7. less : {
  8. // Compiles less files upon saving
  9. files: ['build/less/*.less'],
  10. tasks: ['less:development', 'less:production']
  11. },
  12. js : {
  13. // Compile js files upon saving
  14. files: ['build/js/*.js', 'dist/js/app.js'],
  15. tasks: ['js']
  16. },
  17. skins: {
  18. // Compile any skin less files upon saving
  19. files: ['build/less/skins/*.less'],
  20. tasks: ['less:skins', 'less:minifiedSkins']
  21. }
  22. },
  23. // 'less'-task configuration
  24. // This task will compile all less files upon saving to create both AdminLTE.css and AdminLTE.min.css
  25. less : {
  26. // Development not compressed
  27. development : {
  28. files: {
  29. // compilation.css : source.less
  30. 'dist/css/AdminLTE.css' : 'build/less/AdminLTE.less',
  31. // AdminLTE without plugins
  32. 'dist/css/alt/AdminLTE-without-plugins.css' : 'build/less/AdminLTE-without-plugins.less',
  33. // Separate plugins
  34. 'dist/css/alt/AdminLTE-select2.css' : 'build/less/select2.less',
  35. 'dist/css/alt/AdminLTE-fullcalendar.css' : 'build/less/fullcalendar.less',
  36. 'dist/css/alt/AdminLTE-bootstrap-social.css': 'build/less/bootstrap-social.less'
  37. }
  38. },
  39. // Production compressed version
  40. production : {
  41. options: {
  42. compress: true
  43. },
  44. files : {
  45. // compilation.css : source.less
  46. 'dist/css/AdminLTE.min.css' : 'build/less/AdminLTE.less',
  47. // AdminLTE without plugins
  48. 'dist/css/alt/AdminLTE-without-plugins.min.css' : 'build/less/AdminLTE-without-plugins.less',
  49. // Separate plugins
  50. 'dist/css/alt/AdminLTE-select2.min.css' : 'build/less/select2.less',
  51. 'dist/css/alt/AdminLTE-fullcalendar.min.css' : 'build/less/fullcalendar.less',
  52. 'dist/css/alt/AdminLTE-bootstrap-social.min.css': 'build/less/bootstrap-social.less'
  53. }
  54. },
  55. // Non minified skin files
  56. skins : {
  57. files: {
  58. 'dist/css/skins/skin-blue.css' : 'build/less/skins/skin-blue.less',
  59. 'dist/css/skins/skin-black.css' : 'build/less/skins/skin-black.less',
  60. 'dist/css/skins/skin-yellow.css' : 'build/less/skins/skin-yellow.less',
  61. 'dist/css/skins/skin-green.css' : 'build/less/skins/skin-green.less',
  62. 'dist/css/skins/skin-red.css' : 'build/less/skins/skin-red.less',
  63. 'dist/css/skins/skin-purple.css' : 'build/less/skins/skin-purple.less',
  64. 'dist/css/skins/skin-blue-light.css' : 'build/less/skins/skin-blue-light.less',
  65. 'dist/css/skins/skin-black-light.css' : 'build/less/skins/skin-black-light.less',
  66. 'dist/css/skins/skin-yellow-light.css': 'build/less/skins/skin-yellow-light.less',
  67. 'dist/css/skins/skin-green-light.css' : 'build/less/skins/skin-green-light.less',
  68. 'dist/css/skins/skin-red-light.css' : 'build/less/skins/skin-red-light.less',
  69. 'dist/css/skins/skin-purple-light.css': 'build/less/skins/skin-purple-light.less',
  70. 'dist/css/skins/_all-skins.css' : 'build/less/skins/_all-skins.less'
  71. }
  72. },
  73. // Skins minified
  74. minifiedSkins: {
  75. options: {
  76. compress: true
  77. },
  78. files : {
  79. 'dist/css/skins/skin-blue.min.css' : 'build/less/skins/skin-blue.less',
  80. 'dist/css/skins/skin-black.min.css' : 'build/less/skins/skin-black.less',
  81. 'dist/css/skins/skin-yellow.min.css' : 'build/less/skins/skin-yellow.less',
  82. 'dist/css/skins/skin-green.min.css' : 'build/less/skins/skin-green.less',
  83. 'dist/css/skins/skin-red.min.css' : 'build/less/skins/skin-red.less',
  84. 'dist/css/skins/skin-purple.min.css' : 'build/less/skins/skin-purple.less',
  85. 'dist/css/skins/skin-blue-light.min.css' : 'build/less/skins/skin-blue-light.less',
  86. 'dist/css/skins/skin-black-light.min.css' : 'build/less/skins/skin-black-light.less',
  87. 'dist/css/skins/skin-yellow-light.min.css': 'build/less/skins/skin-yellow-light.less',
  88. 'dist/css/skins/skin-green-light.min.css' : 'build/less/skins/skin-green-light.less',
  89. 'dist/css/skins/skin-red-light.min.css' : 'build/less/skins/skin-red-light.less',
  90. 'dist/css/skins/skin-purple-light.min.css': 'build/less/skins/skin-purple-light.less',
  91. 'dist/css/skins/_all-skins.min.css' : 'build/less/skins/_all-skins.less'
  92. }
  93. }
  94. },
  95. // Uglify task info. Compress the js files.
  96. uglify: {
  97. options : {
  98. mangle : true,
  99. preserveComments: 'some'
  100. },
  101. production: {
  102. files: {
  103. 'dist/js/app.min.js' : ['dist/js/app.js'],
  104. 'dist/js/adminlte.min.js': ['dist/js/adminlte.js']
  105. }
  106. }
  107. },
  108. // Concatenate JS Files
  109. concat: {
  110. options: {
  111. separator: '\n\n',
  112. banner : '/*! AdminLTE app.js\n'
  113. + '* ================\n'
  114. + '* Main JS application file for AdminLTE v2. This file\n'
  115. + '* should be included in all pages. It controls some layout\n'
  116. + '* options and implements exclusive AdminLTE plugins.\n'
  117. + '*\n'
  118. + '* @Author Almsaeed Studio\n'
  119. + '* @Support <https://www.almsaeedstudio.com>\n'
  120. + '* @Email <abdullah@almsaeedstudio.com>\n'
  121. + '* @version <%= pkg.version %>\n'
  122. + '* @repository <%= pkg.repository.url %>\n'
  123. + '* @license MIT <http://opensource.org/licenses/MIT>\n'
  124. + '*/\n\n'
  125. + '// Make sure jQuery has been loaded\n'
  126. + 'if (typeof jQuery === \'undefined\') {\n'
  127. + 'throw new Error(\'AdminLTE requires jQuery\')\n'
  128. + '}\n\n'
  129. },
  130. dist : {
  131. src : [
  132. 'build/js/Layout.js',
  133. 'build/js/PushMenu.js',
  134. 'build/js/Tree.js',
  135. 'build/js/ControlSidebar.js',
  136. 'build/js/BoxWidget.js',
  137. 'build/js/TodoList.js',
  138. 'build/js/DirectChat.js'
  139. ],
  140. dest: 'dist/js/adminlte.js'
  141. }
  142. },
  143. // Build the documentation files
  144. includes: {
  145. build: {
  146. src : ['*.html'], // Source files
  147. dest : 'documentation/', // Destination directory
  148. flatten: true,
  149. cwd : 'documentation/build',
  150. options: {
  151. silent : true,
  152. includePath: 'documentation/build/include'
  153. }
  154. }
  155. },
  156. // Optimize images
  157. image: {
  158. dynamic: {
  159. files: [
  160. {
  161. expand: true,
  162. cwd : 'build/img/',
  163. src : ['**/*.{png,jpg,gif,svg,jpeg}'],
  164. dest : 'dist/img/'
  165. }
  166. ]
  167. }
  168. },
  169. // Validate JS code
  170. jshint: {
  171. options: {
  172. jshintrc: 'build/js/.jshintrc'
  173. },
  174. grunt : {
  175. options: {
  176. jshintrc: 'build/grunt/.jshintrc'
  177. },
  178. src : 'Gruntfile.js'
  179. },
  180. core : {
  181. src: 'build/js/*.js'
  182. },
  183. demo : {
  184. src: 'dist/js/demo.js'
  185. },
  186. pages : {
  187. src: 'dist/js/pages/*.js'
  188. }
  189. },
  190. jscs: {
  191. options: {
  192. config: 'build/js/.jscsrc'
  193. },
  194. core : {
  195. src: '<%= jshint.core.src %>'
  196. },
  197. pages : {
  198. src: '<%= jshint.pages.src %>'
  199. }
  200. },
  201. // Validate CSS files
  202. csslint: {
  203. options: {
  204. csslintrc: 'build/less/.csslintrc'
  205. },
  206. dist : [
  207. 'dist/css/AdminLTE.css'
  208. ]
  209. },
  210. // Validate Bootstrap HTML
  211. bootlint: {
  212. options: {
  213. relaxerror: ['W005']
  214. },
  215. files : ['pages/**/*.html', '*.html']
  216. },
  217. // Delete images in build directory
  218. // After compressing the images in the build/img dir, there is no need
  219. // for them
  220. clean: {
  221. build: ['build/img/*']
  222. }
  223. });
  224. // Load all grunt tasks
  225. // LESS Compiler
  226. grunt.loadNpmTasks('grunt-contrib-less');
  227. // Watch File Changes
  228. grunt.loadNpmTasks('grunt-contrib-watch');
  229. // Compress JS Files
  230. grunt.loadNpmTasks('grunt-contrib-uglify');
  231. // Include Files Within HTML
  232. grunt.loadNpmTasks('grunt-includes');
  233. // Optimize images
  234. grunt.loadNpmTasks('grunt-image');
  235. // Validate JS code
  236. grunt.loadNpmTasks('grunt-contrib-jshint');
  237. grunt.loadNpmTasks('grunt-jscs');
  238. // Delete not needed files
  239. grunt.loadNpmTasks('grunt-contrib-clean');
  240. // Lint CSS
  241. grunt.loadNpmTasks('grunt-contrib-csslint');
  242. // Lint Bootstrap
  243. grunt.loadNpmTasks('grunt-bootlint');
  244. // Concatenate JS files
  245. grunt.loadNpmTasks('grunt-contrib-concat');
  246. // Linting task
  247. grunt.registerTask('lint', ['jshint', 'csslint', 'bootlint']);
  248. // JS task
  249. grunt.registerTask('js', ['concat', 'uglify']);
  250. // The default task (running 'grunt' in console) is 'watch'
  251. grunt.registerTask('default', ['watch']);
  252. };