Files
report_satu_data/public/template/gulpfile.js
2025-03-21 10:22:45 +07:00

212 lines
4.2 KiB
JavaScript

/**
* Imports
*/
const {src, dest, watch, parallel} = require('gulp');
const notify = require('gulp-notify');
const browserSync = require('browser-sync').create();
const sass = require('gulp-sass');
const concat = require('gulp-concat');
const plumber = require('gulp-plumber');
const rename = require('gulp-rename');
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const uglify = require('gulp-uglify-es').default;
const imagemin = require('gulp-imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const nunjucks = require('gulp-nunjucks');
const color = require('gulp-color');
const nodePath = require('path');
/**
* Configuration
* @type {String}
*/
var cssDir = 'assets/css',
jsDir = 'assets/js',
htmlDir = 'sources/pages',
sassDir = 'sources/scss',
imgDir = 'assets/img';
/**
* Helpers
*/
function _compile_html(path, onEnd, log=true, ret=false) {
if(log)
_log('[HTML] Compiling: ' + path, 'GREEN');
let compile_html = src(path, { base: htmlDir })
.pipe(plumber())
.pipe(nunjucks.compile({
version: '2.3.0',
site_name: 'Stisla'
},
/**
* Nunjucks options
*/
{
trimBlocks: true,
lstripBlocks: true,
/**
* Nunjucks filters
* @type {Object}
*/
filters: {
is_active: (str, reg, page) => {
reg = new RegExp(reg, 'gm');
reg = reg.exec(page);
if(reg != null) {
return str;
}
}
}
}))
.on('error', console.error.bind(console))
.on('end', () => {
if(onEnd)
onEnd.call(this);
if(log)
_log('[HTML] Finished', 'GREEN');
})
.pipe(dest('pages'))
.pipe(plumber.stop());
if(ret) return compile_html;
}
function _compile_scss(path, onEnd, log=true, ret=false) {
if(log)
_log('[SCSS] Compiling:' + path, 'GREEN');
let compile_scss = src(path)
.pipe(plumber())
.pipe(sass({
errorLogToConsole: true
}))
.on('error', console.error.bind(console))
.on('end', () => {
if(onEnd)
onEnd.call(this);
if(log)
_log('[SCSS] Finished', 'GREEN');
})
.pipe(rename({
dirname: '',
extname: '.css'
}))
.pipe(postcss([autoprefixer()]))
.pipe(dest(cssDir))
.pipe(plumber.stop());
if(ret) return compile_scss;
}
function _log(str, clr) {
if(!clr) clr = 'WHITE';
console.log(color(str, clr));
}
/**
* End of helper
*/
/**
* Execution
*/
function folder() {
return src('*.*', {read: false})
.pipe(dest('./assets'))
.pipe(dest('./assets/css'))
.pipe(dest('./assets/js'))
.pipe(dest('./assets/img'));
}
function image() {
return src(imgDir + '/**/*.*')
.pipe(plumber())
.pipe(imagemin([
imageminMozjpeg({quality: 80})
]))
.pipe(dest(imgDir))
.pipe(plumber.stop());
}
function compile_scss() {
return _compile_scss(sassDir + '/**/*.scss', null, false, true);
}
function compile_html() {
return _compile_html(htmlDir + '/**/*.html', null, false, true);
}
function watching() {
compile_scss();
compile_html();
/**
* BrowserSync initialization
* @type {Object}
*/
browserSync.init({
server:{
baseDir: "./"
},
startPath: 'pages/index.html',
port: 8080
});
/**
* Watch ${htmlDir}
*/
watch([
htmlDir + '/**/*.html',
sassDir + '/**/*.scss',
jsDir + '/**/*.js',
imgDir + '/**/*.*',
]).on('change', (file) => {
file = file.replace(/\\/g, nodePath.sep);
if(file.indexOf('.scss') > -1) {
_compile_scss(sassDir + '/**/*.scss', () => {
return browserSync.reload();
});
}
if(file.indexOf('layouts') > -1 && file.indexOf('.html') > -1) {
_compile_html(htmlDir + '/*.html', () => {
return browserSync.reload();
});
}else if(file.indexOf('.html') > -1) {
_compile_html(file, () => {
return browserSync.reload();
});
}
if(file.indexOf(jsDir) > -1 || file.indexOf(imgDir) > -1) {
return browserSync.reload();
}
});
}
// Create folder first
exports.folder = folder;
// Minify images
exports.image = image;
// Compile SCSS
exports.scss = compile_scss;
// Compile HTML
exports.html = compile_html;
// Dist
exports.dist = parallel(folder, compile_scss, compile_html);
// Run this command for dev.
exports.default = watching;