gulpfile.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var babelify = require('babelify');
  4. var browserify = require('browserify');
  5. var buffer = require('vinyl-buffer');
  6. var imageop = require('gulp-image-optimization');
  7. var jshint = require('gulp-jshint');
  8. var less = require('gulp-less');
  9. var minify = require('gulp-minify-css');
  10. var rename = require('gulp-rename');
  11. var source = require('vinyl-source-stream');
  12. var sourcemaps = require('gulp-sourcemaps');
  13. var uglify = require('gulp-uglify');
  14. var glob = require('glob');
  15. var del = require('del');
  16. var misago = '../misago/static/misago/';
  17. // Entry points
  18. gulp.task('watch', ['fastbuild'], function() {
  19. gulp.watch('src/**/*.js', ['fastsource']);
  20. gulp.watch('style/**/*.less', ['faststyle']);
  21. });
  22. gulp.task('watchstyle', ['faststyle', 'faststatic'], function() {
  23. gulp.watch('style/**/*.less', ['faststyle']);
  24. });
  25. // Builds
  26. gulp.task('fastbuild', [
  27. 'fastsource',
  28. 'faststyle',
  29. 'faststatic',
  30. 'fastvendorsources',
  31. 'copyzxcvbn'
  32. ]);
  33. gulp.task('build', [
  34. 'source',
  35. 'style',
  36. 'static',
  37. 'vendorsources',
  38. 'copyzxcvbn'
  39. ]);
  40. // Source tasks
  41. function getSources() {
  42. var sources = ['src/index.js'];
  43. function include(pattern) {
  44. var paths = glob.sync(pattern);
  45. paths.forEach(function(path) {
  46. sources.push(path);
  47. });
  48. };
  49. include('src/initializers/*.js');
  50. return sources.map(function(path) {
  51. return path;
  52. });
  53. };
  54. gulp.task('lintsource', function() {
  55. return gulp.src('src/**/*.js')
  56. .pipe(jshint())
  57. .pipe(jshint.reporter('default'));
  58. });
  59. gulp.task('fastsource', ['lintsource'], function() {
  60. return browserify({
  61. entries: getSources(),
  62. debug: true
  63. })
  64. .external('moment')
  65. .external('cropit')
  66. .external('react')
  67. .external('react-dom')
  68. .external('react-router')
  69. .external('redux')
  70. .external('react-redux')
  71. .transform(babelify)
  72. .bundle()
  73. .pipe(source('misago.js'))
  74. .pipe(buffer())
  75. .pipe(gulp.dest(misago + 'js'));
  76. });
  77. gulp.task('source', ['lintsource'], function() {
  78. process.env.NODE_ENV = 'production';
  79. return browserify({
  80. entries: getSources(),
  81. debug: false
  82. })
  83. .external('moment')
  84. .external('cropit')
  85. .external('react')
  86. .external('react-dom')
  87. .external('react-router')
  88. .external('redux')
  89. .external('react-redux')
  90. .transform(babelify)
  91. .bundle()
  92. .pipe(source('misago.js'))
  93. .pipe(buffer())
  94. .pipe(sourcemaps.init())
  95. .pipe(uglify())
  96. .pipe(sourcemaps.write('.'))
  97. .pipe(gulp.dest(misago + 'js'));
  98. });
  99. // Styles tasks
  100. gulp.task('cleanstyle', function(cb) {
  101. del(misago + 'css', cb);
  102. });
  103. gulp.task('faststyle', function() {
  104. return gulp.src('style/index.less')
  105. .pipe(less())
  106. .pipe(rename('misago.css'))
  107. .pipe(gulp.dest(misago + 'css'));
  108. });
  109. gulp.task('style', function() {
  110. return gulp.src('style/index.less')
  111. .pipe(less())
  112. .pipe(minify())
  113. .pipe(rename('misago.css'))
  114. .pipe(gulp.dest(misago + 'css'));
  115. });
  116. // Static tasks
  117. gulp.task('copyfonts', function(cb) {
  118. return gulp.src('static/fonts/**/*')
  119. .pipe(gulp.dest(misago + 'fonts'));
  120. });
  121. gulp.task('fastcopyimages', function() {
  122. return gulp.src('static/img/**/*')
  123. .pipe(gulp.dest(misago + 'img'));
  124. });
  125. gulp.task('copyimages', function() {
  126. return gulp.src('static/img/**/*')
  127. .pipe(imageop({
  128. optimizationLevel: 9
  129. }))
  130. .pipe(gulp.dest(misago + 'img'));
  131. });
  132. gulp.task('faststatic', ['copyfonts', 'fastcopyimages']);
  133. gulp.task('static', ['copyfonts', 'copyimages']);
  134. // Vendor tasks
  135. gulp.task('fastvendorsources', function() {
  136. return browserify({
  137. entries: 'src/vendor.js',
  138. debug: true
  139. })
  140. .transform('browserify-shim')
  141. .require('moment')
  142. .require('cropit')
  143. .require('react')
  144. .require('react-dom')
  145. .require('react-router')
  146. .require('redux')
  147. .require('react-redux')
  148. .bundle()
  149. .pipe(source('vendor.js'))
  150. .pipe(buffer())
  151. .pipe(gulp.dest(misago + 'js'));
  152. });
  153. gulp.task('vendorsources', function() {
  154. process.env.NODE_ENV = 'production';
  155. return browserify({
  156. entries: 'src/vendor.js',
  157. debug: false
  158. })
  159. .transform('browserify-shim')
  160. .require('moment')
  161. .require('cropit')
  162. .require('react')
  163. .require('react-dom')
  164. .require('react-router')
  165. .require('redux')
  166. .require('react-redux')
  167. .transform(babelify)
  168. .bundle()
  169. .pipe(source('vendor.js'))
  170. .pipe(buffer())
  171. .pipe(sourcemaps.init())
  172. .pipe(uglify())
  173. .pipe(sourcemaps.write('.'))
  174. .pipe(gulp.dest(misago + 'js'));
  175. });
  176. gulp.task('copyzxcvbn', function() {
  177. return gulp.src('node_modules/zxcvbn/dist/*')
  178. .pipe(gulp.dest(misago + 'js'));
  179. });
  180. // Test task
  181. gulp.task('linttests', function() {
  182. return gulp.src(['tests/**/*.js'])
  183. .pipe(jshint())
  184. .pipe(jshint.reporter('default'));
  185. });
  186. gulp.task('test', ['linttests', 'lintsource'], function() {
  187. var mochify = require('mochify');
  188. mochify('src/test-setup.js tests/**/*.js', {
  189. reporter: 'spec'
  190. })
  191. .transform(babelify)
  192. .bundle();
  193. });