UNPKG

1.88 kBJavaScriptView Raw
1'use strict';
2var Buffer = require('safe-buffer').Buffer;
3var applySourceMap = require('vinyl-sourcemaps-apply');
4var isObject = require('isobject');
5var extend = require('extend-shallow');
6var createError = require('./create-error');
7
8module.exports = function(uglify, log) {
9 function setup(opts) {
10 if (opts && !isObject(opts)) {
11 log.warn('gulp-uglify expects an object, non-object provided');
12 opts = {};
13 }
14
15 return extend(
16 {},
17 {
18 output: {}
19 },
20 opts
21 );
22 }
23
24 return function(opts) {
25 return function(file) {
26 var options = setup(opts || {});
27 var hasSourceMaps = Boolean(file.sourceMap);
28
29 if (file.isNull()) {
30 return file;
31 }
32
33 if (file.isStream()) {
34 throw createError(file, 'Streaming not supported', null);
35 }
36
37 if (hasSourceMaps) {
38 options.sourceMap = {
39 filename: file.sourceMap.file,
40 includeSources: true
41 };
42
43 // UglifyJS generates broken source maps if the input source map
44 // does not contain mappings.
45 if (file.sourceMap.mappings) {
46 options.sourceMap.content = file.sourceMap;
47 }
48 }
49
50 var fileMap = {};
51 fileMap[file.relative] = String(file.contents);
52
53 var mangled = uglify.minify(fileMap, options);
54
55 if (!mangled || mangled.error) {
56 throw createError(
57 file,
58 'unable to minify JavaScript',
59 mangled && mangled.error
60 );
61 }
62
63 if (mangled.warnings) {
64 mangled.warnings.forEach(function(warning) {
65 log.warn('gulp-uglify [%s]: %s', file.relative, warning);
66 });
67 }
68
69 file.contents = Buffer.from(mangled.code);
70
71 if (hasSourceMaps) {
72 var sourceMap = JSON.parse(mangled.map);
73 applySourceMap(file, sourceMap);
74 }
75
76 return file;
77 };
78 };
79};