Skip to content

Commit fe351af

Browse files
committed
Should rid critical security vulns in npm/gulp
1 parent 2cdbb8c commit fe351af

3 files changed

Lines changed: 2591 additions & 7380 deletions

File tree

gulpfile.js

Lines changed: 83 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
// ##### Gulp Tasks #####
77

88
var { src, dest, watch, series, parallel } = require('gulp');
9+
var path = require('path');
910
var sass = require('gulp-sass')(require('sass'));
1011
var autoprefixer = require('autoprefixer');
1112
var browserSync = require('browser-sync');
1213
var server = browserSync.create();
14+
var through2 = require('through2');
1315
var useref = require('gulp-useref');
1416
var uglify = require('gulp-uglify');
1517
var gulpIf = require('gulp-if');
1618
var cleanCSS = require('gulp-clean-css');
17-
var cache = require('gulp-cache');
1819
var del = require('del');
1920
var modernizr = require('gulp-modernizr');
2021
var stylelint = require('stylelint');
@@ -24,6 +25,8 @@ var ssi = require('browsersync-ssi');
2425
var postcss = require('gulp-postcss');
2526
var assets = require('postcss-assets');
2627
var ghPages = require('gulp-gh-pages');
28+
var sharp = require('sharp');
29+
var optimizeSvg = require('svgo').optimize;
2730

2831
// Public Tasks:
2932

@@ -36,6 +39,8 @@ exports.upload = githubpages;
3639

3740
exports.modernizr = runmodernizr;
3841

42+
exports.scsslint_legacy = scsslint_legacy;
43+
3944
// Process scss to css, add sourcemaps, inline font & image files into css:
4045

4146
sass.compiler = require('sass');
@@ -53,7 +58,7 @@ var dartSassOptions = {
5358
]
5459
};
5560

