61 lines
2.6 KiB
JavaScript
61 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;
|