|  | 'use strict'; | 
|  |  | 
|  | const util = require('util'); | 
|  | const debug = require('debug')('log4js:configuration'); | 
|  |  | 
|  | const preProcessingListeners = []; | 
|  | const listeners = []; | 
|  |  | 
|  | const not = thing => !thing; | 
|  |  | 
|  | const anObject = thing => thing && typeof thing === 'object' && !Array.isArray(thing); | 
|  |  | 
|  | const validIdentifier = thing => /^[A-Za-z][A-Za-z0-9_]*$/g.test(thing); | 
|  |  | 
|  | const anInteger = thing => thing && typeof thing === 'number' && Number.isInteger(thing); | 
|  |  | 
|  | const addListener = (fn) => { | 
|  | listeners.push(fn); | 
|  | debug(`Added listener, now ${listeners.length} listeners`); | 
|  | }; | 
|  |  | 
|  | const addPreProcessingListener = (fn) => { | 
|  | preProcessingListeners.push(fn); | 
|  | debug(`Added pre-processing listener, now ${preProcessingListeners.length} listeners`); | 
|  | }; | 
|  |  | 
|  | const throwExceptionIf = (config, checks, message) => { | 
|  | const tests = Array.isArray(checks) ? checks : [checks]; | 
|  | tests.forEach((test) => { | 
|  | if (test) { | 
|  | throw new Error(`Problem with log4js configuration: (${util.inspect(config, { depth: 5 })})` | 
|  | + ` - ${message}`); | 
|  | } | 
|  | }); | 
|  | }; | 
|  |  | 
|  | const configure = (candidate) => { | 
|  | debug('New configuration to be validated: ', candidate); | 
|  | throwExceptionIf(candidate, not(anObject(candidate)), 'must be an object.'); | 
|  |  | 
|  | debug(`Calling pre-processing listeners (${preProcessingListeners.length})`); | 
|  | preProcessingListeners.forEach(listener => listener(candidate)); | 
|  | debug('Configuration pre-processing finished.'); | 
|  |  | 
|  | debug(`Calling configuration listeners (${listeners.length})`); | 
|  | listeners.forEach(listener => listener(candidate)); | 
|  | debug('Configuration finished.'); | 
|  | }; | 
|  |  | 
|  | module.exports = { | 
|  | configure, | 
|  | addListener, | 
|  | addPreProcessingListener, | 
|  | throwExceptionIf, | 
|  | anObject, | 
|  | anInteger, | 
|  | validIdentifier, | 
|  | not | 
|  | }; |