123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 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;
|