gulpfile.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var gutil = require('gulp-util');
  4. var babelify = require('babelify');
  5. var browserify = require('browserify');
  6. var buffer = require('vinyl-buffer');
  7. var image = require('gulp-image');
  8. var jshint = require('gulp-jshint');
  9. var less = require('gulp-less');
  10. var minify = require('gulp-minify-css');
  11. var rename = require('gulp-rename');
  12. var source = require('vinyl-source-stream');
  13. var sourcemaps = require('gulp-sourcemaps');
  14. var uglify = require('gulp-uglify');
  15. var watchify = require('watchify');
  16. var fs = require('fs');
  17. var glob = require('glob');
  18. var del = require('del');
  19. var misago = '../misago/static/misago/';
  20. // Entry points
  21. gulp.task('watch', ['watchifybuild'], function() {
  22. gulp.watch('style/**/*.less', ['faststyle']);
  23. });
  24. gulp.task('watchstyle', ['faststyle', 'faststatic'], function() {
  25. gulp.watch('style/**/*.less', ['faststyle']);
  26. });
  27. // Builds
  28. gulp.task('fastbuild', [
  29. 'fastsource',
  30. 'faststyle',
  31. 'faststatic',
  32. 'fastvendorsources',
  33. 'copypolyfill',
  34. 'copyzxcvbn'
  35. ]);
  36. gulp.task('build', [
  37. 'source',
  38. 'style',
  39. 'static',
  40. 'vendorsources',
  41. 'copypolyfill',
  42. 'copyzxcvbn'
  43. ]);
  44. // Source tasks
  45. function getSources() {
  46. var sources = ['src/index.js'];
  47. function include(pattern) {
  48. var paths = glob.sync(pattern);
  49. paths.forEach(function(path) {
  50. sources.push(path);
  51. });
  52. };
  53. include('src/initializers/*.js');
  54. include('src/initializers/**/*.js');
  55. return sources.map(function(path) {
  56. return path;
  57. });
  58. };
  59. gulp.task('lintsource', function() {
  60. return gulp.src('src/**/*.js')
  61. .pipe(jshint())
  62. .pipe(jshint.reporter('default'));
  63. });
  64. gulp.task('fastsource', ['lintsource'], function() {
  65. process.env.NODE_ENV = 'development';
  66. return browserify({
  67. entries: getSources(),
  68. debug: true,
  69. })
  70. .external('moment')
  71. .external('cropit')
  72. .external('react')
  73. .external('react-dom')
  74. .external('react-router')
  75. .external('redux')
  76. .external('react-redux')
  77. .transform(babelify)
  78. .bundle()
  79. .pipe(source('misago.js'))
  80. .pipe(buffer())
  81. .pipe(gulp.dest(misago + 'js'));
  82. });
  83. gulp.task('watchifybuild', ['fastbuild'], function() {
  84. process.env.NODE_ENV = 'development';
  85. var b = browserify({
  86. entries: getSources(),
  87. debug: true,
  88. cache: {},
  89. packageCache: {}
  90. })
  91. .plugin(watchify, {
  92. delay: 100,
  93. poll: true
  94. })
  95. .external('moment')
  96. .external('cropit')
  97. .external('react')
  98. .external('react-dom')
  99. .external('react-router')
  100. .external('redux')
  101. .external('react-redux')
  102. .transform(babelify)
  103. .on('error', function(err) {
  104. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  105. this.emit('end');
  106. });
  107. function bundle() {
  108. b.bundle()
  109. .on('error', function(err) {
  110. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  111. this.emit('end');
  112. })
  113. .pipe(fs.createWriteStream(misago + 'js/misago.js'));
  114. }
  115. b.on('update', bundle);
  116. bundle();
  117. b.on('log', function (msg) {
  118. gutil.log(gutil.colors.cyan('watchify:'), msg);
  119. });
  120. })
  121. gulp.task('source', ['lintsource'], function() {
  122. process.env.NODE_ENV = 'production';
  123. return browserify({
  124. entries: getSources(),
  125. debug: false
  126. })
  127. .external('moment')
  128. .external('cropit')
  129. .external('react')
  130. .external('react-dom')
  131. .external('react-router')
  132. .external('redux')
  133. .external('react-redux')
  134. .transform(babelify)
  135. .bundle()
  136. .pipe(source('misago.js'))
  137. .pipe(buffer())
  138. .pipe(sourcemaps.init())
  139. .pipe(uglify())
  140. .pipe(sourcemaps.write('.'))
  141. .pipe(gulp.dest(misago + 'js'));
  142. });
  143. // Styles tasks
  144. gulp.task('cleanstyle', function(cb) {
  145. del(misago + 'css', cb);
  146. });
  147. gulp.task('faststyle', function() {
  148. return gulp.src('style/index.less')
  149. .pipe(less().on('error', function(err) {
  150. gutil.log(gutil.colors.red(err.toString()));
  151. this.emit('end');
  152. }))
  153. .pipe(rename('misago.css'))
  154. .pipe(gulp.dest(misago + 'css'));
  155. });
  156. gulp.task('style', function() {
  157. return gulp.src('style/index.less')
  158. .pipe(less())
  159. .pipe(minify())
  160. .pipe(rename('misago.css'))
  161. .pipe(gulp.dest(misago + 'css'));
  162. });
  163. // Static tasks
  164. gulp.task('copyfonts', function(cb) {
  165. return gulp.src('static/fonts/**/*')
  166. .pipe(gulp.dest(misago + 'fonts'));
  167. });
  168. gulp.task('fastcopyimages', function() {
  169. return gulp.src('static/img/**/*')
  170. .pipe(gulp.dest(misago + 'img'));
  171. });
  172. gulp.task('copyimages', function() {
  173. return gulp.src('static/img/**/*')
  174. .pipe(image())
  175. .pipe(gulp.dest(misago + 'img'));
  176. });
  177. gulp.task('faststatic', ['copyfonts', 'fastcopyimages']);
  178. gulp.task('static', ['copyfonts', 'copyimages']);
  179. // Vendor tasks
  180. gulp.task('fastvendorsources', function() {
  181. process.env.NODE_ENV = 'development';
  182. return browserify({
  183. entries: 'src/vendor.js',
  184. debug: true
  185. })
  186. .transform('browserify-shim')
  187. .require('moment')
  188. .require('cropit')
  189. .require('react')
  190. .require('react-dom')
  191. .require('react-router')
  192. .require('redux')
  193. .require('react-redux')
  194. .bundle()
  195. .pipe(source('vendor.js'))
  196. .pipe(buffer())
  197. .pipe(gulp.dest(misago + 'js'));
  198. });
  199. gulp.task('vendorsources', function() {
  200. process.env.NODE_ENV = 'production';
  201. return browserify({
  202. entries: 'src/vendor.js',
  203. debug: false
  204. })
  205. .transform('browserify-shim')
  206. .require('moment')
  207. .require('cropit')
  208. .require('react')
  209. .require('react-dom')
  210. .require('react-router')
  211. .require('redux')
  212. .require('react-redux')
  213. .transform(babelify)
  214. .bundle()
  215. .pipe(source('vendor.js'))
  216. .pipe(buffer())
  217. .pipe(sourcemaps.init())
  218. .pipe(uglify())
  219. .pipe(sourcemaps.write('.'))
  220. .pipe(gulp.dest(misago + 'js'));
  221. });
  222. gulp.task('copyzxcvbn', function() {
  223. return gulp.src('node_modules/zxcvbn/dist/*')
  224. .pipe(gulp.dest(misago + 'js'));
  225. });
  226. gulp.task('copypolyfill', function() {
  227. return gulp.src('node_modules/babel-polyfill/dist/polyfill.js')
  228. .pipe(rename('es2015.js'))
  229. .pipe(buffer())
  230. .pipe(sourcemaps.init())
  231. .pipe(uglify())
  232. .pipe(sourcemaps.write('.'))
  233. .pipe(gulp.dest(misago + 'js'));
  234. });
  235. // Test task
  236. var tests = (function() {
  237. var flag = process.argv.indexOf('--limit');
  238. var value = process.argv[flag + 1];
  239. var tests = ['src/test-setup.js'];
  240. if (flag !== -1 && value) {
  241. var pattern = value.trim();
  242. glob.sync('tests/**/*.js').map(function(path) {
  243. if (path.indexOf(pattern) !== -1) {
  244. tests.push(path);
  245. }
  246. });
  247. } else {
  248. tests.push('tests/**/*.js');
  249. }
  250. return tests;
  251. })();
  252. gulp.task('linttests', function() {
  253. return gulp.src(tests)
  254. .pipe(jshint())
  255. .pipe(jshint.reporter('default'));
  256. });
  257. gulp.task('test', ['linttests', 'lintsource'], function() {
  258. var mochify = require('mochify');
  259. mochify(tests.join(" "), {
  260. reporter: 'spec'
  261. })
  262. .transform(babelify)
  263. .bundle();
  264. });