Skip to content

Commit

Permalink
feat(composer): implement new API for composing deps
Browse files Browse the repository at this point in the history
BREAKING CHANGE:
Replace the old "minifier" entry point with a new "composer" entry
point.

Fixes #291.
  • Loading branch information
terinjokes committed May 20, 2017
1 parent dbbba30 commit f2b779b
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 90 deletions.
2 changes: 1 addition & 1 deletion LICENSE.md
@@ -1,4 +1,4 @@
> Copyright (c) 2013-2014 Terin Stock <terinjokes@gmail.com>
> Copyright (c) 2013-2017 Terin Stock <terinjokes@gmail.com>
>
> Permission is hereby granted, free of charge, to any person obtaining
> a copy of this software and associated documentation files (the
Expand Down
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -59,24 +59,24 @@ To see useful error messages, see [Why Use Pump?](docs/why-use-pump/README.md#wh

## Using a Different UglifyJS

**This API may change before the v3 release. Consider it deprecated.**

By default, `gulp-uglify` uses the version of UglifyJS installed as a dependency.
It's possible to configure the use of a different version using the "minifier" entry point.
It's possible to configure the use of a different version using the "composer" entry point.

```javascript
var uglifyjs = require('uglify-js'); // can be a git checkout
// or another module (such as `uglify-es` for ES6 support)
var minifier = require('gulp-uglify/minifier');
var composer = require('gulp-uglify/composer');
var pump = require('pump');

var minify = composer(uglifyjs, console);

gulp.task('compress', function (cb) {
// the same options as described above
var options = {};

pump([
gulp.src('lib/*.js'),
minifier(options, uglifyjs),
minify(options),
gulp.dest('dist')
],
cb
Expand Down
9 changes: 9 additions & 0 deletions composer.js
@@ -0,0 +1,9 @@
'use strict';
var through = require('through2');
var minify = require('./lib/minify');

module.exports = function(uglify, logger) {
return function(opts) {
return through.obj(minify(uglify, logger)(opts));
};
};
5 changes: 3 additions & 2 deletions index.js
@@ -1,10 +1,11 @@
'use strict';
var uglify = require('uglify-js');
var minifier = require('./minifier');
var compose = require('./composer');
var GulpUglifyError = require('./lib/gulp-uglify-error');
var logger = require('./lib/log');

module.exports = function(opts) {
return minifier(opts, uglify);
return compose(uglify, logger)(opts);
};

module.exports.GulpUglifyError = GulpUglifyError;
75 changes: 75 additions & 0 deletions lib/minify.js
@@ -0,0 +1,75 @@
'use strict';
var applySourceMap = require('vinyl-sourcemaps-apply');
var isObject = require('lodash/fp/isObject');
var defaultsDeep = require('lodash/fp/defaultsDeep');
var createError = require('./create-error');

module.exports = function(uglify, log) {
function setup(opts) {
if (opts && !isObject(opts)) {
log.warn('gulp-uglify expects an object, non-object provided');
opts = {};
}

return defaultsDeep(
{
output: {}
},
opts
);
}

return function(opts) {
return function(file, encoding, callback) {
var options = setup(opts || {});
var hasSourceMaps = Boolean(file.sourceMap);

if (file.isNull()) {
return callback(null, file);
}

if (file.isStream()) {
return callback(createError(file, 'Streaming not supported', null));
}

if (hasSourceMaps) {
options.sourceMap = {
filename: file.sourceMap.file,
includeSources: true
};

// UglifyJS generates broken source maps if the input source map
// does not contain mappings.
if (file.sourceMap.mappings) {
options.sourceMap.content = file.sourceMap;
}
}

var fileMap = {};
fileMap[file.relative] = String(file.contents);

var mangled = uglify.minify(fileMap, options);

if (mangled.error) {
return callback(
createError(file, 'unable to minify JavaScript', mangled.error)
);
}

if (mangled.warnings) {
mangled.warnings.forEach(function(warning) {
log.warn('gulp-uglify [%s]: %s', file.relative, warning);
});
}

file.contents = new Buffer(mangled.code);

if (hasSourceMaps) {
var sourceMap = JSON.parse(mangled.map);
applySourceMap(file, sourceMap);
}

callback(null, file);
};
};
};
77 changes: 0 additions & 77 deletions minifier.js

This file was deleted.

7 changes: 5 additions & 2 deletions test/injectable.js
Expand Up @@ -4,7 +4,7 @@ var assert = require('power-assert');
var Vinyl = require('vinyl');
var td = require('testdouble');
var mississippi = require('mississippi');
var minifer = require('../minifier');
var composer = require('../composer');

var pipe = mississippi.pipe;
var from = mississippi.from;
Expand All @@ -25,6 +25,8 @@ describe('injecting mocha', function() {
});

var uglifyjs = td.object(['minify']);
var logger = td.object(['warn']);
var minify = composer(uglifyjs, logger);

td
.when(
Expand All @@ -45,8 +47,9 @@ describe('injecting mocha', function() {
pipe(
[
from.obj([testFile]),
minifer({injecting: true}, uglifyjs),
minify({injecting: true}),
to.obj(function(newFile, enc, next) {
td.verify(logger.warn(), {times: 0, ignoreExtraArgs: true});
assert.ok(newFile, 'emits a file');
assert.ok(newFile.path, 'file has a path');
assert.ok(newFile.relative, 'file has relative path information');
Expand Down
8 changes: 5 additions & 3 deletions test/minify.js
Expand Up @@ -8,6 +8,8 @@ var uglifyjs = require('uglify-js');
var mississippi = require('mississippi');
var version = require('semver')(process.version);

var composer = require('../composer');

var pipe = mississippi.pipe;
var to = mississippi.to;
var from = mississippi.from;
Expand All @@ -22,7 +24,7 @@ describe('minify', function() {
var testContentsExpected = uglifyjs.minify(testContentsInput).code;

beforeEach(function() {
this.log = td.replace('../lib/log');
this.log = td.object(['warn']);

this.testFile = new Vinyl({
cwd: '/home/terin/broken-promises/',
Expand All @@ -38,7 +40,7 @@ describe('minify', function() {
pipe(
[
from.obj([this.testFile]),
require('../minifier')({}, uglifyjs),
composer(uglifyjs, log)({}),
to.obj(function(newFile, enc, next) {
td.verify(log.warn(), {
times: 0,
Expand Down Expand Up @@ -71,7 +73,7 @@ describe('minify', function() {
pipe(
[
from.obj([this.testFile]),
require('../minifier')('build.min.js', uglifyjs),
composer(uglifyjs, log)('build.min.js'),
to.obj(function(newFile, enc, next) {
td.verify(
log.warn('gulp-uglify expects an object, non-object provided')
Expand Down

0 comments on commit f2b779b

Please sign in to comment.