56-
function scss(cb) {
61+
function scss() {
5762
return src('dev/scss/*.scss', { sourcemaps: true })
5863
.pipe(sass(dartSassOptions).on('error', sass.logError))
5964
.pipe(postcss([autoprefixer({
@@ -63,18 +68,16 @@ function scss(cb) {
6368
})]))
6469
.pipe(dest('dev/css', { sourcemaps: 'sourcemaps' }))
6570
.pipe(browserSync.stream());
66-
cb();
6771
}
6872

69-
function scss_legacy(cb) {
73+
function scss_legacy() {
7074
return src('dev/legacy-scss/*.scss', { sourcemaps: true })
7175
.pipe(sass(dartSassOptions).on('error', sass.logError))
7276
.pipe(postcss([autoprefixer({
7377
overrideBrowserslist: ['last 2 versions']
7478
})]))
7579
.pipe(dest('dev/legacy-scss/css', { sourcemaps: 'sourcemaps' }))
7680
.pipe(browserSync.stream());
77-
cb();
7881
}
7982

8083
// Watch scss, html, and js and reload browser if any changes:
@@ -109,118 +112,159 @@ function start(cb) {
109112

110113
// Minify and uglify css and js from paths within useref comment tags in html:
111114

112-
function assemble(cb) {
115+
function assemble() {
113116
return src(['dev/**/*.html', '!dev/includes/*', 'dev/css/*.css'])
114117
.pipe(gulpIf('*.js', uglify()))
115118
.pipe(useref())
116119
.pipe(lbInclude()) // parse <!--#include file="" --> statements
117120
.pipe(dest('ui_library'))
118-
cb();
119121
}
120122

121-
function minifyCss(cb) {
123+
function minifyCss() {
122124
return src(['dev/css/*.css'])
123125
.pipe(cleanCSS({debug: true, level: 2}, (details) => {
124126
console.log(`${details.name}: ${details.stats.originalSize}`);
125127
console.log(`${details.name}: ${details.stats.minifiedSize}`);
126128
}))
127129
.pipe(dest('ui_library'))
128-
cb();
129130
}
130131

131132
// Compress images and copy from dev/images/ into dev/ui_library/images/:
132133

133-
function copyimages(cb) {
134-
// gulp-imagemin is ESM; load it lazily so this CommonJS gulpfile can initialize.
135-
import('gulp-imagemin')
136-
.then((mod) => {
137-
var imagemin = mod.default || mod;
138-
src('dev/images/**/*.+(png|jpg|jpeg|gif|svg)')
139-
.pipe(cache(imagemin({ interlaced: true })))
140-
.pipe(dest('ui_library/images'))
141-
.on('end', cb)
142-
.on('error', cb);
143-
})
144-
.catch(cb);
134+
function copyimages() {
135+
return src('dev/images/**/*.+(png|jpg|jpeg|gif|svg)')
136+
.pipe(through2.obj(function (file, enc, cb) {
137+
if (file.isNull()) {
138+
cb(null, file);
139+
return;
140+
}
141+
142+
if (file.isStream()) {
143+
cb(new Error('Streaming images are not supported by copyimages.'));
144+
return;
145+
}
146+
147+
var extension = path.extname(file.path).toLowerCase();
148+
149+
if (extension === '.svg') {
150+
try {
151+
var result = optimizeSvg(file.contents.toString(enc || 'utf8'), {
152+
path: file.path,
153+
multipass: true,
154+
plugins: [
155+
{
156+
name: 'preset-default'
157+
}
158+
]
159+
});
160+
161+
file.contents = Buffer.from(result.data);
162+
cb(null, file);
163+
} catch (error) {
164+
cb(error);
165+
}
166+
167+
return;
168+
}
169+
170+
if (extension === '.png' || extension === '.jpg' || extension === '.jpeg') {
171+
sharp(file.contents)
172+
.rotate()
173+
[extension === '.png' ? 'png' : 'jpeg'](extension === '.png'
174+
? {
175+
compressionLevel: 9,
176+
progressive: true
177+
}
178+
: {
179+
mozjpeg: true,
180+
quality: 82,
181+
progressive: true
182+
})
183+
.toBuffer()
184+
.then(function (buffer) {
185+
file.contents = buffer;
186+
cb(null, file);
187+
})
188+
.catch(function (error) {
189+
cb(error);
190+
});
191+
192+
return;
193+
}
194+
195+
cb(null, file);
196+
}))
197+
.pipe(dest('ui_library/images'));
145198
}
146199

147200
// Copy the minified css to the place it actually needs to go in order to function
148-
function copyCSS(cb) {
201+
function copyCSS() {
149202
return src('ui_library/css/main2.min.css')
150203
.pipe(dest('static_src/stylesheets'));
151-
cb();
152204
}
153205

154206
// Copy the minified js to the place it actually needs to go in order to function
155-
function copyJS(cb) {
207+
function copyJS() {
156208
return src('ui_library/js/main2.min.js')
157209
.pipe(dest('static_src/javascripts'));
158-
cb();
159210
}
160211

161212
// Copy font files from dev/fonts/ into dev/ui_library/fonts/:
162213

163-
function fonts(cb) {
214+
function fonts() {
164215
return src('dev/fonts/**/*')
165216
.pipe(dest('ui_library/fonts'))
166-
cb();
167217
}
168218

169219
// Delete ui_library directory at start of build process:
170220

171-
function clean(cb) {
221+
function clean() {
172222
return del('ui_library');
173-
cb();
174223
}
175224

176225
// Lint Sass:
177226

178-
function scsslint(cb) {
227+
function scsslint() {
179228
return src(['dev/scss/*.scss', '!dev/scss/vendor/*.scss'])
180229
.pipe(stylelint({
181230
reporters: [
182231
{formatter: 'string', console: true}
183232
]
184233
}));
185-
cb();
186234
}
187235

188-
function scsslint_legacy(cb) {
236+
function scsslint_legacy() {
189237
return src(['dev/legacy-scss/*.scss', '!dev/legacy-scss/vendor/*.scss'])
190238
.pipe(stylelint({
191239
reporters: [
192240
{formatter: 'string', console: true}
193241
]
194242
}));
195-
cb();
196243
}
197244

198245

199246

200247
// Lint JavaScript:
201248

202-
function jslint(cb) {
249+
function jslint() {
203250
return src(['dev/js/**/*.js', '!dev/js/vendor/*.js'])
204251
.pipe(jshint({ esversion: 6 }))
205252
.pipe(jshint.reporter('default'))
206-
cb();
207253
}
208254

209255
// Upload ui_library build to GitHub Pages:
210256

211-
function githubpages(cb) {
257+
function githubpages() {
212258
return src('./ui_library/**/*')
213259
.pipe(ghPages())
214-
cb();
215260
}
216261

217262
// Run "gulp modernizr" to build a custom modernizr file based off of classes found in CSS:
218263

219-
function runmodernizr(cb) {
264+
function runmodernizr() {
220265
return src('dev/css/main2.css') // where modernizr will look for classes
221266
.pipe(modernizr({
222267
options: ['setClasses'],
223268
dest: 'dev/js/modernizr-custombuild.js'
224269
}))
225-
cb();
226270
}

0 commit comments

Comments
 (0)