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