Gruntfile.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*global module*/
  2. var webpackCfg = require('./webpack.config.js');
  3. module.exports = function (grunt) {
  4. 'use strict';
  5. // The banner on top of the build
  6. var banner = '/**\n' +
  7. ' * Open Sheet Music Display <%= pkg.version %> built on <%= grunt.template.today("yyyy-mm-dd") %>.\n' +
  8. ' * Copyright (c) 2016 PhonicScore\n' +
  9. ' *\n' +
  10. ' * https://github.com/opensheetmusicdisplay/opensheetmusicdisplay\n' +
  11. ' */\n',
  12. typings = [
  13. 'typings/index.d.ts',
  14. // Additional manual typings:
  15. 'external/vexflow/vexflow.d.ts'
  16. ];
  17. // Paths
  18. var src = ['src/**/*.ts'];
  19. var test = ['test/**/*.ts'];
  20. // Grunt configuration following:
  21. grunt.initConfig({
  22. pkg: grunt.file.readJSON('package.json'),
  23. banner: '',
  24. // Build output directories
  25. outputDir: {
  26. build: 'build',
  27. dist: 'dist'
  28. },
  29. // Browserify
  30. browserify: {
  31. dist: {
  32. src: ['src/OSMD/OSMD.ts'],
  33. dest: '<%= outputDir.build %>/osmd.js',
  34. options: {
  35. banner: '<%= banner %>',
  36. browserifyOptions: {
  37. standalone: 'opensheetmusicdisplay'
  38. }
  39. }
  40. },
  41. debug: {
  42. src: ['src/OSMD/OSMD.ts'],
  43. dest: '<%= outputDir.build %>/osmd-debug.js',
  44. options: {
  45. banner: '<%= banner %>',
  46. browserifyOptions: {
  47. debug: true,
  48. standalone: 'opensheetmusicdisplay'
  49. }
  50. }
  51. },
  52. test: {
  53. src: [].concat(typings, src, test),
  54. dest: '<%= outputDir.build %>/osmd-test.js',
  55. options: {
  56. banner: '<%= banner %>',
  57. browserifyOptions: {
  58. debug: true
  59. }
  60. }
  61. },
  62. options: {
  63. plugin: ['tsify']
  64. }
  65. },
  66. // Uglify
  67. uglify: {
  68. options: {
  69. compress: {
  70. 'drop_console': true
  71. },
  72. banner: banner,
  73. mangle: true,
  74. mangleProperties: true
  75. },
  76. bundle: {
  77. files: {
  78. 'build/osmd.min.js': ['build/osmd.js']
  79. }
  80. }
  81. },
  82. // Webpack
  83. webpack: {
  84. options: {
  85. progress: true,
  86. },
  87. build: webpackCfg,
  88. dev: Object.assign({ watch: true }, webpackCfg)
  89. },
  90. 'webpack-dev-server': {
  91. options: {
  92. webpack: webpackCfg
  93. },
  94. start: webpackCfg.devServer,
  95. },
  96. // Karma setup
  97. karma: {
  98. // For continuous integration
  99. ci: {
  100. configFile: 'karma.conf.js',
  101. options: {
  102. browsers: ['PhantomJS']
  103. }
  104. },
  105. firefox: {
  106. configFile: 'karma.conf.js',
  107. options: {
  108. singleRun: false,
  109. browsers: ['Firefox']
  110. }
  111. },
  112. chrome: {
  113. configFile: 'karma.conf.js',
  114. options: {
  115. singleRun: false,
  116. browsers: ['Chrome']
  117. }
  118. }
  119. },
  120. // Typescript compilation for ES6 module (npm package)
  121. ts: {
  122. default : {
  123. tsconfig: true
  124. }
  125. },
  126. // Cleaning task setup
  127. clean: {
  128. options: {
  129. force: true
  130. },
  131. all: {
  132. src: [
  133. '<%= outputDir.build %>',
  134. '<%= outputDir.dist %>',
  135. '.tscache',
  136. 'src/**/*.js', 'test/**/*.js' // if something went wrong, delete JS from TypeScript source directories
  137. ]
  138. }
  139. },
  140. copy: {
  141. demo: {
  142. files: [
  143. { src: ['*'], dest: '<%= outputDir.build %>/demo/sheets/', cwd: './test/data/', expand: true },
  144. { src: ['*.js', '*.css', '*.html', '*.ico'], cwd: './demo/', expand: true, dest: '<%= outputDir.build %>/demo/' },
  145. { src: ['osmd-debug.js'], cwd: './build/', expand: true, dest: '<%= outputDir.build %>/demo/' }
  146. ]
  147. }
  148. },
  149. // http-server
  150. 'http-server': {
  151. 'demo': {
  152. root: 'build/demo',
  153. port: 8000,
  154. host: '0.0.0.0',
  155. showDir : true,
  156. autoIndex: true,
  157. runInBackground: false,
  158. openBrowser : true
  159. }
  160. }
  161. });
  162. // Load npm tasks
  163. grunt.loadNpmTasks('grunt-browserify');
  164. grunt.loadNpmTasks('grunt-contrib-clean');
  165. grunt.loadNpmTasks('grunt-contrib-copy');
  166. grunt.loadNpmTasks('grunt-contrib-uglify');
  167. grunt.loadNpmTasks('grunt-contrib-watch');
  168. grunt.loadNpmTasks('grunt-http-server');
  169. grunt.loadNpmTasks('grunt-karma');
  170. grunt.loadNpmTasks('grunt-ts');
  171. grunt.loadNpmTasks('grunt-webpack');
  172. // Build tasks
  173. grunt.registerTask('build:demo', 'Builds the demo.', ['browserify:debug', 'copy:demo']);
  174. grunt.registerTask('build:test', 'Builds the tests', ['browserify:test']);
  175. grunt.registerTask('build:dist', 'Builds for distribution on npm and Bower.', ['browserify:dist', 'uglify', 'ts']);
  176. grunt.registerTask('build:pack', 'Builds using webpack', ['webpack:build', 'uglify']);
  177. // Tests
  178. grunt.registerTask('test', 'Runs unit, regression and e2e tests.', ['build:test', 'karma:ci']);
  179. // Webpack dev server
  180. grunt.registerTask('webpack-server', ['webpack-dev-server:start']);
  181. // Default task (if grunt is run without any argument, used in contiuous integration)
  182. grunt.registerTask('default', 'Default task, running all other tasks. (CI)', ['test', 'build:demo', 'build:dist']);
  183. };