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
							 |