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