175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const path = require('path');
 | 
						|
const { src, dest, series, parallel } = require('gulp');
 | 
						|
const sass = require('gulp-dart-sass');
 | 
						|
const localSass = require('sass');
 | 
						|
const autoprefixer = require('gulp-autoprefixer');
 | 
						|
const exec = require('gulp-exec');
 | 
						|
const gulpIf = require('gulp-if');
 | 
						|
const sourcemaps = require('gulp-sourcemaps');
 | 
						|
const browserSync = require('browser-sync').create();
 | 
						|
const webpack = require('webpack');
 | 
						|
const log = require('fancy-log');
 | 
						|
const colors = require('ansi-colors');
 | 
						|
const rename = require('gulp-rename');
 | 
						|
 | 
						|
module.exports = (conf, srcGlob) => {
 | 
						|
  // Build CSS
 | 
						|
  // -------------------------------------------------------------------------------
 | 
						|
  const buildCssTask = function (cb) {
 | 
						|
    return src(srcGlob('**/*.scss', '!**/_*.scss'))
 | 
						|
      .pipe(gulpIf(conf.sourcemaps, sourcemaps.init()))
 | 
						|
      .pipe(
 | 
						|
        // If sass is installed on your local machine, it will use command line to compile sass else it will use dart sass npm which 3 time slower
 | 
						|
        gulpIf(
 | 
						|
          localSass,
 | 
						|
          exec(
 | 
						|
            // If conf.minify == true, generate compressed style without sourcemap
 | 
						|
            gulpIf(
 | 
						|
              conf.minify,
 | 
						|
              `sass scss:${conf.distPath}/css fonts:${conf.distPath}/fonts libs:${conf.distPath}/libs --style compressed --no-source-map`,
 | 
						|
              `sass scss:${conf.distPath}/css fonts:${conf.distPath}/fonts libs:${conf.distPath}/libs --no-source-map`
 | 
						|
            ),
 | 
						|
            function (err) {
 | 
						|
              cb(err);
 | 
						|
            }
 | 
						|
          ),
 | 
						|
          sass({
 | 
						|
            outputStyle: conf.minify ? 'compressed' : 'expanded'
 | 
						|
          }).on('error', sass.logError)
 | 
						|
        )
 | 
						|
      )
 | 
						|
      .pipe(gulpIf(conf.sourcemaps, sourcemaps.write()))
 | 
						|
 | 
						|
      .pipe(
 | 
						|
        rename(function (path) {
 | 
						|
          path.dirname = path.dirname.replace('scss', 'css');
 | 
						|
        })
 | 
						|
      )
 | 
						|
      .pipe(dest(conf.distPath))
 | 
						|
      .pipe(browserSync.stream());
 | 
						|
  };
 | 
						|
  // Autoprefix css
 | 
						|
  const buildAutoprefixCssTask = function (cb) {
 | 
						|
    return src(conf.distPath + '/css/**/*.css')
 | 
						|
      .pipe(
 | 
						|
        gulpIf(
 | 
						|
          conf.sourcemaps,
 | 
						|
          sourcemaps.init({
 | 
						|
            loadMaps: true
 | 
						|
          })
 | 
						|
        )
 | 
						|
      )
 | 
						|
      .pipe(autoprefixer())
 | 
						|
      .pipe(gulpIf(conf.sourcemaps, sourcemaps.write()))
 | 
						|
      .pipe(dest(conf.distPath + '/css'))
 | 
						|
      .pipe(browserSync.stream());
 | 
						|
    cb();
 | 
						|
  };
 | 
						|
 | 
						|
  // Build JS
 | 
						|
  // -------------------------------------------------------------------------------
 | 
						|
  const buildJsTask = function (cb) {
 | 
						|
    setTimeout(function () {
 | 
						|
      webpack(require('../webpack.config'), (err, stats) => {
 | 
						|
        if (err) {
 | 
						|
          log(colors.gray('Webpack error:'), colors.red(err.stack || err));
 | 
						|
          if (err.details) log(colors.gray('Webpack error details:'), err.details);
 | 
						|
          return cb();
 | 
						|
        }
 | 
						|
 | 
						|
        const info = stats.toJson();
 | 
						|
 | 
						|
        if (stats.hasErrors()) {
 | 
						|
          info.errors.forEach(e => log(colors.gray('Webpack compilation error:'), colors.red(e)));
 | 
						|
        }
 | 
						|
 | 
						|
        if (stats.hasWarnings()) {
 | 
						|
          info.warnings.forEach(w => log(colors.gray('Webpack compilation warning:'), colors.yellow(w)));
 | 
						|
        }
 | 
						|
 | 
						|
        // Print log
 | 
						|
        log(
 | 
						|
          stats.toString({
 | 
						|
            colors: colors.enabled,
 | 
						|
            hash: false,
 | 
						|
            timings: false,
 | 
						|
            chunks: false,
 | 
						|
            chunkModules: false,
 | 
						|
            modules: false,
 | 
						|
            children: true,
 | 
						|
            version: true,
 | 
						|
            cached: false,
 | 
						|
            cachedAssets: false,
 | 
						|
            reasons: false,
 | 
						|
            source: false,
 | 
						|
            errorDetails: false
 | 
						|
          })
 | 
						|
        );
 | 
						|
 | 
						|
        cb();
 | 
						|
        browserSync.reload();
 | 
						|
      });
 | 
						|
    }, 1);
 | 
						|
  };
 | 
						|
 | 
						|
  // Build fonts
 | 
						|
  // -------------------------------------------------------------------------------
 | 
						|
 | 
						|
  const FONT_TASKS = [
 | 
						|
    {
 | 
						|
      name: 'boxicons',
 | 
						|
      path: 'node_modules/boxicons/fonts/*'
 | 
						|
    }
 | 
						|
  ].reduce(function (tasks, font) {
 | 
						|
    const functionName = `buildFonts${font.name.replace(/^./, m => m.toUpperCase())}Task`;
 | 
						|
    const taskFunction = function () {
 | 
						|
      // return src(root(font.path))
 | 
						|
      return (
 | 
						|
        src(font.path)
 | 
						|
          // .pipe(dest(normalize(path.join(conf.distPath, 'fonts', font.name))))
 | 
						|
          .pipe(dest(path.join(conf.distPath, 'fonts', font.name)))
 | 
						|
      );
 | 
						|
    };
 | 
						|
 | 
						|
    Object.defineProperty(taskFunction, 'name', {
 | 
						|
      value: functionName
 | 
						|
    });
 | 
						|
 | 
						|
    return tasks.concat([taskFunction]);
 | 
						|
  }, []);
 | 
						|
 | 
						|
  const buildFontsTask = parallel(FONT_TASKS);
 | 
						|
  // Copy
 | 
						|
  // -------------------------------------------------------------------------------
 | 
						|
 | 
						|
  const buildCopyTask = function () {
 | 
						|
    return src(
 | 
						|
      srcGlob(
 | 
						|
        '**/*.png',
 | 
						|
        '**/*.gif',
 | 
						|
        '**/*.jpg',
 | 
						|
        '**/*.jpeg',
 | 
						|
        '**/*.svg',
 | 
						|
        '**/*.swf',
 | 
						|
        '**/*.eot',
 | 
						|
        '**/*.ttf',
 | 
						|
        '**/*.woff',
 | 
						|
        '**/*.woff2'
 | 
						|
      )
 | 
						|
    ).pipe(dest(conf.distPath));
 | 
						|
  };
 | 
						|
 | 
						|
  const buildAllTask = series(buildCssTask, buildJsTask, buildFontsTask, buildCopyTask);
 | 
						|
 | 
						|
  // Exports
 | 
						|
  // ---------------------------------------------------------------------------
 | 
						|
 | 
						|
  return {
 | 
						|
    css: series(buildCssTask, buildAutoprefixCssTask),
 | 
						|
    js: buildJsTask,
 | 
						|
    fonts: buildFontsTask,
 | 
						|
    copy: buildCopyTask,
 | 
						|
    all: buildAllTask
 | 
						|
  };
 | 
						|
};
 |