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