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.
		
		
		
		
		
			
		
			
				
					63 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					63 lines
				
				1.4 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { format } = require('util') | ||
|  | 
 | ||
|  | function build () { | ||
|  |   const codes = {} | ||
|  |   const emitted = new Map() | ||
|  | 
 | ||
|  |   function create (name, code, message) { | ||
|  |     if (!name) throw new Error('Warning name must not be empty') | ||
|  |     if (!code) throw new Error('Warning code must not be empty') | ||
|  |     if (!message) throw new Error('Warning message must not be empty') | ||
|  | 
 | ||
|  |     code = code.toUpperCase() | ||
|  | 
 | ||
|  |     if (codes[code] !== undefined) { | ||
|  |       throw new Error(`The code '${code}' already exist`) | ||
|  |     } | ||
|  | 
 | ||
|  |     function buildWarnOpts (a, b, c) { | ||
|  |       // more performant than spread (...) operator
 | ||
|  |       let formatted | ||
|  |       if (a && b && c) { | ||
|  |         formatted = format(message, a, b, c) | ||
|  |       } else if (a && b) { | ||
|  |         formatted = format(message, a, b) | ||
|  |       } else if (a) { | ||
|  |         formatted = format(message, a) | ||
|  |       } else { | ||
|  |         formatted = message | ||
|  |       } | ||
|  | 
 | ||
|  |       return { | ||
|  |         code, | ||
|  |         name, | ||
|  |         message: formatted | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     emitted.set(code, false) | ||
|  |     codes[code] = buildWarnOpts | ||
|  | 
 | ||
|  |     return codes[code] | ||
|  |   } | ||
|  | 
 | ||
|  |   function emit (code, a, b, c) { | ||
|  |     if (codes[code] === undefined) throw new Error(`The code '${code}' does not exist`) | ||
|  |     if (emitted.get(code) === true) return | ||
|  |     emitted.set(code, true) | ||
|  | 
 | ||
|  |     const warning = codes[code](a, b, c) | ||
|  |     process.emitWarning(warning.message, warning.name, warning.code) | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     create, | ||
|  |     emit, | ||
|  |     emitted | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = build |