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