62 lines
2.6 KiB
JavaScript
62 lines
2.6 KiB
JavaScript
|
|
"use strict";
|
|||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
|
const through2_1 = require("through2");
|
|||
|
|
const terser_1 = require("terser");
|
|||
|
|
const PluginError = require("plugin-error");
|
|||
|
|
const applySourceMap = require("vinyl-sourcemaps-apply");
|
|||
|
|
const PLUGIN_NAME = 'terser';
|
|||
|
|
/**
|
|||
|
|
* @param { MinifyOptions } gulpTerserOptions: gulp-terser configuration
|
|||
|
|
* @param { typeof minify | undefined } customMinifyFunc:custom minify function
|
|||
|
|
*/
|
|||
|
|
function gulpTerser(gulpTerserOptions = {}, customMinifyFunc) {
|
|||
|
|
const minifyFunc = customMinifyFunc !== null && customMinifyFunc !== void 0 ? customMinifyFunc : terser_1.minify;
|
|||
|
|
return (0, through2_1.obj)(async function (chunk, enc, callback) {
|
|||
|
|
if (chunk.isStream()) {
|
|||
|
|
this.emit('error', new PluginError(PLUGIN_NAME, 'Streams are not supported!'));
|
|||
|
|
return callback();
|
|||
|
|
}
|
|||
|
|
if (chunk.isBuffer()) {
|
|||
|
|
try {
|
|||
|
|
const terserOptions = { ...gulpTerserOptions };
|
|||
|
|
// SourceMap configuration
|
|||
|
|
if (chunk.sourceMap) {
|
|||
|
|
if (!terserOptions.sourceMap || terserOptions.sourceMap === true) {
|
|||
|
|
terserOptions.sourceMap = {};
|
|||
|
|
}
|
|||
|
|
terserOptions.sourceMap.filename = chunk.sourceMap.file;
|
|||
|
|
}
|
|||
|
|
const chunkString = chunk.contents.toString('utf8');
|
|||
|
|
let build = {};
|
|||
|
|
// gulp version compatibility
|
|||
|
|
if (('sourceMap' in chunk) && ('file' in chunk.sourceMap)) {
|
|||
|
|
build[chunk.sourceMap.file] = chunkString;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
build = chunkString;
|
|||
|
|
}
|
|||
|
|
// Compressed code (terser5 is asynchronous, terser4 is synchronous)
|
|||
|
|
const minifyOutput = await minifyFunc(build, terserOptions);
|
|||
|
|
if ('error' in minifyOutput) {
|
|||
|
|
throw new Error(minifyOutput['error']['message']);
|
|||
|
|
}
|
|||
|
|
// Buffer
|
|||
|
|
if (minifyOutput.code) {
|
|||
|
|
chunk.contents = ('from' in Buffer) ? Buffer.from(minifyOutput.code) : new Buffer(minifyOutput.code);
|
|||
|
|
}
|
|||
|
|
// Output source-map
|
|||
|
|
if (chunk.sourceMap && minifyOutput.map) {
|
|||
|
|
applySourceMap(chunk, minifyOutput.map);
|
|||
|
|
}
|
|||
|
|
this.push(chunk);
|
|||
|
|
return callback();
|
|||
|
|
}
|
|||
|
|
catch (err) {
|
|||
|
|
this.emit('error', new PluginError(PLUGIN_NAME, err));
|
|||
|
|
return callback();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
exports.default = gulpTerser;
|