text: "use strict";
  
  // Load plugins
  const autoprefixer = require("gulp-autoprefixer");
  const browsersync = require("browser-sync").create();
  const cleanCSS = require("gulp-clean-css");
  const del = require("del");
  const gulp = require("gulp");
  const header = require("gulp-header");
  const merge = require("merge-stream");
  const plumber = require("gulp-plumber");
  const rename = require("gulp-rename");
  const sass = require("gulp-sass")(require('sass'));
  // const sass = require("gulp-sass")(require("node-sass"));
  
  const uglify = require("gulp-uglify");
  
  // Load package.json for banner
  const pkg = require('./package.json');
  
  // Set the banner content
  const banner = ['/*!\n',
    ' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\n',
    ' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\n',
    ' * Licensed under <%= pkg.license %> (https://github.com/StartBootstrap/<%= pkg.name %>/blob/master/LICENSE)\n',
    ' */\n',
    '\n'
  ].join('');
  
  // BrowserSync
  function browserSync(done) {
    browsersync.init({
      server: {
        baseDir: "./"
      },
      port: 3000
    });
    done();
  }
  
  // BrowserSync reload
  function browserSyncReload(done) {
    browsersync.reload();
    done();
  }
  
  // Clean vendor
  function clean() {
    return del(["./vendor/"]);
  }
  
  // Bring third party dependencies from node_modules into vendor directory
  function modules() {
    // Bootstrap JS
    var bootstrapJS = gulp.src('./node_modules/bootstrap/dist/js/*')
      .pipe(gulp.dest('./vendor/bootstrap/js'));
    // Bootstrap SCSS
    var bootstrapSCSS = gulp.src('./node_modules/bootstrap/scss/**/*')
      .pipe(gulp.dest('./vendor/bootstrap/scss'));
    // ChartJS
    var chartJS = gulp.src('./node_modules/chart.js/dist/*.js')
      .pipe(gulp.dest('./vendor/chart.js'));
    // dataTables
    var dataTables = gulp.src([
        './node_modules/datatables.net/js/*.js',
        './node_modules/datatables.net-bs4/js/*.js',
        './node_modules/datatables.net-bs4/css/*.css'
      ])
      .pipe(gulp.dest('./vendor/datatables'));
    // Font Awesome
    var fontAwesome = gulp.src('./node_modules/@fortawesome/**/*')
      .pipe(gulp.dest('./vendor'));
    // jQuery Easing
    var jqueryEasing = gulp.src('./node_modules/jquery.easing/*.js')
      .pipe(gulp.dest('./vendor/jquery-easing'));
    // jQuery
    var jquery = gulp.src([
        './node_modules/jquery/dist/*',
        '!./node_modules/jquery/dist/core.js'
      ])
      .pipe(gulp.dest('./vendor/jquery'));
    return merge(bootstrapJS, bootstrapSCSS, chartJS, dataTables, fontAwesome, jquery, jqueryEasing);
  }
  
  // CSS task
  function css() {
    return gulp
      .src("./scss/**/*.scss")
      .pipe(plumber())
      .pipe(sass({
        outputStyle: "expanded",
        includePaths: "./node_modules",
      }))
      .on("error", sass.logError)
      .pipe(autoprefixer({
        cascade: false
      }))
      .pipe(header(banner, {
        pkg: pkg
      }))
      .pipe(gulp.dest("./css"))
      .pipe(rename({
        suffix: ".min"
      }))
      .pipe(cleanCSS())
      .pipe(gulp.dest("./css"))
      .pipe(browsersync.stream());
  }
  
  // JS task
  function js() {
    return gulp
      .src([
        './js/*.js',
        '!./js/*.min.js',
      ])
      .pipe(uglify())
      .pipe(header(banner, {
        pkg: pkg
      }))
      .pipe(rename({
        suffix: '.min'
      }))
      .pipe(gulp.dest('./js'))
      .pipe(browsersync.stream());
  }
  
  // Watch files
  function watchFiles() {
    gulp.watch("./scss/**/*", css);
    gulp.watch(["./js/**/*", "!./js/**/*.min.js"], js);
    gulp.watch("./**/*.html", browserSyncReload);
  }
  
  // Define complex tasks
  const vendor = gulp.series(clean, modules);
  const build = gulp.series(vendor, gulp.parallel(css, js));
  const watch = gulp.series(build, gulp.parallel(watchFiles, browserSync));
  
  // Export tasks
  exports.css = css;
  exports.js = js;
  exports.clean = clean;
  exports.vendor = vendor;
  exports.build = build;
  exports.watch = watch;
  exports.default = build;
  