Gruntfile.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. module.exports = function(grunt) {
  2. var compileType = function() {
  3. var type = this.data.type;
  4. var template = grunt.file.read('templates/types.js');
  5. var anon = grunt.file.read('templates/anon.js');
  6. var files = grunt.file.expand([
  7. 'src/' + type + '/*.js'
  8. ]);
  9. var regexp = /\}\(this, function \(numeral\) \{\s([\s\S]+)(?:\s\}\)\);)/;
  10. var content = '';
  11. var file;
  12. var i;
  13. for (i = 0; i < files.length; i++) {
  14. file = grunt.file.read(files[i]);
  15. content += '\n' + grunt.template.process(anon, {
  16. data: {
  17. content: file.match(regexp)[1]
  18. }
  19. }) + '\n';
  20. }
  21. grunt.file.write('temp/' + type + '.js', content);
  22. if (type === 'locales') {
  23. grunt.file.write('locales.js', grunt.template.process(template, {
  24. data: {
  25. type: type,
  26. content: content
  27. }
  28. }));
  29. }
  30. },
  31. compileNumeral = function() {
  32. var regexp = /([\s])return numeral;(?:\s\}\)\);)/;
  33. var numeral = grunt.file.read('src/numeral.js');
  34. var formats = grunt.file.read('temp/formats.js');
  35. var index = numeral.indexOf('return numeral;');
  36. numeral = numeral.substr(0, index) + '\n' + formats + numeral.substr(index);
  37. grunt.file.write('numeral.js', numeral);
  38. };
  39. require('load-grunt-tasks')(grunt);
  40. grunt.initConfig({
  41. mochaTest : {
  42. all: [
  43. 'tests/numeral.js',
  44. 'tests/formats/*.js',
  45. 'tests/locales/*.js'
  46. ]
  47. },
  48. karma: {
  49. options: {
  50. files: [
  51. 'numeral.js',
  52. 'locales.js',
  53. 'tests/numeral.js',
  54. 'tests/formats/*.js',
  55. 'tests/locales/*.js'
  56. ],
  57. frameworks: [
  58. 'mocha',
  59. 'chai'
  60. ],
  61. singleRun: true,
  62. autoWatch: false
  63. },
  64. local: {
  65. browsers: [
  66. 'Chrome',
  67. 'Firefox'
  68. ]
  69. },
  70. ci: {
  71. configFile: 'karma-ci.conf.js'
  72. }
  73. },
  74. copy: {
  75. locales: {
  76. files: [
  77. {
  78. expand: true,
  79. cwd: 'src/',
  80. src: [
  81. 'locales/*.js'
  82. ],
  83. dest: './'
  84. }
  85. ]
  86. }
  87. },
  88. compile: {
  89. locales: {
  90. type: 'locales'
  91. },
  92. formats: {
  93. type: 'formats'
  94. }
  95. },
  96. uglify: {
  97. min: {
  98. files: [
  99. {
  100. expand: true,
  101. cwd: 'src/',
  102. src: [
  103. 'locales/*.js'
  104. ],
  105. dest: 'min/',
  106. ext: '.min.js'
  107. },
  108. {
  109. expand: true,
  110. src: [
  111. 'numeral.js',
  112. 'locales.js'
  113. ],
  114. dest: 'min/',
  115. ext: '.min.js'
  116. }
  117. ]
  118. },
  119. options: {
  120. preserveComments: 'some'
  121. }
  122. },
  123. jshint: {
  124. all: [
  125. 'Gruntfile.js',
  126. 'src/**/*.js'
  127. ],
  128. options: {
  129. 'node': true,
  130. 'browser': true,
  131. 'curly': true,
  132. 'devel': false,
  133. 'eqeqeq': true,
  134. 'eqnull': true,
  135. 'newcap': true,
  136. 'noarg': true,
  137. 'undef': true,
  138. 'sub': true,
  139. 'strict': false,
  140. 'quotmark': 'single',
  141. 'globals': {
  142. 'define': true
  143. }
  144. }
  145. }
  146. });
  147. grunt.registerTask('default', [
  148. 'test'
  149. ]);
  150. grunt.registerMultiTask('compile', compileType);
  151. grunt.registerTask('compile:numeral', compileNumeral);
  152. grunt.registerTask('build', [
  153. 'jshint',
  154. 'compile',
  155. 'compile:numeral',
  156. 'copy'
  157. ]);
  158. grunt.registerTask('test', [
  159. 'build',
  160. 'mochaTest',
  161. 'karma:local'
  162. ]);
  163. grunt.registerTask('test:npm', [
  164. 'build',
  165. 'mochaTest'
  166. ]);
  167. grunt.registerTask('test:browser', [
  168. 'build',
  169. 'karma:local'
  170. ]);
  171. grunt.registerTask('dist', [
  172. 'build',
  173. 'uglify'
  174. ]);
  175. grunt.registerTask('version', function (version) {
  176. if (!version || version.split('.').length !== 3) {
  177. grunt.fail.fatal('malformed version. Use\n\n grunt version:1.2.3');
  178. }
  179. grunt.config('string-replace.json', {
  180. files: {
  181. 'package.json': 'package.json',
  182. 'component.json': 'component.json',
  183. 'bower.json': 'bower.json'
  184. },
  185. options: {
  186. replacements: [
  187. {
  188. pattern: /"version": .*/,
  189. replacement: '"version": "' + version + '",'
  190. }
  191. ]
  192. }
  193. });
  194. grunt.config('string-replace.numeral', {
  195. files: {
  196. 'src/numeral.js': 'src/numeral.js'
  197. },
  198. options: {
  199. replacements: [
  200. {
  201. pattern: /version : .*/,
  202. replacement: 'version : ' + version
  203. },
  204. {
  205. pattern: /VERSION = .*/,
  206. replacement: 'VERSION = \'' + version + '\','
  207. }
  208. ]
  209. }
  210. });
  211. grunt.config('string-replace.templates', {
  212. files: {
  213. 'templates/types.js': 'templates/types.js'
  214. },
  215. options: {
  216. replacements: [
  217. {
  218. pattern: /: .*/,
  219. replacement: ': ' + version
  220. }
  221. ]
  222. }
  223. });
  224. grunt.task.run([
  225. 'string-replace:json',
  226. 'string-replace:templates',
  227. 'string-replace:numeral'
  228. ]);
  229. });
  230. // Travis CI task.
  231. grunt.registerTask('travis', [
  232. 'build',
  233. 'mochaTest',
  234. 'karma:ci'
  235. ]);
  236. };