Files
everything2/EveryThing/gulpfile.js
David Štaleker 03b92525d7 Prvi commit
2023-05-12 09:00:07 +02:00

263 lines
7.6 KiB
JavaScript

/// <binding ProjectOpened='watch' />
const path = require('path');
const fs = require('fs');
const { src, dest, watch, parallel, series } = require('gulp');
const sass = require('gulp-sass');
const autoprefixer = require('gulp-autoprefixer');
const sourcemaps = require('gulp-sourcemaps');
const cleanCSS = require('gulp-clean-css');
const rename = require('gulp-rename');
const uglify = require('gulp-uglify');
const babel = require('gulp-babel');
const plumber = require('gulp-plumber');
const notify = require('gulp-notify');
const gulpIf = require('gulp-if');
global.isProduction = false;
// -------------------------------------------------------------------------------
// Utilities
function normalize(p) {
return p.replace(/\\/g, '/');
}
function root(...paths) {
const result = [].concat(paths).map(p => {
return p.startsWith('!') ?
normalize(`!${path.join(__dirname, p.slice(1))}`) :
normalize(path.join(__dirname, p))
})
return result.length === 1 ? result[0] : result
}
// -------------------------------------------------------------------------------
// Build SASS
function buildSass(...paths) {
return src(root(...paths), {
base: root('wwwroot')
})
.pipe(plumber({
errorHandler: function (err) {
notify.onError({
title: "Gulp error in " + err.plugin,
message: err.toString()
})(err)
}
}))
.pipe(sourcemaps.init())
.pipe(sass({
outputStyle: 'nested'
}).on('error', sass.logError))
.pipe(sourcemaps.write())
.pipe(sourcemaps.init({ loadMaps: true }))
.pipe(autoprefixer({
browsers: [
'>= 1%',
'last 2 versions',
'not dead',
'Chrome >= 45',
'Firefox >= 38',
'Edge >= 12',
'Explorer >= 10',
'iOS >= 9',
'Safari >= 9',
'Android >= 4.4',
'Opera >= 30'
]
}))
.pipe(sourcemaps.write())
.pipe(dest(root('wwwroot')))
.pipe(gulpIf(global.isProduction, cleanCSS()))
.pipe(gulpIf(global.isProduction, rename({
extname: '.min.css'
})))
.pipe(gulpIf(global.isProduction, dest(root('wwwroot'))))
}
// -------------------------------------------------------------------------------
// Tasks
const buildJsTask = function () {
return src(root(
'wwwroot/**/*.js',
'!wwwroot/**/*.es5.js',
'!wwwroot/**/*.min.js',
'!wwwroot/vendor/**/*.js'
), {
base: root('wwwroot')
})
.pipe(plumber({
errorHandler: function (err) {
notify.onError({
title: "Gulp error in " + err.plugin,
message: err.toString()
})(err)
}
}))
.pipe(sourcemaps.init())
.pipe(babel({
presets: [
['@babel/preset-env', {
targets: {
browsers: [
'>= 1%',
'last 2 versions',
'not dead',
'Chrome >= 45',
'Firefox >= 38',
'Edge >= 12',
'Explorer >= 10',
'iOS >= 9',
'Safari >= 9',
'Android >= 4.4',
'Opera >= 30'
]
}
}]
]
}))
.pipe(rename({
extname: '.es5.js'
}))
.pipe(sourcemaps.write())
.pipe(dest(root('wwwroot')))
.pipe(gulpIf(global.isProduction, uglify()))
.pipe(gulpIf(global.isProduction, rename({
extname: '.min.js'
})))
.pipe(gulpIf(global.isProduction, dest(root('wwwroot'))))
}
const buildSassTask = function () {
return buildSass(
'wwwroot/**/*.scss',
'!wwwroot/**/_*.scss',
'!wwwroot/vendor/**/*.scss'
)
}
const buildVendorSassTask = function () {
return buildSass(
'wwwroot/vendor/css/**/*.scss',
'!wwwroot/vendor/css/**/_*.scss'
)
}
const buildVendorLibsTask = function () {
return buildSass(
'wwwroot/vendor/libs/**/*.scss',
'!wwwroot/vendor/libs/**/_*.scss'
)
}
// -------------------------------------------------------------------------------
// Watch
const watchTask = function () {
watch(root(
'wwwroot/**/*.scss',
'!wwwroot/vendor/**/*.scss',
'wwwroot/vendor/css/_custom-variables/*.scss',
'wwwroot/vendor/css/_appwork/_variables*.scss'
), buildSassTask)
watch(root('wwwroot/vendor/css/**/*.scss'), buildVendorSassTask)
watch(root(
'wwwroot/vendor/libs/**/*.scss',
'wwwroot/vendor/css/_custom-variables/*.scss',
'wwwroot/vendor/css/_appwork/_variables*.scss'
), buildVendorLibsTask)
watch(root(
'wwwroot/**/*.js',
'!wwwroot/**/*.es5.js',
'!wwwroot/**/*.min.js',
'!wwwroot/vendor/**/*.js'
), buildJsTask)
}
// -------------------------------------------------------------------------------
// Custom vendors
//
// You can copy custom assets from the node_modules directory to wwwroot directory
// by adding a vendor file path into the "CUSTOM_VENDORS" object:
//
// const CUSTOM_VENDORS = {
// ...
// 'Path to source file': 'Path to dest file'
// }
//
const CUSTOM_VENDORS = {
'node_modules/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js': 'wwwroot/vendor/libs/validate/validate.unobtrusive.js',
'node_modules/jquery/dist/jquery.min.js': 'wwwroot/vendor/libs/jquery/jquery.min.js'
}
buildVendorCopyTask = parallel(
Object.keys(CUSTOM_VENDORS).reduce(function (tasks, vendorSrc) {
if (!fs.existsSync(root(vendorSrc))) {
console.warn(`Vendor source not found: "${root(vendorSrc)}"`)
return
} else {
console.warn(`Vendor: "${root(vendorSrc)}"`);
}
const vendorDest = path.dirname(CUSTOM_VENDORS[vendorSrc])
const vendorName = path.basename(CUSTOM_VENDORS[vendorSrc])
const functionName = `buildVendorCopy${vendorName.replace(/^./g, m => m.toUpperCase()).replace(/\.(.)/g, (m, $1) => $1.toUpperCase())}Task`
const taskFunction = function () {
return src(root(vendorSrc))
.pipe(rename(vendorName))
.pipe(dest(root(vendorDest)))
}
Object.defineProperty(taskFunction, 'name', {
value: functionName
})
return tasks.concat(taskFunction)
}, [])
)
// -------------------------------------------------------------------------------
// Build
const buildTask = parallel(
buildSassTask,
buildJsTask,
buildVendorSassTask,
buildVendorLibsTask,
buildVendorCopyTask
)
const productionBuildTask = series(
function setProductionMode(cb) {
global.isProduction = true
console.warn('>>> Running Gulp in production mode.')
cb()
},
buildTask
)
// -------------------------------------------------------------------------------
// Exports
module.exports = {
default: buildTask,
'build:all': buildTask,
'build:all:prod': productionBuildTask,
'build:js': buildJsTask,
'build:sass': buildSassTask,
'build:vendor:sass': buildVendorSassTask,
'build:vendor:libs': buildVendorLibsTask,
'build:vendor:copy': buildVendorCopyTask,
watch: watchTask
}