You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.9 KiB
102 lines
2.9 KiB
const { codeFrameColumns } = require("@babel/code-frame"); |
|
const Worker = require("jest-worker").default; |
|
const serialize = require("serialize-javascript"); |
|
|
|
function terser(userOptions = {}) { |
|
if (userOptions.sourceMap != null) { |
|
throw Error( |
|
"sourceMap option is removed. Now it is inferred from rollup options." |
|
); |
|
} |
|
if (userOptions.sourcemap != null) { |
|
throw Error( |
|
"sourcemap option is removed. Now it is inferred from rollup options." |
|
); |
|
} |
|
|
|
return { |
|
name: "terser", |
|
|
|
async renderChunk(code, chunk, outputOptions) { |
|
if (!this.worker) { |
|
this.worker = new Worker(require.resolve("./transform.js"), { |
|
numWorkers: userOptions.numWorkers, |
|
}); |
|
this.numOfBundles = 0; |
|
} |
|
|
|
this.numOfBundles++; |
|
|
|
const defaultOptions = { |
|
sourceMap: |
|
outputOptions.sourcemap === true || |
|
typeof outputOptions.sourcemap === "string", |
|
}; |
|
if (outputOptions.format === "es" || outputOptions.format === "esm") { |
|
defaultOptions.module = true; |
|
} |
|
if (outputOptions.format === "cjs") { |
|
defaultOptions.toplevel = true; |
|
} |
|
|
|
const normalizedOptions = { ...defaultOptions, ...userOptions }; |
|
|
|
// remove plugin specific options |
|
for (let key of ["numWorkers"]) { |
|
if (normalizedOptions.hasOwnProperty(key)) { |
|
delete normalizedOptions[key]; |
|
} |
|
} |
|
|
|
const serializedOptions = serialize(normalizedOptions); |
|
|
|
try { |
|
const result = await this.worker.transform(code, serializedOptions); |
|
|
|
if (result.nameCache) { |
|
let { vars, props } = userOptions.nameCache; |
|
|
|
// only assign nameCache.vars if it was provided, and if terser produced values: |
|
if (vars) { |
|
const newVars = |
|
result.nameCache.vars && result.nameCache.vars.props; |
|
if (newVars) { |
|
vars.props = vars.props || {}; |
|
Object.assign(vars.props, newVars); |
|
} |
|
} |
|
|
|
// support populating an empty nameCache object: |
|
if (!props) { |
|
props = userOptions.nameCache.props = {}; |
|
} |
|
|
|
// merge updated props into original nameCache object: |
|
const newProps = |
|
result.nameCache.props && result.nameCache.props.props; |
|
if (newProps) { |
|
props.props = props.props || {}; |
|
Object.assign(props.props, newProps); |
|
} |
|
} |
|
|
|
return result.result; |
|
} catch (error) { |
|
const { message, line, col: column } = error; |
|
console.error( |
|
codeFrameColumns(code, { start: { line, column } }, { message }) |
|
); |
|
throw error; |
|
} finally { |
|
this.numOfBundles--; |
|
|
|
if (this.numOfBundles === 0) { |
|
this.worker.end(); |
|
this.worker = 0; |
|
} |
|
} |
|
}, |
|
}; |
|
} |
|
|
|
exports.terser = terser;
|
|
|