You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

180 lines
3.8 KiB

  1. /**
  2. * Gulp file to automate the various tasks
  3. * */
  4. const autoprefixer = require('gulp-autoprefixer');
  5. const browserSync = require('browser-sync').create();
  6. const csscomb = require('gulp-csscomb');
  7. const cleanCss = require('gulp-clean-css');
  8. const del = require('del');
  9. const gulp = require('gulp');
  10. const postcss = require('gulp-postcss');
  11. const sass = require('gulp-sass');
  12. const uglify = require('gulp-uglify');
  13. const rename = require('gulp-rename');
  14. const wait = require('gulp-wait');
  15. const sourcemaps = require('gulp-sourcemaps');
  16. // Define paths
  17. const paths = {
  18. dist: {
  19. base: 'dist',
  20. img: 'dist/img',
  21. libs: 'dist/vendor',
  22. fonts: 'dist/fonts',
  23. css: 'dist/css',
  24. js: 'dist/js',
  25. vendor: 'dist/vendor',
  26. },
  27. base: {
  28. base: './public',
  29. node: 'node_modules',
  30. },
  31. src: {
  32. base: './public',
  33. css: 'public/css/**/*.css',
  34. js: 'public/js/**/*.js',
  35. html: '**/*.html',
  36. img: 'public/img/**/*.+(png|jpg|gif|svg)',
  37. ejs: 'views/**/*.ejs',
  38. fonts: 'public/fonts/**/*.+(eot|svg|ttf|woff|woff2)',
  39. vendor: 'public/vendor/**/*',
  40. scss: 'public/scss/**/*.scss',
  41. },
  42. };
  43. // Compile SCSS for dev
  44. function scssDev() {
  45. return gulp
  46. .src(paths.src.scss)
  47. .pipe(wait(500))
  48. .pipe(sass().on('error', sass.logError))
  49. .pipe(postcss([require('postcss-flexbugs-fixes')])) // eslint-disable-line
  50. .pipe(
  51. autoprefixer({
  52. browsers: ['> 1%'],
  53. })
  54. )
  55. .pipe(csscomb())
  56. .pipe(sourcemaps.init())
  57. .pipe(cleanCss())
  58. .pipe(sourcemaps.write())
  59. .pipe(rename({ suffix: '.min' }))
  60. .pipe(gulp.dest(`${paths.src.base}/css`))
  61. .pipe(browserSync.stream({ match: '**/*.css' }));
  62. }
  63. // Compile SCSS for prod
  64. function scssProd() {
  65. return gulp
  66. .src(paths.src.scss)
  67. .pipe(wait(500))
  68. .pipe(sass().on('error', sass.logError))
  69. .pipe(postcss([require('postcss-flexbugs-fixes')])) // eslint-disable-line
  70. .pipe(
  71. autoprefixer({
  72. browsers: ['> 1%'],
  73. })
  74. )
  75. .pipe(csscomb())
  76. .pipe(gulp.dest(`${paths.dist.base}/css`));
  77. }
  78. // Minify CSS
  79. function minifyCSS() {
  80. return gulp
  81. .src([`${paths.dist.css}/argon.css`])
  82. .pipe(cleanCss())
  83. .pipe(rename({ suffix: '.min' }))
  84. .pipe(gulp.dest(`${paths.dist.base}/css`));
  85. }
  86. // Minify JS
  87. function minifyJS() {
  88. return gulp
  89. .src([`${paths.src.base}/js/argon.js`])
  90. .pipe(uglify())
  91. .pipe(rename({ suffix: '.min' }))
  92. .pipe(gulp.dest(`${paths.dist.base}/js`));
  93. }
  94. // Live reload
  95. function serve(done) {
  96. browserSync.init({
  97. files: ['public/**/*', 'views/**/*'],
  98. proxy: 'http://0.0.0.0:8000',
  99. });
  100. done();
  101. }
  102. // Watch for changes
  103. function watch() {
  104. gulp.watch(paths.src.scss, scssDev);
  105. gulp.watch(paths.src.js, browserSync.reload);
  106. gulp.watch(paths.src.html, browserSync.reload);
  107. gulp.watch(paths.src.ejs, browserSync.reload);
  108. }
  109. // Clean
  110. async function cleanDist(done) {
  111. await del.sync(paths.dist.base);
  112. done();
  113. }
  114. // Copy JS
  115. async function copyJS(done) {
  116. gulp.src([`${paths.src.js}`]).pipe(gulp.dest(`${paths.dist.js}`));
  117. done();
  118. }
  119. // Copy images
  120. async function copyImages(done) {
  121. gulp.src([`${paths.src.img}`]).pipe(gulp.dest(`${paths.dist.img}`));
  122. done();
  123. }
  124. // Copy fonts
  125. async function copyFonts(done) {
  126. gulp.src([`${paths.src.fonts}`]).pipe(gulp.dest(`${paths.dist.fonts}`));
  127. done();
  128. }
  129. // Copy vendor
  130. async function copyVendor(done) {
  131. gulp.src([`${paths.src.vendor}`]).pipe(gulp.dest(`${paths.dist.vendor}`));
  132. done();
  133. }
  134. // Build
  135. const build = gulp.series(
  136. cleanDist,
  137. scssProd,
  138. copyJS,
  139. copyImages,
  140. copyFonts,
  141. copyVendor,
  142. minifyJS,
  143. minifyCSS
  144. );
  145. // Default
  146. const defaultTask = gulp.series(scssDev, serve, watch);
  147. module.exports = {
  148. scssDev,
  149. scssProd,
  150. minifyCSS,
  151. minifyJS,
  152. serve,
  153. watch,
  154. cleanDist,
  155. copyJS,
  156. copyImages,
  157. copyFonts,
  158. copyVendor,
  159. build,
  160. default: defaultTask,
  161. };