Gruntfile.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. module.exports = function(grunt) {
  2. 'use strict';
  3. var customLaunchers = {
  4. /*
  5. 'SL_IE8': {
  6. base: 'SauceLabs',
  7. browserName: 'internet explorer',
  8. version: '8.0',
  9. platform: 'windows XP'
  10. },
  11. 'SL_EDGE': {
  12. base: 'SauceLabs',
  13. browserName: 'microsoftedge',
  14. version: 'latest',
  15. platform: 'windows 10'
  16. },
  17. 'SL_SAFARI': {
  18. base: 'SauceLabs',
  19. browserName: 'safari',
  20. version: 'latest',
  21. platform: 'OS X 10.12'
  22. },
  23. */
  24. 'SL_IE9': {
  25. base: 'SauceLabs',
  26. browserName: 'internet explorer',
  27. version: '9.0',
  28. platform: 'windows 7'
  29. },
  30. 'SL_IE10': {
  31. base: 'SauceLabs',
  32. browserName: 'internet explorer',
  33. version: '10.0',
  34. platform: 'windows 8'
  35. },
  36. 'SL_IE11': {
  37. base: 'SauceLabs',
  38. browserName: 'internet explorer',
  39. version: '11.0',
  40. platform: 'windows 8.1'
  41. },
  42. 'SL_CHROME': {
  43. base: 'SauceLabs',
  44. browserName: 'chrome',
  45. version: 'latest',
  46. platform: 'windows 8'
  47. },
  48. 'SL_FIREFOX': {
  49. base: 'SauceLabs',
  50. browserName: 'firefox',
  51. version: 'latest',
  52. platform: 'windows 8'
  53. }
  54. };
  55. grunt.initConfig({
  56. // package File
  57. pkg: grunt.file.readJSON('package.json'),
  58. // bulid source(grunt-build.js).
  59. build: {
  60. bs3: {
  61. input: './src/js/bs3/settings',
  62. output: './dist/summernote.js'
  63. },
  64. bs4: {
  65. input: './src/js/bs4/settings',
  66. output: './dist/summernote-bs4.js'
  67. },
  68. lite: {
  69. input: './src/js/lite/settings',
  70. output: './dist/summernote-lite.js'
  71. }
  72. },
  73. // for javascript convention.
  74. eslint: {
  75. target: [
  76. 'src/**/*.js',
  77. 'plugin/**/*.js',
  78. 'lang/**/*.js',
  79. 'Gruntfile.js',
  80. 'test/**/*.js',
  81. '!coverage/**/*.js',
  82. '!test/coverage/**/*.js',
  83. 'build/*.js'
  84. ]
  85. },
  86. // uglify: minify javascript
  87. uglify: {
  88. options: {
  89. banner: '/*! Summernote v<%=pkg.version%> | (c) 2013- Alan Hong and other contributors | MIT license */\n'
  90. },
  91. all: {
  92. files: [
  93. { 'dist/summernote.min.js': ['dist/summernote.js'] },
  94. { 'dist/summernote-bs4.min.js': ['dist/summernote-bs4.js'] },
  95. {
  96. expand: true,
  97. cwd: 'dist/lang',
  98. src: '**/*.js',
  99. dest: 'dist/lang',
  100. ext: '.min.js'
  101. },
  102. {
  103. expand: true,
  104. cwd: 'dist/plugin',
  105. src: '**/*.js',
  106. dest: 'dist/plugin',
  107. ext: '.min.js'
  108. }
  109. ]
  110. }
  111. },
  112. // recess: minify stylesheets
  113. recess: {
  114. dist: {
  115. options: { compile: true, compress: true },
  116. files: [
  117. {
  118. 'dist/summernote.css': ['src/less/summernote.less'],
  119. 'dist/summernote-bs4.css': ['src/less/summernote-bs4.less'],
  120. 'dist/summernote-lite.css': ['src/less/summernote-lite.less']
  121. },
  122. {
  123. expand: true,
  124. cwd: 'dist/plugin',
  125. src: '**/*.css',
  126. dest: 'dist/plugin',
  127. ext: '.min.css'
  128. }
  129. ]
  130. }
  131. },
  132. // compress: summernote-{{version}}-dist.zip
  133. compress: {
  134. main: {
  135. options: {
  136. archive: function() {
  137. return 'dist/summernote-{{version}}-dist.zip'.replace(
  138. '{{version}}',
  139. grunt.config('pkg.version')
  140. );
  141. }
  142. },
  143. files: [{
  144. expand: true,
  145. src: [
  146. 'dist/*.js',
  147. 'dist/*.css',
  148. 'dist/font/*'
  149. ]
  150. }, {
  151. src: ['plugin/**/*.js', 'plugin/**/*.css', 'lang/**/*.js'],
  152. dest: 'dist/'
  153. }]
  154. }
  155. },
  156. // connect configuration.
  157. connect: {
  158. all: {
  159. options: {
  160. port: 3000
  161. }
  162. }
  163. },
  164. // watch source code change
  165. watch: {
  166. less: {
  167. files: ['src/less/*.less'],
  168. tasks: ['recess'],
  169. options: {
  170. livereload: true
  171. }
  172. },
  173. script: {
  174. files: ['src/js/**/*.js', 'test/unit/**/*.js'],
  175. tasks: ['lint', 'build', 'karma:all'],
  176. options: {
  177. livereload: true
  178. }
  179. }
  180. },
  181. karma: {
  182. options: {
  183. configFile: './karma.conf.js'
  184. },
  185. watch: {
  186. background: false,
  187. singleRun: false
  188. },
  189. all: {
  190. // Chrome, ChromeCanary, Firefox, Opera, Safari, PhantomJS, IE
  191. singleRun: true,
  192. browsers: ['PhantomJS']
  193. },
  194. dist: {
  195. singleRun: true,
  196. browsers: ['PhantomJS']
  197. },
  198. travis: {
  199. singleRun: true,
  200. browsers: ['PhantomJS'],
  201. reporters: ['dots', 'coverage']
  202. },
  203. saucelabs: {
  204. reporters: ['saucelabs'],
  205. sauceLabs: {
  206. testName: 'unit tests for summernote',
  207. startConnect: false,
  208. tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
  209. build: process.env.TRAVIS_BUILD_NUMBER,
  210. tags: [process.env.TRAVIS_BRANCH, process.env.TRAVIS_PULL_REQUEST]
  211. },
  212. captureTimeout: 120000,
  213. customLaunchers: customLaunchers,
  214. browsers: Object.keys(customLaunchers),
  215. singleRun: true
  216. }
  217. },
  218. coveralls: {
  219. options: {
  220. force: false
  221. },
  222. travis: {
  223. src: 'coverage/**/lcov.info'
  224. }
  225. },
  226. clean: {
  227. dist: ['dist/**/*']
  228. },
  229. copy: {
  230. dist: {
  231. files: [
  232. { src: 'lang/*', dest: 'dist/' },
  233. { expand: true, cwd: 'src/icons/dist/font/', src: ['**', '!*.html'], dest: 'dist/font/' }
  234. ]
  235. }
  236. },
  237. webfont: {
  238. icons: {
  239. src: 'src/icons/*.svg',
  240. dest: 'src/icons/dist/font',
  241. destCss: 'src/icons/dist/',
  242. options: {
  243. font: 'summernote',
  244. relativeFontPath: './font/',
  245. stylesheet: 'less',
  246. template: 'src/icons/templates/summernote.css'
  247. }
  248. }
  249. }
  250. });
  251. // load all tasks from the grunt plugins used in this file
  252. require('load-grunt-tasks')(grunt);
  253. // load all grunts/*.js
  254. grunt.loadTasks('grunts');
  255. // server: run server for development
  256. grunt.registerTask('server', ['connect', 'watch']);
  257. // lint
  258. grunt.registerTask('lint', ['eslint']);
  259. // test: unit test on test folder
  260. grunt.registerTask('test', ['lint', 'karma:watch']);
  261. // test: unit test on travis
  262. grunt.registerTask('test-travis', ['lint', 'karma:travis']);
  263. // test: saucelabs test
  264. grunt.registerTask('saucelabs-test', ['karma:saucelabs']);
  265. // dist: make dist files
  266. grunt.registerTask('dist', [
  267. 'clean:dist',
  268. 'build', 'webfont', 'lint', 'karma:dist',
  269. 'copy:dist', 'uglify', 'recess', 'compress'
  270. ]);
  271. // default: server
  272. grunt.registerTask('default', ['server']);
  273. };