Gruntfile.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. 'use strict';
  2. var LIVERELOAD_PORT = 35729;
  3. var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
  4. var mountFolder = function (connect, dir) {
  5. return connect.static(require('path').resolve(dir));
  6. };
  7. module.exports = function (grunt) {
  8. // Project configuration.
  9. grunt.initConfig({
  10. // Metadata.
  11. pkg: grunt.file.readJSON('package.json'),
  12. headerDev: '/*! <%= pkg.name %> - v<%= pkg.version %>-dev-<%= grunt.template.today("yyyy-mm-dd") %>\n',
  13. headerRelease: '/*! <%= pkg.name %> - v<%= pkg.version %>\n',
  14. banner: '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
  15. '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
  16. ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n',
  17. // Task configuration.
  18. concat: {
  19. dev: {
  20. options: {
  21. banner: '<%= headerDev %><%= banner %>\n(function (window, angular, undefined) {\n',
  22. footer: '})(window, window.angular);\n',
  23. stripBanners: true
  24. },
  25. src: ['src/<%= pkg.name %>.js'],
  26. dest: 'dist/<%= pkg.name %>.js'
  27. },
  28. release: {
  29. options: {
  30. banner: '<%= headerRelease %><%= banner %>\n(function (window, angular, undefined) {\n',
  31. footer: '})(window, window.angular);\n',
  32. stripBanners: true
  33. },
  34. src: ['src/<%= pkg.name %>.js'],
  35. dest: 'release/<%= pkg.name %>.js'
  36. }
  37. },
  38. uglify: {
  39. dev: {
  40. options: {
  41. banner: '<%= headerDev %><%= banner %>'
  42. },
  43. src: '<%= concat.dev.dest %>',
  44. dest: 'dist/<%= pkg.name %>.min.js'
  45. },
  46. release: {
  47. options: {
  48. banner: '<%= headerRelease %><%= banner %>'
  49. },
  50. src: '<%= concat.release.dest %>',
  51. dest: 'release/<%= pkg.name %>.min.js'
  52. }
  53. },
  54. karma: {
  55. unit: {
  56. configFile: 'karma.conf.js'
  57. }
  58. },
  59. jshint: {
  60. options: {
  61. jshintrc: '.jshintrc'
  62. },
  63. gruntfile: {
  64. src: 'Gruntfile.js'
  65. },
  66. sources: {
  67. options: {
  68. jshintrc: 'src/.jshintrc'
  69. },
  70. src: ['src/**/*.js']
  71. },
  72. test: {
  73. src: ['test/**/*.js']
  74. }
  75. },
  76. watch: {
  77. gruntfile: {
  78. files: '<%= jshint.gruntfile.src %>',
  79. tasks: ['jshint:gruntfile']
  80. },
  81. sources: {
  82. files: '<%= jshint.sources.src %>',
  83. tasks: ['jshint:sources', 'karma']
  84. },
  85. test: {
  86. files: '<%= jshint.test.src %>',
  87. tasks: ['jshint:test', 'karma']
  88. },
  89. sample: {
  90. options: {
  91. livereload: LIVERELOAD_PORT
  92. },
  93. tasks: 'copy:breadcrumb',
  94. files: [
  95. 'sample/*.{css,js,html}',
  96. 'sample/controllers/*.{css,js,html}',
  97. 'sample/views/*.{css,js,html}',
  98. 'src/*.js'
  99. ]
  100. }
  101. },
  102. copy: {
  103. breadcrumb: {
  104. files: [
  105. {
  106. flatten: true,
  107. expand: true,
  108. src: [
  109. 'src/angular-breadcrumb.js'
  110. ],
  111. dest: 'sample/asset/'
  112. }
  113. ]
  114. },
  115. asset: {
  116. files: [
  117. {
  118. flatten: true,
  119. expand: true,
  120. src: [
  121. 'dist/angular-breadcrumb.js',
  122. 'bower_components/angular/angular.js',
  123. 'bower_components/angular-ui-router/release/angular-ui-router.js',
  124. 'bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js',
  125. 'bower_components/bootstrap.css/css/bootstrap.css',
  126. 'bower_components/underscore/underscore.js'
  127. ],
  128. dest: 'sample/asset/'
  129. }
  130. ]
  131. },
  132. img: {
  133. files: [
  134. {
  135. flatten: true,
  136. expand: true,
  137. src: [
  138. 'bower_components/bootstrap.css/img/glyphicons-halflings.png'
  139. ],
  140. dest: 'sample/img/'
  141. }
  142. ]
  143. }
  144. },
  145. connect: {
  146. options: {
  147. port: 9000,
  148. hostname: 'localhost'
  149. },
  150. livereload: {
  151. options: {
  152. middleware: function (connect) {
  153. return [
  154. lrSnippet,
  155. mountFolder(connect, 'sample')
  156. ];
  157. }
  158. }
  159. }
  160. },
  161. open: {
  162. server: {
  163. url: 'http://localhost:<%= connect.options.port %>/index.html'
  164. }
  165. },
  166. bump: {
  167. options: {
  168. files: ['package.json', 'bower.json'],
  169. updateConfigs: ['pkg']
  170. }
  171. },
  172. clean: {
  173. release: ["sample/*.zip"],
  174. test: ["testDependencies/*"]
  175. },
  176. compress: {
  177. release: {
  178. options: {
  179. archive: 'sample/<%= pkg.name %>-<%= pkg.version %>.zip'
  180. },
  181. files: [
  182. {expand: true, cwd: 'release/', src: ['*.js']}
  183. ]
  184. }
  185. },
  186. replace: {
  187. release: {
  188. src: ['sample/views/home.html'],
  189. overwrite: true,
  190. replacements: [{
  191. from: /angular-breadcrumb-[0-9]+\.[0-9]+\.[0-9]+\.zip/g,
  192. to: "angular-breadcrumb-<%= pkg.version %>.zip"
  193. },
  194. {
  195. from: /\([0-9]+\.[0-9]+\.[0-9]+\)/g,
  196. to: "(<%= pkg.version %>)"
  197. }]
  198. }
  199. },
  200. shell: {
  201. testMinimal: {
  202. command: 'bower install angular#=1.0.8 angular-mocks#=1.0.8 angular-sanitize#=1.0.8 --config.directory=. --config.cwd=testDependencies'
  203. },
  204. test1dot2: {
  205. command: 'bower install angular#=1.2.18 angular-mocks#=1.2.18 angular-sanitize#=1.2.18 --config.directory=. --config.cwd=testDependencies'
  206. }
  207. }
  208. });
  209. // These plugins provide necessary tasks.
  210. grunt.loadNpmTasks('grunt-bump');
  211. grunt.loadNpmTasks('grunt-contrib-clean');
  212. grunt.loadNpmTasks('grunt-contrib-compress');
  213. grunt.loadNpmTasks('grunt-contrib-concat');
  214. grunt.loadNpmTasks('grunt-contrib-uglify');
  215. grunt.loadNpmTasks('grunt-contrib-jshint');
  216. grunt.loadNpmTasks('grunt-contrib-watch');
  217. grunt.loadNpmTasks('grunt-contrib-copy');
  218. grunt.loadNpmTasks('grunt-contrib-connect');
  219. grunt.loadNpmTasks('grunt-conventional-changelog');
  220. grunt.loadNpmTasks('grunt-karma');
  221. grunt.loadNpmTasks('grunt-open');
  222. grunt.loadNpmTasks('grunt-shell');
  223. grunt.loadNpmTasks('grunt-text-replace');
  224. grunt.registerTask('test', ['jshint', 'testMin', 'test1dot2']);
  225. grunt.registerTask('testMin', ['clean:test', 'shell:testMinimal', 'karma']);
  226. grunt.registerTask('test1dot2', ['clean:test', 'shell:test1dot2', 'karma']);
  227. grunt.registerTask('default', ['test', 'concat:dev', 'uglify:dev']);
  228. grunt.registerTask('sample', ['concat:dev', 'copy:asset', 'copy:img', 'connect:livereload', 'open', 'watch']);
  229. grunt.registerTask('release-prepare', 'Update all files for a release', function(target) {
  230. if(!target) {
  231. target = 'patch';
  232. }
  233. grunt.task.run(
  234. 'bump-only:' + target, // Version update
  235. 'test', // Tests
  236. 'concat:release', // Concat with release banner
  237. 'uglify:release', // Minify with release banner
  238. 'changelog', // Changelog update
  239. 'clean:release', // Delete old version download file
  240. 'compress:release', // New version download file
  241. 'replace:release' // Update version in download button (link & label)
  242. );
  243. });
  244. };