/
gulpfile.js
146 lines (124 loc) · 4.7 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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
var gulp = require('gulp'),
gulpif = require('gulp-if'),
argv = require('yargs').argv,
rename = require('gulp-rename'),
replace = require('gulp-replace'),
concat = require('gulp-concat'),
uglify = require('gulp-uglify'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css'),
minifyHTML = require('gulp-minify-html'),
fileInclude = require('gulp-file-include'),
sourcemaps = require('gulp-sourcemaps'),
csslint = require('gulp-csslint'),
lessReporter = require('gulp-csslint-less-reporter'),
jshint = require('gulp-jshint'),
del = require('del'),
crypto = require('crypto'),
outputFolder = 'public',
currentTS = '',
isProductionBuild = !!argv.prod;
function hash(str, postfix) {
postfix = postfix || '';
return crypto.createHash('md5').update(str + postfix).digest('hex');
}
var paths = {
scriptsGlobal: [
'./node_modules/routerjs/src/router.js',
'./node_modules/jquery/dist/jquery.js'
],
scriptsApp : [
'./config.js',
'./src/scripts/radio/index.js',
'./src/scripts/radio/router.js',
'./src/scripts/radio/nowplaying.js'
],
styles : [
'./node_modules/normalize.css/normalize.css',
'./node_modules/font-awesome/css/font-awesome.css',
'./src/styles/radio/fonts.css',
'./src/styles/radio/basic.less',
'./src/styles/radio/left.less',
'./src/styles/radio/right.less'
],
html : [
'./src/html/index.html'
],
htmlPartials : [
'./src/html/partials/*.html'
],
icons : [
'./src/icons/*'
],
fonts : [
'./node_modules/font-awesome/fonts/*',
'./src/fonts/*'
]
};
gulp.task('clean-all', function() {
return del.sync([
'./' + outputFolder + '/files/fonts',
'./' + outputFolder + '/files/icons',
'./' + outputFolder + '/files/scripts',
'./' + outputFolder + '/files/styles',
'./' + outputFolder + '/index.html'
]);
});
gulp.task('set-currentTS', function() {
return currentTS = '' + new Date().valueOf();
});
gulp.task('lint-scripts', function() {
return gulp.src(paths.scriptsApp)
.pipe(jshint())
.pipe(jshint.reporter('default', { verbose: true }));
});
gulp.task('gen-scripts', function() {
return gulp.src(paths.scriptsGlobal.concat(paths.scriptsApp))
.pipe(gulpif(!isProductionBuild, sourcemaps.init()))
.pipe(concat(hash(currentTS, 'js') + '.js'))
.pipe(gulpif(isProductionBuild, uglify()))
.on('error', function(err) {
console.error("\n==================\n" + 'UglifyJS Error: ', err.message + "\n==================\n");
this.emit('end');
})
.pipe(gulpif(!isProductionBuild, sourcemaps.write('.')))
.pipe(replace('var radio={};', 'var radio={};radio.releaseDate=\'' + new Date() + '\';'))
.pipe(gulp.dest('./' + outputFolder + '/files/scripts'));
});
gulp.task('lint-styles', function() {
return gulp.src(['./src/styles/radio/*'])
.pipe(sourcemaps.init())
.pipe(less())
.pipe(csslint())
.pipe(lessReporter());
});
gulp.task('gen-styles', function() {
return gulp.src(paths.styles)
.pipe(concat(hash(currentTS, 'css') + '.css'))
.pipe(less())
.pipe(gulpif(isProductionBuild, minifyCSS({keepSpecialComments:0})))
.pipe(gulp.dest('./' + outputFolder + '/files/styles'));
});
gulp.task('copy-icons', function() {
return gulp.src(paths.icons)
.pipe(rename('icons/' + hash(currentTS, 'ico') + '.ico'))
.pipe(gulp.dest('./' + outputFolder + '/files'));
});
gulp.task('copy-fonts', function() {
return gulp.src(paths.fonts)
.pipe(gulp.dest('./' + outputFolder + '/files/fonts'));
});
gulp.task('gen-index-html', function() {
return gulp.src(paths.html)
.pipe(fileInclude())
.pipe(gulpif(isProductionBuild, minifyHTML({empty:true, spare:true, quotes:true})))
.pipe(replace(/<head>/, '<head><link rel="stylesheet" type="text/css" href="./files/styles/' + hash(currentTS, 'css') + '.css" /><script type="text/javascript" src="./files/scripts/' + hash(currentTS, 'js') + '.js"></script><link rel="shortcut icon" href="./files/icons/' + hash(currentTS, 'ico') + '.ico" />'))
.pipe(gulp.dest('./' + outputFolder));
});
gulp.task('all', ['clean-all', 'set-currentTS', 'lint-scripts', 'gen-scripts', 'lint-styles', 'gen-styles', 'copy-icons', 'copy-fonts', 'gen-index-html'], function() {
return true;
});
gulp.task('watch', function() {
gulp.watch((paths.scriptsGlobal).concat(paths.scriptsApp, paths.html, paths.htmlPartials, paths.styles, paths.fonts, paths.icons), ['all']);
});
gulp.task('default', ['all']);