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;