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
 | |
|   };
 | |
| };
 |