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.
		
		
		
		
		
			
		
			
				
					103 lines
				
				2.9 KiB
			
		
		
			
		
	
	
					103 lines
				
				2.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								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;
							 |