86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
/** @typedef {import("./index.js").MinimizedResult} MinimizedResult */
 | 
						|
 | 
						|
/** @typedef {import("source-map").RawSourceMap} RawSourceMap */
 | 
						|
 | 
						|
/** @typedef {import("./index.js").InternalResult} InternalResult */
 | 
						|
 | 
						|
/**
 | 
						|
 * @template T
 | 
						|
 * @param {import("./index.js").InternalOptions<T>} options
 | 
						|
 * @returns {Promise<InternalResult>}
 | 
						|
 */
 | 
						|
const minify = async options => {
 | 
						|
  const minifyFns = Array.isArray(options.minimizer.implementation) ? options.minimizer.implementation : [options.minimizer.implementation];
 | 
						|
  /** @type {InternalResult} */
 | 
						|
 | 
						|
  const result = {
 | 
						|
    outputs: [],
 | 
						|
    warnings: [],
 | 
						|
    errors: []
 | 
						|
  };
 | 
						|
  let needSourceMap = false;
 | 
						|
 | 
						|
  for (let i = 0; i <= minifyFns.length - 1; i++) {
 | 
						|
    const minifyFn = minifyFns[i];
 | 
						|
    const minifyOptions = Array.isArray(options.minimizer.options) ? options.minimizer.options[i] : options.minimizer.options;
 | 
						|
    const prevResult = result.outputs.length > 0 ? result.outputs[result.outputs.length - 1] : {
 | 
						|
      code: options.input,
 | 
						|
      map: options.inputSourceMap
 | 
						|
    };
 | 
						|
    const {
 | 
						|
      code,
 | 
						|
      map
 | 
						|
    } = prevResult; // eslint-disable-next-line no-await-in-loop
 | 
						|
 | 
						|
    const minifyResult = await minifyFn({
 | 
						|
      [options.name]: code
 | 
						|
    }, map, minifyOptions);
 | 
						|
 | 
						|
    if (typeof minifyResult.code !== "string") {
 | 
						|
      throw new Error("minimizer function doesn't return the 'code' property or result is not a string value");
 | 
						|
    }
 | 
						|
 | 
						|
    if (minifyResult.map) {
 | 
						|
      needSourceMap = true;
 | 
						|
    }
 | 
						|
 | 
						|
    if (minifyResult.errors) {
 | 
						|
      result.errors = result.errors.concat(minifyResult.errors);
 | 
						|
    }
 | 
						|
 | 
						|
    if (minifyResult.warnings) {
 | 
						|
      result.warnings = result.warnings.concat(minifyResult.warnings);
 | 
						|
    }
 | 
						|
 | 
						|
    result.outputs.push({
 | 
						|
      code: minifyResult.code,
 | 
						|
      map: minifyResult.map
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  if (!needSourceMap) {
 | 
						|
    result.outputs = [result.outputs[result.outputs.length - 1]];
 | 
						|
  }
 | 
						|
 | 
						|
  return result;
 | 
						|
};
 | 
						|
/**
 | 
						|
 * @param {string} options
 | 
						|
 * @returns {Promise<InternalResult>}
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
async function transform(options) {
 | 
						|
  // 'use strict' => this === undefined (Clean Scope)
 | 
						|
  // Safer for possible security issues, albeit not critical at all here
 | 
						|
  // eslint-disable-next-line no-new-func, no-param-reassign
 | 
						|
  const evaluatedOptions = new Function("exports", "require", "module", "__filename", "__dirname", `'use strict'\nreturn ${options}`)(exports, require, module, __filename, __dirname);
 | 
						|
  return minify(evaluatedOptions);
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  minify,
 | 
						|
  transform
 | 
						|
}; |