gulpfile.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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 eslint = require('gulp-eslint');
  8. var image = require('gulp-image');
  9. var less = require('gulp-less');
  10. var cleanCss = require('gulp-clean-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. // Source tasks
  21. function getSources() {
  22. var sources = ['src/index.js'];
  23. function include(pattern) {
  24. var paths = glob.sync(pattern);
  25. paths.forEach(function(path) {
  26. sources.push(path);
  27. });
  28. };
  29. include('src/initializers/*.js');
  30. include('src/initializers/**/*.js');
  31. return sources.map(function(path) {
  32. return path;
  33. });
  34. };
  35. function lintjsapp() {
  36. return gulp.src('src/**/*.js')
  37. .pipe(eslint({
  38. 'parser': 'babel-eslint',
  39. 'parserOptions': {
  40. 'ecmaVersion': 7,
  41. 'sourceType': 'module',
  42. 'ecmaFeatures': {
  43. 'jsx': true
  44. }
  45. },
  46. rules: {
  47. "semi": ["error", "never"],
  48. "no-undef": "error",
  49. "strict": 2
  50. },
  51. globals: [
  52. "gettext",
  53. "ngettext",
  54. "interpolate",
  55. "misago",
  56. "hljs"
  57. ],
  58. envs: [
  59. "browser",
  60. "jquery",
  61. "node",
  62. "es6"
  63. ]
  64. }))
  65. .pipe(eslint.format());
  66. };
  67. function fastsource() {
  68. process.env.NODE_ENV = 'development';
  69. return browserify({
  70. entries: getSources(),
  71. debug: true,
  72. })
  73. .external('moment')
  74. .external('cropit')
  75. .external('react')
  76. .external('react-dom')
  77. .external('react-router')
  78. .external('redux')
  79. .external('react-redux')
  80. .transform(babelify)
  81. .bundle()
  82. .pipe(source('misago.js'))
  83. .pipe(buffer())
  84. .pipe(gulp.dest(misago + 'js'));
  85. };
  86. function watchifybuild() {
  87. process.env.NODE_ENV = 'development';
  88. var b = browserify({
  89. entries: getSources(),
  90. debug: true,
  91. cache: {},
  92. packageCache: {}
  93. })
  94. .plugin(watchify, {
  95. delay: 100,
  96. poll: true
  97. })
  98. .external('moment')
  99. .external('cropit')
  100. .external('react')
  101. .external('react-dom')
  102. .external('react-router')
  103. .external('redux')
  104. .external('react-redux')
  105. .transform(babelify)
  106. .on('error', function(err) {
  107. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  108. this.emit('end');
  109. });
  110. function bundle() {
  111. b.bundle()
  112. .on('error', function(err) {
  113. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  114. this.emit('end');
  115. })
  116. .pipe(fs.createWriteStream(misago + 'js/misago.js'));
  117. }
  118. b.on('update', bundle);
  119. bundle();
  120. b.on('log', function (msg) {
  121. gutil.log(gutil.colors.cyan('watchify:'), msg);
  122. });
  123. }
  124. function jsapp() {
  125. process.env.NODE_ENV = 'production';
  126. return browserify({
  127. entries: getSources(),
  128. debug: false
  129. })
  130. .external('moment')
  131. .external('cropit')
  132. .external('react')
  133. .external('react-dom')
  134. .external('react-router')
  135. .external('redux')
  136. .external('react-redux')
  137. .transform(babelify, { sourceMaps: true })
  138. .bundle()
  139. .pipe(source('misago.js'))
  140. .pipe(buffer())
  141. .pipe(sourcemaps.init({ loadMaps: true }))
  142. .pipe(uglify())
  143. .pipe(sourcemaps.write('./'))
  144. .pipe(gulp.dest(misago + 'js'));
  145. };
  146. // Styles tasks
  147. function cleanstyle() {
  148. return del(misago + 'css', {force: true});
  149. };
  150. function faststyle() {
  151. return gulp.src('style/index.less')
  152. .pipe(less().on('error', function(err) {
  153. gutil.log(gutil.colors.red(err.toString()));
  154. this.emit('end');
  155. }))
  156. .pipe(rename('misago.css'))
  157. .pipe(gulp.dest(misago + 'css'));
  158. };
  159. function style() {
  160. return gulp.src('style/index.less')
  161. .pipe(less())
  162. .pipe(cleanCss({compatibility: 'ie11'}))
  163. .pipe(rename('misago.css'))
  164. .pipe(gulp.dest(misago + 'css'));
  165. };
  166. // Static tasks
  167. function copyfonts() {
  168. return gulp.src('static/fonts/**/*')
  169. .pipe(gulp.dest(misago + 'fonts'));
  170. };
  171. function copyimages() {
  172. return gulp.src('static/img/**/*')
  173. .pipe(image())
  174. .pipe(gulp.dest(misago + 'img'));
  175. };
  176. const statics = gulp.parallel(copyfonts, copyimages);
  177. // Vendor tasks
  178. function vendors() {
  179. process.env.NODE_ENV = 'production';
  180. return browserify({
  181. entries: 'src/vendor.js',
  182. debug: false
  183. })
  184. .transform('browserify-shim')
  185. .require('moment')
  186. .require('cropit')
  187. .require('react')
  188. .require('react-dom')
  189. .require('react-router')
  190. .require('redux')
  191. .require('react-redux')
  192. .transform(babelify, { sourceMaps: true })
  193. .bundle()
  194. .pipe(source('vendor.js'))
  195. .pipe(buffer())
  196. .pipe(sourcemaps.init({ loadMaps: true }))
  197. .pipe(uglify())
  198. .pipe(sourcemaps.write('./'))
  199. .pipe(gulp.dest(misago + 'js'));
  200. };
  201. function copyzxcvbn() {
  202. return gulp.src('node_modules/zxcvbn/dist/*')
  203. .pipe(gulp.dest(misago + 'js'));
  204. };
  205. // Watchers
  206. function watchjs() {
  207. gulp.watch('src/**/*.js', gulp.series(lintjsapp, watchifybuild));
  208. }
  209. function watchstyle() {
  210. gulp.watch('style/**/*.less', faststyle);
  211. }
  212. // Entry points
  213. const buildstyle = gulp.series(cleanstyle, style);
  214. const buildjsapp = gulp.series(lintjsapp, jsapp);
  215. const build = gulp.parallel(
  216. buildstyle,
  217. statics,
  218. buildjsapp,
  219. vendors,
  220. copyzxcvbn
  221. )
  222. const watch = gulp.series(
  223. watchjs,
  224. watchstyle,
  225. )
  226. module.exports = {
  227. build,
  228. watch,
  229. watchstyle,
  230. lint: lintjsapp,
  231. }