223 lines
5.2 KiB
JavaScript
223 lines
5.2 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
import gulp from "gulp";
|
||
|
import concat from "gulp-concat";
|
||
|
import imagemin from "gulp-imagemin";
|
||
|
import include from "gulp-include";
|
||
|
import plumber from "gulp-plumber";
|
||
|
import rename from "gulp-rename";
|
||
|
import sourcemaps from "gulp-sourcemaps";
|
||
|
import uglify from "gulp-uglify";
|
||
|
import yaml from "gulp-yaml";
|
||
|
import browserSync from "browser-sync";
|
||
|
import cp from "child_process";
|
||
|
import { deleteAsync } from "del";
|
||
|
import fs from "fs";
|
||
|
import jsonSass from "json-sass";
|
||
|
import source from "vinyl-source-stream";
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Notify
|
||
|
*
|
||
|
* Show a notification in the browser's corner.
|
||
|
*
|
||
|
* @param {*} message
|
||
|
*/
|
||
|
function notify(message) {
|
||
|
browserSync.notify(message);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Config Task
|
||
|
*
|
||
|
* Build the main YAML config file.
|
||
|
*/
|
||
|
function config() {
|
||
|
return gulp.src('src/yml/_config.yml')
|
||
|
.pipe(include())
|
||
|
.on('error', console.error)
|
||
|
.pipe(gulp.dest('./'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Jekyll Task
|
||
|
*
|
||
|
* Build the Jekyll Site.
|
||
|
*
|
||
|
* @param {*} done
|
||
|
*/
|
||
|
function jekyll(done) {
|
||
|
notify('Building Jekyll...');
|
||
|
let bundle = process.platform === "win32" ? "bundle.bat" : "bundle";
|
||
|
return cp
|
||
|
.spawn(bundle, ['exec', 'jekyll build'], { stdio: 'inherit' })
|
||
|
.on('close', done);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Server Task
|
||
|
*
|
||
|
* Launch server using BrowserSync.
|
||
|
*
|
||
|
* @param {*} done
|
||
|
*/
|
||
|
function server(done) {
|
||
|
browserSync({
|
||
|
server: {
|
||
|
baseDir: '_site'
|
||
|
}
|
||
|
});
|
||
|
done();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reload Task
|
||
|
*
|
||
|
* Reload page with BrowserSync.
|
||
|
*
|
||
|
* @param {*} done
|
||
|
*/
|
||
|
function reload(done) {
|
||
|
notify('Reloading...');
|
||
|
browserSync.reload();
|
||
|
done();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Theme Tasks
|
||
|
*
|
||
|
* These three tasks are responsible for:
|
||
|
* 1. Converting src/yml/theme.yml to src/tmp/theme.json
|
||
|
* 2. Converting src/tmp/theme.json to _sass/_theme.scss
|
||
|
* 3. Deleting src/tmp
|
||
|
*
|
||
|
* With these tasks we can apply the theme colors to SVGs and CSS elements using
|
||
|
* just the src/yml/theme.yml file.
|
||
|
*/
|
||
|
|
||
|
function yamlTheme() {
|
||
|
return gulp.src('src/yml/theme.yml')
|
||
|
.pipe(yaml({ schema: 'DEFAULT_SAFE_SCHEMA' }))
|
||
|
.pipe(gulp.dest('src/tmp/'));
|
||
|
}
|
||
|
|
||
|
function jsonTheme() {
|
||
|
return fs.createReadStream('src/tmp/theme.json')
|
||
|
.pipe(jsonSass({
|
||
|
prefix: '$theme: ',
|
||
|
}))
|
||
|
.pipe(source('src/tmp/theme.json'))
|
||
|
.pipe(rename('_sass/_theme.scss'))
|
||
|
.pipe(gulp.dest('./'));
|
||
|
}
|
||
|
|
||
|
async function cleanTheme() {
|
||
|
return await deleteAsync(['src/tmp']);
|
||
|
}
|
||
|
|
||
|
const theme = gulp.series(yamlTheme, jsonTheme, cleanTheme);
|
||
|
|
||
|
/**
|
||
|
* Main JS Task
|
||
|
*
|
||
|
* All regular .js files are collected, minified and concatonated into one
|
||
|
* single scripts.min.js file (and sourcemap)
|
||
|
*/
|
||
|
function mainJs() {
|
||
|
notify('Building JS files...');
|
||
|
return gulp.src('src/js/main/**/*.js')
|
||
|
.pipe(sourcemaps.init())
|
||
|
.pipe(uglify())
|
||
|
.pipe(concat('scripts.min.js'))
|
||
|
.pipe(plumber())
|
||
|
.pipe(sourcemaps.write('.'))
|
||
|
.pipe(gulp.dest('_site/assets/js/'))
|
||
|
.pipe(browserSync.reload({ stream: true }))
|
||
|
.pipe(gulp.dest('assets/js'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Preview JS Task
|
||
|
*
|
||
|
* Copy preview JS files to the assets folder.
|
||
|
*/
|
||
|
function previewJs() {
|
||
|
notify('Copying preview files...');
|
||
|
return gulp.src('src/js/preview/**/*.*')
|
||
|
.pipe(gulp.dest('assets/js/'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* JavaScript Task
|
||
|
*
|
||
|
* Run all the JS related tasks.
|
||
|
*/
|
||
|
const js = gulp.parallel(mainJs, previewJs);
|
||
|
|
||
|
/**
|
||
|
* Images Task
|
||
|
*
|
||
|
* All images are optimized and copied to assets folder.
|
||
|
*/
|
||
|
function images() {
|
||
|
notify('Copying image files...');
|
||
|
return gulp.src('src/img/**/*.{jpg,png,gif,svg}')
|
||
|
.pipe(plumber())
|
||
|
.pipe(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true }))
|
||
|
.pipe(gulp.dest('assets/img/'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Watch Task
|
||
|
*
|
||
|
* Watch files to run proper tasks.
|
||
|
*/
|
||
|
function watch() {
|
||
|
// Watch YAML files for changes & recompile
|
||
|
gulp.watch(['src/yml/*.yml', '!src/yml/theme.yml'], gulp.series(config, jekyll, reload));
|
||
|
|
||
|
// Watch theme file for changes, rebuild styles & recompile
|
||
|
gulp.watch(['src/yml/theme.yml'], gulp.series(theme, config, jekyll, reload));
|
||
|
|
||
|
// Watch SASS files for changes & rebuild styles
|
||
|
gulp.watch(['_sass/**/*.scss'], gulp.series(jekyll, reload));
|
||
|
|
||
|
// Watch JS files for changes & recompile
|
||
|
gulp.watch('src/js/main/**/*.js', mainJs);
|
||
|
|
||
|
// Watch preview JS files for changes, copy files & reload
|
||
|
gulp.watch('src/js/preview/**/*.js', gulp.series(previewJs, reload));
|
||
|
|
||
|
// Watch images for changes, optimize & recompile
|
||
|
gulp.watch('src/img/**/*', gulp.series(images, config, jekyll, reload));
|
||
|
|
||
|
// Watch html/md files, rebuild config, run Jekyll & reload BrowserSync
|
||
|
gulp.watch(['*.html', '_includes/*.html', '_layouts/*.html', '_posts/*', '_authors/*', 'pages/*', 'category/*'], gulp.series(config, jekyll, reload));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Default Task
|
||
|
*
|
||
|
* Running just `gulp` will:
|
||
|
* - Compile the theme, SASS and JavaScript files
|
||
|
* - Optimize and copy images to its folder
|
||
|
* - Build the config file
|
||
|
* - Compile the Jekyll site
|
||
|
* - Launch BrowserSync & watch files
|
||
|
*/
|
||
|
const run = gulp.series(gulp.parallel(js, theme, images), config, jekyll, gulp.parallel(server, watch));
|
||
|
|
||
|
/**
|
||
|
* Build Task
|
||
|
*
|
||
|
* Running just `gulp build` will:
|
||
|
* - Compile the theme, SASS and JavaScript files
|
||
|
* - Optimize and copy images to its folder
|
||
|
* - Build the config file
|
||
|
* - Compile the Jekyll site
|
||
|
*/
|
||
|
const build = gulp.series(gulp.parallel(js, theme, images), config, jekyll);
|
||
|
|
||
|
export { run as default, build };
|