UNPKG

coverage-shaker

Version:

Minify JavaScript code from chrome/puppeteer coverage report. tree shaking.

67 lines 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shake = void 0; const core_1 = require("@babel/core"); const uglify_js_1 = require("uglify-js"); function shake(coverage) { let cursor = 0; const result = core_1.transformSync(coverage.text, { minified: true, comments: false, plugins: [{ name: "coverage-shaker", visitor: { BlockStatement(path) { const { start, end } = path.node; if (!start || !end) { // 异常情况不处理 return; } while (cursor < coverage.ranges.length) { const range = coverage.ranges[cursor]; if (range.end <= start) { // 说明range还没跟上本代码片段的脚步 // 需要看看下一个range是否有交叉了 cursor++; continue; } if (range.start >= end) { // 说明代码已经执行到后面去了,本block没有执行过 path.node.body = []; // 函数里都没内容了,函数参数留着也没用了 const parent = path.parent; if (parent.params) { parent.params = []; } } // 剩下的情况都说明中间的代码执行过了,不能删除 return; } }, } }] }); if (result && result.code) { // 不知道为啥要两次才能压缩干净 return uglify_js_1.minify(uglify_js_1.minify(result.code).code).code; } return ''; } exports.shake = shake; function parse(coverages, files = []) { const shaked_code = []; const sources = files.length > 0 ? files : coverages.map(c => c.url); for (let coverage of coverages) { for (let file of sources) { if (coverage.url.endsWith(file)) { shaked_code.push({ url: coverage.url, code: shake(coverage) }); } } } return shaked_code; } exports.default = parse; //# sourceMappingURL=shake.js.map