"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;