Gruntfile.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. var fs = require('fs'),
  2. path = require('path'),
  3. stream = require('stream')
  4. module.exports = function( grunt ) {
  5. grunt.initConfig({
  6. componentbuild: {
  7. build: {
  8. options: {
  9. name: 'seed',
  10. standalone: 'Seed'
  11. },
  12. src: '.',
  13. dest: 'dist'
  14. },
  15. test: {
  16. options: {
  17. name: 'seed.test'
  18. },
  19. src: '.',
  20. dest: 'test'
  21. }
  22. },
  23. jshint: {
  24. options: {
  25. reporter: require('jshint-stylish'),
  26. jshintrc: true
  27. },
  28. dev: {
  29. src: ['src/**/*.js']
  30. },
  31. test: {
  32. src: ['test/unit/specs/*.js', 'test/functional/specs/*.js']
  33. }
  34. },
  35. mocha: {
  36. test: {
  37. src: ['test/unit/runner.html'],
  38. options: {
  39. log: true,
  40. run: true
  41. }
  42. }
  43. },
  44. uglify: {
  45. build: {
  46. options: {
  47. compress: true,
  48. mangle: true,
  49. banner:
  50. '// Seed.js - v' + require('./package.json').version + '\n' +
  51. '// (c) 2013 Evan You\n' +
  52. '// https://github.com/yyx990803/seed\n'
  53. },
  54. files: {
  55. 'dist/seed.min.js': 'dist/seed.js'
  56. }
  57. }
  58. },
  59. watch: {
  60. dev: {
  61. files: ['src/**/*.js', 'component.json'],
  62. tasks: ['componentbuild', 'jsc']
  63. }
  64. }
  65. })
  66. grunt.loadNpmTasks( 'grunt-contrib-watch' )
  67. grunt.loadNpmTasks( 'grunt-contrib-jshint' )
  68. grunt.loadNpmTasks( 'grunt-contrib-uglify' )
  69. grunt.loadNpmTasks( 'grunt-component-build' )
  70. grunt.loadNpmTasks( 'grunt-mocha' )
  71. grunt.registerTask( 'version', function (version) {
  72. ;['package', 'bower', 'component'].forEach(function (file) {
  73. file = './' + file + '.json'
  74. var json = fs.readFileSync(file, 'utf-8')
  75. json = json.replace(/"version"\s*:\s*"(.+?)"/, '"version": "' + version + '"')
  76. fs.writeFileSync(file, json)
  77. })
  78. })
  79. grunt.registerTask( 'release', function (version) {
  80. if (!version || !isValid(version)) {
  81. return grunt.fail.warn('Must provide a valid semver version number.')
  82. }
  83. grunt.task.run(['version:' + version, 'default'])
  84. function isValid (v) {
  85. var nums = v.split('.')
  86. if (nums.length !== 3) return false
  87. var current = require('./package.json').version.split('.'),
  88. a1 = +nums[0],
  89. b1 = +nums[1],
  90. c1 = +nums[2],
  91. a2 = +current[0],
  92. b2 = +current[1],
  93. c2 = +current[2]
  94. if (a1 < a2) return false
  95. if (a1 === a2 && b1 < b2) return false
  96. if (a1 === a2 && b1 === b2 && c1 < c2) return false
  97. return true
  98. }
  99. })
  100. grunt.registerTask( 'casper', function (id) {
  101. var done = this.async(),
  102. file = id ? id + '.js' : ''
  103. grunt.util.spawn({
  104. cmd: 'casperjs',
  105. args: ['test', '--concise', 'specs/' + file],
  106. opts: {
  107. stdio: ['ignore', process.stdout, 'ignore'],
  108. cwd: path.resolve('test/functional')
  109. }
  110. }, function (err, res) {
  111. if (err) grunt.fail.fatal(res.stdout || 'CasperJS test failed')
  112. grunt.log.writeln(res.stdout)
  113. done()
  114. })
  115. })
  116. grunt.registerTask( 'jsc', function () {
  117. var done = this.async()
  118. grunt.util.spawn({
  119. cmd: './node_modules/jscoverage/bin/jscoverage',
  120. args: ['./test/seed.test.js'],
  121. opts: {
  122. stdio: 'inherit'
  123. }
  124. }, function (err, res) {
  125. if (err) grunt.fail.fatal(res.stdout || 'Jscoverage instrumentation failed')
  126. grunt.log.writeln(res.stdout)
  127. fs.unlinkSync('./test/seed.test.js')
  128. done()
  129. })
  130. })
  131. grunt.registerTask( 'test', [
  132. 'componentbuild',
  133. 'jsc',
  134. 'mocha',
  135. 'casper'
  136. ])
  137. grunt.registerTask( 'default', [
  138. 'jshint:dev',
  139. 'jshint:test',
  140. 'test',
  141. 'uglify'
  142. ])
  143. }