rollup-plugin-gzip
Version:
Compress your Rollup / Vite bundle with Gzip or Brotli
150 lines (149 loc) • 7.38 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path_1 = require("path");
const util_1 = require("util");
const zlib_1 = require("zlib");
const rollup_1 = require("rollup");
const readFile = (0, util_1.promisify)(fs.readFile);
const writeFile = (0, util_1.promisify)(fs.writeFile);
const gzipPromise = (0, util_1.promisify)(zlib_1.gzip);
const isFunction = (arg) => typeof arg === 'function';
const isRegExp = (arg) => Object.prototype.toString.call(arg) === '[object RegExp]';
// functionality partially copied from rollup
/**
* copied from https://github.com/rollup/rollup/blob/master/src/rollup/index.ts#L450
*/
function isOutputChunk(file) {
return typeof file.code === 'string';
}
/**
* Gets the string/buffer content from a file object.
* Important for adding source map comments
*
* Copied partially from rollup.writeOutputFile
* https://github.com/rollup/rollup/blob/master/src/rollup/index.ts#L454
*/
function getOutputFileContent(outputFileName, outputFile, outputOptions) {
if (isOutputChunk(outputFile)) {
let source;
source = outputFile.code;
if ((outputOptions.sourcemap === true ||
outputOptions.sourcemap === 'inline') &&
outputFile.map) {
const url = outputOptions.sourcemap === 'inline'
? outputFile.map.toUrl()
: `${(0, path_1.basename)(outputFileName)}.map`;
// https://github.com/rollup/rollup/blob/master/src/utils/sourceMappingURL.ts#L1
const sourceMapComment = `//# source` + `MappingURL=${url}\n`;
// Rollup >= 3.0.0 already includes the comment, older versions do not
if (!source.includes(sourceMapComment)) {
source += sourceMapComment;
}
}
return source;
}
else {
return typeof outputFile.source === 'string'
? outputFile.source
: // just to be sure, as it is typed string | Uint8Array in rollup 2.0.0
Buffer.from(outputFile.source);
}
}
// actual plugin code
function performInitChecks(options) {
if (rollup_1.VERSION < '2.0.0') {
console.error('[rollup-plugin-gzip] This plugin supports rollup version >= 2.0.0!');
console.error('For older rollup versions, please use an older version of this plugin.');
}
// check for old options
if ('algorithm' in options) {
console.warn('[rollup-plugin-gzip] The "algorithm" option is not supported any more! ' +
'Use "customCompression" instead to specify a different compression algorithm.');
}
if ('options' in options) {
console.warn('[rollup-plugin-gzip] The "options" option was renamed to "gzipOptions"!');
}
if ('additional' in options) {
console.warn('[rollup-plugin-gzip] The "additional" option was renamed to "additionalFiles"!');
}
if ('delay' in options) {
console.warn('[rollup-plugin-gzip] The "delay" option was renamed to "additionalFilesDelay"!');
}
}
function gzipPlugin(explicitOptions = {}) {
performInitChecks(explicitOptions);
const options = Object.assign({
// default options
filter: /\.(js|mjs|cjs|json|css|html|wasm|svg)$/, fileName: '.gz', customCompression: (fileContent) => gzipPromise(fileContent, options.gzipOptions), gzipOptions: {}, additionalFiles: [], additionalFilesDelay: 0, minSize: 0 }, explicitOptions);
const mapFileName = isFunction(options.fileName)
? options.fileName
: (fileName) => fileName + options.fileName;
const plugin = Object.assign({ name: 'gzip', writeBundle(outputOptions, bundle) {
return __awaiter(this, void 0, void 0, function* () {
const outputDir = outputOptions.file
? (0, path_1.dirname)(outputOptions.file)
: outputOptions.dir || '';
const compressBundleFile = (fileName) => __awaiter(this, void 0, void 0, function* () {
const fileEntry = bundle[fileName];
// filter check
if (isRegExp(options.filter) && !fileName.match(options.filter)) {
return Promise.resolve();
}
if (isFunction(options.filter) &&
!options.filter(fileName)) {
return Promise.resolve();
}
const fileContent = getOutputFileContent(fileName, fileEntry, outputOptions);
// minSize option check
if (options.minSize && options.minSize > fileContent.length) {
return Promise.resolve();
}
try {
yield writeFile((0, path_1.join)(outputDir, mapFileName(fileName)), yield options.customCompression(fileContent));
}
catch (error) {
console.error(error);
return Promise.reject('[rollup-plugin-gzip] Error compressing file ' + fileName);
}
});
const compressAdditionalFile = (filePath) => __awaiter(this, void 0, void 0, function* () {
try {
const fileContent = yield readFile(filePath);
yield writeFile(mapFileName(filePath), yield options.customCompression(fileContent));
return Promise.resolve();
}
catch (error) {
console.error(error);
return Promise.reject('[rollup-plugin-gzip] Error compressing additional file ' +
filePath +
'. Please check the spelling of your configured additionalFiles. ' +
'You might also have to increase the value of the additionalFilesDelay option.');
}
});
const promises = Object.keys(bundle).map(compressBundleFile);
if (!options.additionalFilesDelay) {
promises.push(...options.additionalFiles.map(compressAdditionalFile));
}
else {
// if a delay is set, we do not await the compression of additional files
setTimeout(() => options.additionalFiles.map(compressAdditionalFile), options.additionalFilesDelay);
}
yield Promise.all(promises);
});
} }, {
apply: 'build',
enforce: 'post',
});
return plugin;
}
exports.default = gzipPlugin;
;