-
Notifications
You must be signed in to change notification settings - Fork 0
/
Gulpfile.js
127 lines (111 loc) · 3.55 KB
/
Gulpfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* eslint-env node */
/* eslint no-console:0 */
(function() {
'use strict';
const
chalk = require('chalk'),
gulp = require('gulp'),
plumber = require('gulp-plumber'),
{ sass } = require('@mr-hope/gulp-sass'),
sourceMaps = require('gulp-sourcemaps'),
autoprefixer = require('gulp-autoprefixer'),
cleanCss = require('gulp-clean-css'),
terser = require('gulp-terser-js'),
babel = require('gulp-babel'),
cached = require('gulp-cached'),
rename = require('gulp-rename'),
del = require('del'),
fs = require('fs'),
babelrc = JSON.parse(fs.readFileSync('./.babelrc', 'utf-8')),
workingDir = __dirname;
sass.compiler = require('sass');
require('dotenv').load();
class Logger {
constructor(prompt) {
this.prefix = `[${chalk.blue(prompt)}] `;
}
log(message) {
console.log(this.prefix + message);
}
error(message) {
if (typeof message === 'string'){
message = message.trim()
.replace(/[/\\]?public/, '');
console.error(this.prefix + 'Error in ' + message);
}
else console.log(JSON.stringify(message, null, '4'));
}
}
const appendMinSuffix = () => rename((path) => {
path.extname = `.min${path.extname}`;
});
const clean = () => del(['public/js', 'public/css']);
const lockfilePath = process.env.NPM_BUILD_LOCK_FILE_PATH;
const lock = done => {
fs.closeSync(fs.openSync(lockfilePath, 'a'));
done();
};
const unlock = () => del([lockfilePath]);
const createWatchers = done => {
gulp.watch(JSWatchArray, { debounceDelay: 2000 }, gulp.series('js'));
JSL.log('File watcher active');
gulp.watch(SASSWatchArray, { debounceDelay: 2000 }, gulp.series('scss'));
SASSL.log('File watcher active');
done();
};
let SASSL = new Logger('scss'),
SASSWatchArray = ['assets/scss/*.scss', 'assets/scss/**/*.scss'];
gulp.task('scss', () => {
return gulp.src(SASSWatchArray)
.pipe(plumber(function(err) {
SASSL.error(err.relativePath + '\n' + ' line ' + err.line + ': ' + err.messageOriginal);
this.emit('end');
}))
.pipe(sourceMaps.init())
.pipe(sass({
outputStyle: 'expanded',
errLogToConsole: true,
}))
.pipe(autoprefixer())
.pipe(cleanCss({
processImport: false,
compatibility: '-units.pc,-units.pt',
}))
.pipe(appendMinSuffix())
.pipe(sourceMaps.write('.'))
.pipe(gulp.dest('public/css'));
});
let JSL = new Logger('js'),
JSWatchArray = [
'assets/js/*.js',
'assets/js/**/*.js',
'assets/js/*.jsx',
'assets/js/**/*.jsx',
];
gulp.task('js', () => {
return gulp.src(JSWatchArray)
.pipe(cached('js', { optimizeMemory: true }))
.pipe(plumber(function(err) {
err =
err.fileName
? err.fileName.replace(workingDir, '') + '\n line ' + (
err._babel === true
? err.loc.line
: (err.lineNumber || '?')
) + ': ' + err.message.replace(/^[/\\]/, '')
.replace(err.fileName.replace(/\\/g, '/') + ': ', '')
.replace(/\(\d+(:\d+)?\)$/, '')
: err;
JSL.error(err);
this.emit('end');
}))
.pipe(sourceMaps.init())
.pipe(babel(babelrc))
.pipe(terser({ compress: { drop_debugger: false } }))
.pipe(appendMinSuffix())
.pipe(sourceMaps.write('.'))
.pipe(gulp.dest('public/js'));
});
gulp.task('default', gulp.series(lock, clean, 'js', 'scss', unlock));
gulp.task('watch', gulp.series('default', createWatchers));
})();