{"_id":"ulog","_rev":"37-4b59b6ae96b23db2afebb63f1d92dbb8","name":"ulog","description":"The universal logger","dist-tags":{"latest":"2.0.0-beta.19","next":"2.0.0-beta.2","beta":"2.0.0-beta.20"},"versions":{"0.0.0":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"ulog","description":"The minimal logger.","version":"0.0.0","homepage":"https://github.com/felixge/ulog","repository":{"url":""},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"ulog@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"c3b42f421654f845e21745f8b94b5d03643a0290","tarball":"https://registry.npmjs.org/ulog/-/ulog-0.0.0.tgz","integrity":"sha512-YjLKVPGP5J8G4SPLh1jAIaI07DKbwkTpb6qaJXWThCvecfzNgBlZwtnHlVHomoFENYEL+x8PsSdOwzRE7ZiGwA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC2cZe/WJrYSDWbwF6eY9P16CqAjM0lILb01Z6+ts+2CAiBrGld8EBV5h+eqBQpL6DItbQ3z70At+FrG+6JD4H6l2g=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.1.0":{"name":"ulog","version":"0.1.0","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"webpack --optimize-occurence-order --devtool source-map --output-path . --output-filename ulog.umd.js --output-library-target umd \"./browser.js\" ","build-min":"webpack -p --devtool hidden-source-map --output-path . --output-filename ulog.min.js --output-library-target this \"./browser.js\" ","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path test --output-filename ulog.spec.js \"mocha!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^1.0.8","mocha":"^2.3.4","mocha-loader":"^0.7.1","path":"^0.12.7","rimraf":"^2.5.4","rollup":"^0.36.0","sinon":"^2.0.0-pre","webpack":"^1.12.12","webpack-dev-server":"^1.14.1"},"dependencies":{},"gitHead":"1b98513015a5241909222c3a8057aa68dd57491f","_id":"ulog@0.1.0","_shasum":"7e87a8cf3abd7f7fb7565e5691d8abce4bbf81c8","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"7e87a8cf3abd7f7fb7565e5691d8abce4bbf81c8","tarball":"https://registry.npmjs.org/ulog/-/ulog-0.1.0.tgz","integrity":"sha512-pV3D2Be3QehzOsfXMshPmlMGt1Rk0f1lL5Fediw8LeU7IdbaAuItiwZwZebsLmdkk3CW+kE8h0Vp+rx/UfScPQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlfLhJ65lsIGa7fFnF+vWAkobfXSiQmQAgdfdtpqUcUQIhAMjcwr2IhFn/fTLaR5EqjXN+2mH9P3B205a6Dxr+E7aN"}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/ulog-0.1.0.tgz_1474845772850_0.3721104892902076"},"directories":{}},"0.2.0":{"name":"ulog","version":"0.2.0","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path test --output-filename ulog.spec.js \"mocha!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^3.0.0","mocha":"^3.0.2","mocha-loader":"^1.0.0","path":"^0.12.7","rimraf":"^2.5.4","sinon":"^2.0.0-pre","webpack":"^1.12.12","webpack-dev-server":"^1.14.1"},"dependencies":{},"gitHead":"8558fe9263b49e1d48cbf8ac0861f4c7f3a97c82","_id":"ulog@0.2.0","_shasum":"9452df39cff59c934f7152290eac862ef50d0381","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"9452df39cff59c934f7152290eac862ef50d0381","tarball":"https://registry.npmjs.org/ulog/-/ulog-0.2.0.tgz","integrity":"sha512-Rw4Sg2a+wK6//BL1GZU0r2dEaV6AehWF3Sr04b/1yhtqTvLN2M6Q/YwlTp3NUyf9Tu3Mt8iLWNMLpjs5VFLZng==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDe3lah8a0BQ0wvpZLGi5fHbQe1qxzghUgNuXJUwODZFAIgG+H06lTVJ6+JRjtwKEw91enr8krh8SyBQXKlq67TzO8="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/ulog-0.2.0.tgz_1474889759866_0.05465156794525683"},"directories":{}},"0.3.0":{"name":"ulog","version":"0.3.0","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path test --output-filename ulog.spec.js \"mocha!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^3.0.0","mocha":"^3.0.2","mocha-loader":"^1.0.0","path":"^0.12.7","rimraf":"^2.5.4","sinon":"^2.0.0-pre","webpack":"^1.12.12","webpack-dev-server":"^1.14.1"},"dependencies":{},"gitHead":"62d9b037c438e178061c804fa70894d899672140","_id":"ulog@0.3.0","_shasum":"f1d010e95add9dc5c0826ca80d9410d52a449488","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"f1d010e95add9dc5c0826ca80d9410d52a449488","tarball":"https://registry.npmjs.org/ulog/-/ulog-0.3.0.tgz","integrity":"sha512-YFPH0RIDEdRQKroJOu5LjIkCJjajz9iQ3qK7yZbe1iRZQe75Lbl4dDxm0iVZdXw1YzhlflWTXcd7b3+UtwnyZg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSRdLpb7+UYN1x2SfdT/duW55UR9AFmbiQP4FpaaX+QAiBETStovKmsuSxs1kHnRG9Q2vkzdnXl0ocMHbeWtLDDAw=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/ulog-0.3.0.tgz_1474893989395_0.5864318911917508"},"directories":{}},"1.0.0":{"name":"ulog","version":"1.0.0","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path test --output-filename ulog.spec.js \"mocha!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^3.0.0","mocha":"^3.0.2","mocha-loader":"^1.0.0","path":"^0.12.7","rimraf":"^2.5.4","sinon":"^2.0.0-pre","webpack":"^1.12.12","webpack-dev-server":"^1.14.1"},"dependencies":{},"gitHead":"4bf09946f6ebaceae11b4b303d2a43d4bdc0fff2","_id":"ulog@1.0.0","_shasum":"20e0a151e56a061ba98da7ae1939e952081baf7a","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"20e0a151e56a061ba98da7ae1939e952081baf7a","tarball":"https://registry.npmjs.org/ulog/-/ulog-1.0.0.tgz","integrity":"sha512-u28Wi6hvjRFDiC9yvnksTseVdPUwdHhlkOzdUixoi8b8PEsfeopxx3ODZQco8lmhXyO/FR69uWLXELOIgS4cCw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD88jJyKnD8Pz+bXTuhqE7uIrEp0EtfSsKib8uG4Wx++AIgHIuF5aJ+x/R7i6A6O+73RCu2gFrcExpBD+7ZgiyMoc8="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/ulog-1.0.0.tgz_1477234320378_0.5689575818832964"},"directories":{}},"1.0.1":{"name":"ulog","version":"1.0.1","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^3.1.4","mocha":"^3.2.0","mocha-loader":"^1.1.0","path":"^0.12.7","rimraf":"^2.6.0","sinon":"^2.0.0-pre.5","webpack":"^2.2.1","webpack-dev-server":"^2.4.1"},"dependencies":{},"gitHead":"9604831cac0b7f81c1e0b51e3ada6429d1ed3656","_id":"ulog@1.0.1","_shasum":"d09f33c7e2a48da8aad80106c142f3b9743eca42","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"d09f33c7e2a48da8aad80106c142f3b9743eca42","tarball":"https://registry.npmjs.org/ulog/-/ulog-1.0.1.tgz","integrity":"sha512-l6xj/RMxxmMoSa5Y52KYBewoOcSG3wRBfejSZNXD7k4ep0P6StMnPjsUXMn6jyF9nl1aqSF0S/ZzmBo4/FsocA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbRVdcJiynWBPARRODWtdFjIVJcb5b/ToF52mcg3eG7gIhAOEaBznx2jIR6e4gVkXKXns1W4ug9RT1IDlqU6shclal"}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/ulog-1.0.1.tgz_1487630477193_0.8440212830901146"},"directories":{}},"1.0.2":{"name":"ulog","version":"1.0.2","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","test-dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^3.4.1","cross-env":"^3.1.4","mocha":"^3.2.0","mocha-loader":"^1.1.0","path":"^0.12.7","rimraf":"^2.6.0","sinon":"^2.0.0-pre.5","webpack":"^2.2.1","webpack-dev-server":"^2.4.1"},"dependencies":{},"gitHead":"74adaea43e1a7c6368ce439117a0886819d4794a","_id":"ulog@1.0.2","_shasum":"38d672306c88f54ee0897da58adad345e1430c59","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"shasum":"38d672306c88f54ee0897da58adad345e1430c59","tarball":"https://registry.npmjs.org/ulog/-/ulog-1.0.2.tgz","integrity":"sha512-tHXeyIJ6EaS+90sWK+37tTgycVBbsLWuUFIddanNtkMJpJtGS8gI0Gh0dCN1Kllj2KfZP/DZR1qvqEBc3rNIeg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDhis7NE/CICx4qbc+TOmHC58QqhI0VIKrFgdcKg2zhiAiBmJGiFAuAgCRLoheNmOVRTMZSdqu9R8IHoDzk6WFEJNw=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/ulog-1.0.2.tgz_1487631351194_0.007759287022054195"},"directories":{}},"1.0.3":{"name":"ulog","version":"1.0.3","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.0","cross-env":"^5.0.1","mocha":"^3.4.2","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.1","sinon":"^2.3.8","webpack":"^3.2.0","webpack-dev-server":"^2.5.1"},"dependencies":{},"gitHead":"2332d9e59c27f4a677a14fb635f457fcaa937e7e","_id":"ulog@1.0.3","_npmVersion":"5.2.0","_nodeVersion":"6.3.1","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-NpMlZXWLG/jp+oT2jfvkpZFm70qgvm/2op9ZRB42f3hBP9IO7wih8A/Z4EpDruPbs1PEDgo8IJ+QCc7YmVvwnQ==","shasum":"a76b3f9dbc47c863f5ca8cedcd3445a9d4b5fec8","tarball":"https://registry.npmjs.org/ulog/-/ulog-1.0.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEEnw9lH/rGiPao+JcIiUawQtEOsqi7Lt6W2+Xmb8OglAiEA8qQU1HDxA4ZfT24xgJ7OBGzpRLVolU5G5SoSsfcSqiY="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog-1.0.3.tgz_1499962633025_0.3749965017195791"},"directories":{}},"1.1.0":{"name":"ulog","version":"1.1.0","description":"Microscopically small universal logging library","main":"node.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2016 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^4.1.3","webpack":"^3.10.0","webpack-dev-server":"^2.9.7"},"dependencies":{},"gitHead":"aa0380a6928bd567d06190f4fbd5b046f5b8cec0","_id":"ulog@1.1.0","_npmVersion":"5.6.0","_nodeVersion":"6.11.3","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-oQDYGh4w/ykGSpffEuwkqFnL5BYJa5HeV5PhpkjuAFwJCyjp2KjT2YDcFa8y4ie8kejdXMwpFCSF6HNM5Kia4g==","shasum":"2b07708ceb0a27df35851105cc8399aa7c0edd75","tarball":"https://registry.npmjs.org/ulog/-/ulog-1.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHMJcsJs4+CuL67llta5h+2MmMDYbkH+fogBmwkzeBEHAiAmo10HwNgjIVblrgSHWx3/u2/eaeTAQMZ0DvPUFNq79g=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog-1.1.0.tgz_1514056686967_0.5892985987011343"},"directories":{}},"2.0.0-beta.1":{"name":"ulog","version":"2.0.0-beta.1","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^4.1.3","webpack":"^3.10.0","webpack-dev-server":"^2.9.7"},"dependencies":{},"gitHead":"355d8a94ae6f91497caabb261ec76b287a38e295","_id":"ulog@2.0.0-beta.1","_npmVersion":"5.6.0","_nodeVersion":"6.11.3","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-aMeEo71yVXa0v8LeHoOOKsCmb2kIhb0ofhPbiLApytjtO++3XumOeX4J96IzUn/Wv9y5+3D55gr7sihpltupUg==","shasum":"2d08291fdd7fcd607b4402a3b037e43f9d572ba8","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUpxPzyhL8rsJykwETv5BgCQXYbrWrxBfACnZhlZ7oLgIhAP9YmwW/IxnmTCXg+KWaEyGU8CjrRCFekln65XURwTIp"}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog-2.0.0-beta.1.tgz_1514380665698_0.9390095672570169"},"directories":{}},"2.0.0-beta.2":{"name":"ulog","version":"2.0.0-beta.2","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^4.1.3","webpack":"^3.10.0","webpack-dev-server":"^2.9.7"},"dependencies":{},"gitHead":"9594f7a3d26833c22d461f9bdf544d5157f05788","_id":"ulog@2.0.0-beta.2","_npmVersion":"5.6.0","_nodeVersion":"6.11.3","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-IwZiX4SmF72jJn+5qjkpKLWTgUvnd9iUqE717Pls+Js8P9EuI91y/wcwAfchbseK79t5CwuOiFz6xP0vSqMSMw==","shasum":"1122194aee2126c9d592ef12ff4c02cd9021fe10","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCthyS91RI37nD6+PDlHqgWIw8RmMwidzYKm/sK+CMxwIgSReo3IIp8aZwCJ3AUkwpA+vdGxiF63/cl9BPZcAy0LM="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog-2.0.0-beta.2.tgz_1514384904668_0.562256182776764"},"directories":{}},"2.0.0-beta.3":{"name":"ulog","version":"2.0.0-beta.3","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^7.1.1","uglify-js":"^3.4.9","webpack":"^4.26.1","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.10"},"dependencies":{},"readme":"# ulog <sub><sup>v2.0.0-beta.3</sup></sub>\r\n### Microscopically small universal logging library\r\n\r\n[![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog)\r\n[![license](https://img.shields.io/npm/l/ulog.svg)](https://creativecommons.org/licenses/by/4.0/)\r\n[![travis](https://img.shields.io/travis/Download/ulog.svg)](https://travis-ci.org/Download/ulog)\r\n[![greenkeeper](https://img.shields.io/david/Download/ulog.svg)](https://greenkeeper.io/)\r\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\r\n\r\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\r\n\r\n![logo](https://cdn.rawgit.com/download/ulog/1.0.0/ulog.png)\r\n\r\n`ulog` started as [Picolog](https://npmjs.com/package/picolog), the smallest \r\npossible logging library I could build that could act as a drop-in replacement \r\nfor the native console (which varied wildly across environments back then).\r\nCompared to `picolog`, `ulog` adds some features from \r\n[debug](https://npmjs.com/package/debug) that I missed. Even with these extra \r\nfeatures, `ulog` is still **very** small, weighing in just over 1 kB minified \r\nand gzipped.\r\n\r\n\r\n## ulog v2\r\n\r\nIn version 2, `ulog` is more compatible with `debug` than ever before. \r\nThe biggest change is that the logger objects returned from `ulog()` are no \r\nlonger objects. They are functions, just like in `debug`. But unlike the \r\nfunctions returned by `debug`, those from `ulog` are *also* fully functional \r\nlogger objects will all methods we have on the native console and more.\r\n\r\nFor most code using `ulog` v1 or `debug`, upgrading to `ulog` v2 should be \r\nrelatively painless. The only backward-incompatibility this version introduces\r\ncompared to `ulog` v1 is the fact that the statement `typeof log == 'object'` \r\nis no longer true for `ulog` v2 loggers. For code \r\n[using `ulog` as a replacement for `debug`](#using-ulog-as-a-replacement-for-debug), \r\nthe upgrade path should be easier than for `ulog` v1, because of the improved \r\ncompatibility in v2.\r\n\r\n### beta\r\nPlease try out the latest v2 beta. To do so, you need to add a beta flag to the\r\nnpm install command:\r\n\r\n```sh\r\nnpm install --save ulog@beta\r\n```\r\n\r\nI do recommend trying out the beta, but if you just need the tried and tested\r\nv1, switch branch to the latest 1.x tag for the docs for that release and just\r\ndon't add the beta flag to your npm install command.\r\n\r\n\r\n## Install\r\n\r\nI recommend installing `ulog` with NPM:\r\n\r\n```sh\r\nnpm install --save ulog\r\n```\r\n\r\nYou should also be able to use e.g. Yarn etc.\r\n\r\n\r\n## Download\r\n\r\nIf you want the file for the browser to include in your project yourself,\r\nyou can download it from here.\r\n\r\n* [ulog.umd.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.3/ulog.umd.js) (~3kB, source)\r\n* [ulog.min.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.3/ulog.min.js) (~2kB, minified)\r\n\r\n\r\n## Include in your app\r\n\r\nI recommend using `require` or `import` in your projects and bundling a browser\r\nversion with Webpack.\r\n\r\n### require\r\n*my-module.js*\r\n```js\r\nvar ulog = require('ulog')\r\nvar log = ulog('my-module')\r\n// or, shorthand\r\nvar log = require('ulog')('my-module')\r\n```\r\n\r\n### import\r\n*my-module.js*\r\n```sh\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\n```\r\n\r\n### Script tag\r\nIf you want, you can import `ulog` with a script tag:\r\n\r\n```html\r\n<script src=\"https://cdn.rawgit.com/download/ulog/2.0.0-beta.3/ulog.min.js\"></script>\r\n<script src=\"myscript.js\"></script>\r\n```\r\n*myscript.js*\r\n```js\r\n\tvar log = ulog('my-module')\r\n```\r\n\r\n\r\n## Logging methods\r\n\r\n`ulog` defines 6 logging methods, which correspond with available log levels:\r\n```js\r\nlog.error('This logs an ERROR message')\r\nlog.warn('This logs a WARN message')\r\nlog.info('This logs an INFO message')\r\nlog.log('This logs a LOG message')\r\nlog.debug('This logs a DEBUG message')\r\nlog.trace('This logs a TRACE message')\r\n```\r\nNote how these methods are all from the \r\n[standard console API](https://console.spec.whatwg.org/).\r\nWhenever possible, calls to these methods go directly to the corresponding \r\nnative method.\r\n\r\n> On some systems, `debug()` is not natively available.\r\n\r\nIn addition, ulog v2 defines some additional methods that map to native \r\nfunctions and are there to increase compatibility with other popular logging\r\nlibraries:\r\n\r\n```js\r\nlog.verbose('This logs a message at level LOG using method log()')\r\nlog.silly('This logs a message at level TRACE using method log()')\r\n```\r\n\r\nCalls to all these methods will be direct calls to the native logging \r\nfunctions if available and enabled. This means that there will be no code in \r\nthe callstack that is not yours. This helps with debugging because browsers \r\ntend to show the file name and line number of the point the log call was made \r\nfrom. When logging using these methods, line numbers shown in the console will\r\nbe from your code, not from some wrapper function. \r\n\r\n> In recent years, browsers have been adding features to ignore some parts of the call stack\r\n\r\n\r\n## log()\r\n\r\nIn v2, the logger objects returned by `ulog` are functions. We can call them to\r\nlog messages, like so:\r\n\r\n```js\r\nlog('This logs a DEBUG message')\r\n```\r\n\r\nBy default, this will log a message at level `DEBUG`. But we can change that\r\nby specifying the desired log level as the first argument:\r\n\r\n```js\r\nlog('info', 'This logs an INFO message')\r\n```\r\n\r\n\r\n## Formatting\r\n\r\nIn the section about [logging methods](#logging-methods) we discussed how calls to \r\nthese methods will be direct native calls whenever possible. This is great for our \r\nline numbers. But this also means `ulog` can't do any formatting on these log calls. \r\nAnd formatting log messages can be a great feature.\r\n\r\nSo for v2, calls to the new logger function will be intercepted, so we can do some \r\nformatting if we want. No formatting is applied by default, but you can easily add \r\nyour own formatter like this:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\n\r\nfunction myFormat(logger, method, args){\r\n\t// add the logger name to the call\r\n  args.unshift(logger.name + ': ')\r\n}\r\n\r\nulog.formats.push(myFormat) // from here on, our format is used\r\n```\r\n\r\nAny code calling the logger function will have the formatting applied:\r\n\r\n```js\r\nimport ulog from 'ulog' \r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\nlog('Hello, World') // > 'my-module:  Hello World'\r\n```\r\n\r\nCalls to native methods are not formatted:\r\n\r\n```js\r\nlog.info('Hello, World') // > 'Hello World'\r\n```\r\n\r\nAdding the option to add formatters came at a cost of ~50 bytes on the total\r\nfile but I feel it is worth it.\r\n\r\n\r\n## Logging levels\r\n\r\nulog defines 6 logging levels, which correspond with the natively available \r\nlogging functions:\r\n\r\n```js\r\nlog.ERROR // 1\r\nlog.WARN  // 2\r\nlog.INFO  // 3\r\nlog.LOG   // 4\r\nlog.DEBUG // 5\r\nlog.TRACE // 6\r\n```\r\n\r\nIn addition, there is a 7th level that completely disables all logging:\r\n\r\n```js\r\nlog.NONE  // 0\r\n```\r\n\r\n### log.level\r\nTo get or set the log level, we use the `log.level` property:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tlog.info('This message will be logged')\r\n}\r\nlog.level = log.WARN\r\nlog.info('This info message will NOT be logged.')\r\nlog.warn('This warning message WILL be logged.')\r\nlog.level = log.NONE\r\nlog.error('Logging is completely disabled.')\r\n```\r\n\r\n> In general, code should not set the log level directly, but instead rely on \r\n> the host environment for the log level. See the sections below about the \r\n> [default log level](#default-log-level), the related \r\n> [startup parameter](#changing-the-log-level-via-a-startup-parameter) and \r\n> [debug mode](#debug-mode).\r\n\r\n\r\n## Default log level\r\n\r\nI've found that it makes sense to have different default log levels in \r\nthe browser and in Node. In Node, logging is often the only UI we have \r\navailable and we (the devs) are the only ones that will see that logging. \r\nIn the browser, we have an alternative UI (the webpage itself), so \r\nlogging will be less useful for normal users.\r\n\r\n### In Node\r\nIn Node, the log level defaults to `log.INFO`. This allows you to use \r\nINFO, WARN and ERROR when informing the user of stuff that happened. \r\nWith Picolog I found I had to resort to logging informational messages \r\nat WARN because I wanted them to be visible with the default settings \r\nand this did not feel right.\r\n\r\n### In the browser\r\nIn the browser the log level defaults to `log.WARN`. This means INFO \r\nmessages will be excluded, but for most users these messages won't be \r\nrelevant anyway and we can easily change the log level in the browser \r\nusing a query parameter in the URL or localStorage (see next section).\r\n\r\n\r\n## Changing the log level\r\n\r\nChanging the log level can be done in two ways:\r\n 1. Programmatically, through the API\r\n 2. Via a startup parameter\r\n\r\n### Changing the log level via the API\r\nWe can set the global log level directly on the `ulog` function:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\nulog.level = ulog.DEBUG\r\n```\r\n\r\nBut this is not recommended for most code! It is much better to set the\r\nlog level directly on a single module and leave the global settings alone.\r\n\r\nWe can set the level of a specific module in much the same way:\r\n```js\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\n```\r\n\r\nFor most code, it is best to treat `log.level` as if it was read-only,\r\nand rely upon the environment to set the log level, using the startup\r\nparameters described below.\r\n\r\n### Changing the log level via a startup parameter\r\nWe can set the initial global log level with a startup parameter. In \r\nNode we use an environment variable, whereas in the browser we use a \r\nquerystring parameter in the url or a key in localStorage.\r\n\r\n#### Environment variable\r\nSet the environment variable `LOG` to the desired log level.\r\n\r\n```sh\r\n$ LOG=info && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set LOG=INFO && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `log` to the querystring of the page:\r\n\r\n`http://www.example.com/?log=debug`\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n#### localStorage key\r\nAdd the key `log` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('log', 'info')\r\n```\r\nthen refresh the page.\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n\r\n## Debug mode\r\n\r\nIn addition to setting the global log level and setting the log levels of\r\nindividual loggers, you can also enable debug mode for a group of loggers.\r\nWhen in debug mode, the logger's individual log level will only be used if\r\nit is set to TRACE. Otherwise it will be ignored and the module will behave\r\nas if its level was set to DEBUG.\r\n\r\n### Enabling debug mode via the API\r\nThe `ulog` function has 3 methods that allow us to control debug mode:\r\n* `ulog.enable(str)` - Enables debug mode for the loggers listed in `str`\r\n* `ulog.enabled(name)` - Tests whether the logger is currently in debug mode\r\n* `ulog.disable()` - Disables debug mode for all loggers\r\n\r\nThe `*` character may be used as a wildcard. Suppose for example your module has\r\nloggers named \"connect:bodyParser\", \"connect:compress\" and \"connect:session\".\r\nInstead of listing all three with `connect:bodyParser,connect:compress,connect:session`,\r\nyou may simply use `connect:*`.\r\n\r\nYou can also exclude specific loggers by prefixing them with a \"-\" character.\r\nFor example, `*,-connect:*` would include all debuggers except those\r\nstarting with \"connect:\".\r\n\r\n```js\r\n// given modules app, lib, connect:bodyParser, connect:compress and connect:session\r\nulog.enable('app,connect:*')\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // true\r\nulog.enable('app,connect:*,-connect:compress') // negation symbol means 'except'\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // false\r\nulog.disable()\r\nulog.enabled('app') // false\r\n```\r\n\r\n### Enabling debug mode via a startup parameter\r\nWe can enable debug mode for some loggers using a startup parameter. On Node\r\nwe use environment variables and on the browser we use querystring parameters\r\nor localStorage keys.\r\n\r\n#### Environment variable\r\nSet the environment variable `DEBUG` to the string with logger names:\r\n\r\n```sh\r\n$ DEBUG=my-module && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set DEBUG=my-module && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `debug` to the querystring of the page:\r\n\r\n`http://www.example.com/?`**`debug=my-module`**\r\n\r\n#### localStorage key\r\nAdd the key `debug` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('debug', 'my-module')\r\n```\r\nthen refresh the page.\r\n\r\n\r\n## Using ulog as a replacement for debug\r\n\r\nIf you are using `ulog` as a replacement for `debug`, you may want to try the\r\nnew endpoint `ulog/debug` introduced in v2:\r\n\r\n```js\r\nimport ulog from 'ulog/debug'\r\nconst log = ulog('my-module')\r\nconst other = ulog('other-module')\r\nlog('Message')             // > '20:15  my-module           Message'\r\nother('Another message')   // > '20:15  other-module        Another message'\r\n```\r\n\r\nIt is not doing that much at the moment but I plan to make this a\r\ncompatibility endpoint for debug.\r\n\r\nYou can also use this as a Webpack alias, to make all modules that use `debug` \r\nswitch to `ulog/debug` instead. Compatibility is not guaranteed though so your\r\nmileage may vary:\r\n\r\n```js\r\n{\r\n    resolve: {\r\n        alias: {\r\n            'debug': 'ulog/debug'\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n\r\n## Using ulog as a polyfill\r\n\r\nulog supports all functions in the \r\n[NodeJS Console API](https://nodejs.org/api/console.html), so you should be \r\nable to use it as a polyfill in environments where there is no `console` \r\navailable (e.g. Nashorn):\r\n\r\n```js\r\n// assuming you already made sure there is a `global` object\r\nglobal.console = log;\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\nSince v2, the logger objects are functions and not objects, which may affect\r\ncode testing for the existence of the console like:\r\n\r\n```js\r\nif (typeof console == 'object') {\r\n\t// use the console\r\n}\r\n```\r\n\r\nSuch tests will fail as of v2. I am hoping to solve this with a dedicated \r\n`ulog/polyfill` endpoint, but have not yet got around to implementing it. \r\nIn the mean time you can use some `extend` function to create an object \r\nfrom a logger function:\r\n\r\n```js\r\n// assuming you have some `extend` function:\r\nglobal.console = extend({}, log)\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\n\r\n## `assert` does not throw\r\n\r\nulog patches the [different behavior](https://github.com/jasnell/node/blob/master/doc/api/console.md#consoleassertvalue-message-args) \r\nof `console.assert` in Node compared to browsers. In ulog, `assert` behaves \r\njust like in the browsers and never throws.\r\n\r\n\r\n## Performance considerations\r\n\r\nThe logging methods on the `log` object that correspond to a log level which \r\nis higher than the currently set level, are replaced by no-op methods. As such,\r\nyou generally don't have to worry about the performance overhead of leaving \r\nthe log statements in the production code. There is one exception to this rule\r\nthough. If preparing the message itself is a costly operation, you may want to\r\nsurround the log code with an `if (log.level >= myLevel)` statement:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tvar message = doLotsOfWorkToGenerateLogMessage();\r\n\tlog.info(message);\r\n}\r\n```\r\n\r\n\r\n## Issues\r\n\r\nAdd an issue in the [issue tracker](https://github.com/download/ulog/issues)\r\nto let me know of any problems you find, or questions you may have.\r\n\r\n\r\n## Credits\r\n\r\nCredits go to:\r\n* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly \r\n  giving up the `ulog` namespace on NPM. Thanks Felix!\r\n* TJ Holowaychuk for creating [debug](https://github.com/visionmedia/debug), \r\n  which was a great inspiration for ulog.\r\n\r\n\r\n## Copyright\r\n\r\nCopyright 2018 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.\r\n\r\n\r\n## License\r\n\r\nLicensed under the [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/) Open Source license.\r\n","readmeFilename":"README.md","gitHead":"5b49bef1575343632fc87b72d47c712c70b45e93","_id":"ulog@2.0.0-beta.3","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-hhaJqeoLRjE3km0OSPZp6r0DC+u9dwhHRHGwxrO0QK85RPDpe1ZQWiuO/ltiHb2azp+2LhF+WNKEFHd5auiXVQ==","shasum":"9a426c187edef3ab31ec16facf2b1b360a15fa2c","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.3.tgz","fileCount":26,"unpackedSize":162635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcAwXrCRA9TVsSAnZWagAApGEP/ivcyadUIAORuctI2OJ1\n0hHj5ELWHxnb9XzkuGEdD76a1PXA837fCkqg/EJFLDViRgqkC6Tp8Er/fUxH\nOL0cUgWjK7KzK2H0H7M489ypjxc2fBUeod/8tXSJFe+luG0hq5ufJD0+LjrP\nE1f7JdZlLZHJC46M6lpgJHFz+M1vPWZ2k2OG6bsZaPkSx+xYrqyPaCs+hiHb\ngD/2zL/4paU5r7WWHtK5mqIHcY/5S0O6CVyeHaYKcVg8IkYh6LpUQnhGBJO/\nFA3TorY065vTv4dj/UEqhcNEToqbk/DnHym1HPMRr8ph+L7rN6/Nv94vR4pc\nilfgIfEHMsvr4AX+Rh0wALQ4Vw0SuVhCZ3yyJThSzs2sZdbDgIhKpdZwQBvG\nuYO1xiTvCJygdKzSr29NzQBeRYO2yQpNH2cJPyugvWlCSbTCXTefOHFp5sXu\nYQNrQ/0kAllEjZ+4yCAc8foFOBjEMOwujpeKhRlbH+FysH8dO1qq3+PCjWYx\nO2Q8knflSkw/iNJuzLBveEfZsBcM/Kq1w1BZuGLg4/xwHbiSuH1pBhGO77KG\n/VWgTSUMwGCgpMWf8t16b6HP7ggi+fWgEbAZIR203QegmzX1JtimnHzS0gnl\nqifrnbPHc2dAwsaivkXRGKNtauQUZlcok48dq2HeaawQIzhbyWxKwYQN+vEk\n6jAT\r\n=ucRh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB0ND6YdcdRgyhX8/y2VM3cENx3pLP0IF0cOgz7tLfIJAiByhigpamgFEhfdsfdzN6GNiTM5CWp/5vcHW7wV+40eWA=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.3_1543701995384_0.7910214285487234"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"ulog","version":"2.0.0-beta.4","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^7.1.1","uglify-js":"^3.4.9","webpack":"^4.26.1","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.10"},"dependencies":{},"readme":"# ulog <sub><sup>v2.0.0-beta.4</sup></sub>\r\n### Microscopically small universal logging library\r\n\r\n[![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog)\r\n[![license](https://img.shields.io/npm/l/ulog.svg)](https://creativecommons.org/licenses/by/4.0/)\r\n[![travis](https://img.shields.io/travis/Download/ulog.svg)](https://travis-ci.org/Download/ulog)\r\n[![greenkeeper](https://img.shields.io/david/Download/ulog.svg)](https://greenkeeper.io/)\r\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\r\n\r\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\r\n\r\n![logo](https://cdn.rawgit.com/download/ulog/1.0.0/ulog.png)\r\n\r\n`ulog` started as [Picolog](https://npmjs.com/package/picolog), the smallest \r\npossible logging library I could build that could act as a drop-in replacement \r\nfor the native console (which varied wildly across environments back then).\r\nCompared to `picolog`, `ulog` adds some features from \r\n[debug](https://npmjs.com/package/debug) that I missed. Even with these extra \r\nfeatures, `ulog` is still **very** small, weighing in just over 1 kB minified \r\nand gzipped.\r\n\r\n\r\n## ulog v2\r\n\r\nIn version 2, `ulog` is more compatible with `debug` than ever before. \r\nThe biggest change is that the logger objects returned from `ulog()` are no \r\nlonger objects. They are functions, just like in `debug`. But unlike the \r\nfunctions returned by `debug`, those from `ulog` are *also* fully functional \r\nlogger objects will all methods we have on the native console and more.\r\n\r\nFor most code using `ulog` v1 or `debug`, upgrading to `ulog` v2 should be \r\nrelatively painless. The only backward-incompatibility this version introduces\r\ncompared to `ulog` v1 is the fact that the statement `typeof log == 'object'` \r\nis no longer true for `ulog` v2 loggers. For code \r\n[using `ulog` as a replacement for `debug`](#using-ulog-as-a-replacement-for-debug), \r\nthe upgrade path should be easier than for `ulog` v1, because of the improved \r\ncompatibility in v2.\r\n\r\n### beta\r\nPlease try out the latest v2 beta. To do so, you need to add a beta flag to the\r\nnpm install command:\r\n\r\n```sh\r\nnpm install --save ulog@beta\r\n```\r\n\r\nI do recommend trying out the beta, but if you just need the tried and tested\r\nv1, switch branch to the latest 1.x tag for the docs for that release and just\r\ndon't add the beta flag to your npm install command.\r\n\r\n\r\n## Install\r\n\r\nI recommend installing `ulog` with NPM:\r\n\r\n```sh\r\nnpm install --save ulog\r\n```\r\n\r\nYou should also be able to use e.g. Yarn etc.\r\n\r\n\r\n## Download\r\n\r\nIf you want the file for the browser to include in your project yourself,\r\nyou can download it from here.\r\n\r\n* [ulog.umd.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.4/ulog.umd.js) (~3kB, source)\r\n* [ulog.min.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.4/ulog.min.js) (~2kB, minified)\r\n\r\n\r\n## Include in your app\r\n\r\nI recommend using `require` or `import` in your projects and bundling a browser\r\nversion with Webpack.\r\n\r\n### require\r\n*my-module.js*\r\n```js\r\nvar ulog = require('ulog')\r\nvar log = ulog('my-module')\r\n// or, shorthand\r\nvar log = require('ulog')('my-module')\r\n```\r\n\r\n### import\r\n*my-module.js*\r\n```sh\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\n```\r\n\r\n### Script tag\r\nIf you want, you can import `ulog` with a script tag:\r\n\r\n```html\r\n<script src=\"https://cdn.rawgit.com/download/ulog/2.0.0-beta.4/ulog.min.js\"></script>\r\n<script src=\"myscript.js\"></script>\r\n```\r\n*myscript.js*\r\n```js\r\n\tvar log = ulog('my-module')\r\n```\r\n\r\n\r\n## Logging methods\r\n\r\n`ulog` defines 6 logging methods, which correspond with available log levels:\r\n```js\r\nlog.error('This logs an ERROR message')\r\nlog.warn('This logs a WARN message')\r\nlog.info('This logs an INFO message')\r\nlog.log('This logs a LOG message')\r\nlog.debug('This logs a DEBUG message')\r\nlog.trace('This logs a TRACE message')\r\n```\r\nNote how these methods are all from the \r\n[standard console API](https://console.spec.whatwg.org/).\r\nWhenever possible, calls to these methods go directly to the corresponding \r\nnative method.\r\n\r\n> On some systems, `debug()` is not natively available.\r\n\r\nIn addition, ulog v2 defines some additional methods that map to native \r\nfunctions and are there to increase compatibility with other popular logging\r\nlibraries:\r\n\r\n```js\r\nlog.verbose('This logs a message at level LOG using method log()')\r\nlog.silly('This logs a message at level TRACE using method log()')\r\n```\r\n\r\nCalls to all these methods will be direct calls to the native logging \r\nfunctions if available and enabled. This means that there will be no code in \r\nthe callstack that is not yours. This helps with debugging because browsers \r\ntend to show the file name and line number of the point the log call was made \r\nfrom. When logging using these methods, line numbers shown in the console will\r\nbe from your code, not from some wrapper function. \r\n\r\n> In recent years, browsers have been adding features to ignore some parts of the call stack\r\n\r\n\r\n## log()\r\n\r\nIn v2, the logger objects returned by `ulog` are functions. We can call them to\r\nlog messages, like so:\r\n\r\n```js\r\nlog('This logs a DEBUG message')\r\n```\r\n\r\nBy default, this will log a message at level `DEBUG`. But we can change that\r\nby specifying the desired log level as the first argument:\r\n\r\n```js\r\nlog('info', 'This logs an INFO message')\r\n```\r\n\r\n\r\n## Formatting\r\n\r\nIn the section about [logging methods](#logging-methods) we discussed how calls to \r\nthese methods will be direct native calls whenever possible. This is great for our \r\nline numbers. But this also means `ulog` can't do any formatting on these log calls. \r\nAnd formatting log messages can be a great feature.\r\n\r\nSo for v2, calls to the new logger function will be intercepted, so we can do some \r\nformatting if we want. No formatting is applied by default, but you can easily add \r\nyour own formatter like this:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\n\r\nfunction myFormat(logger, method, args){\r\n\t// add the logger name to the call\r\n  args.unshift(logger.name + ': ')\r\n}\r\n\r\nulog.formats.push(myFormat) // from here on, our format is used\r\n```\r\n\r\nAny code calling the logger function will have the formatting applied:\r\n\r\n```js\r\nimport ulog from 'ulog' \r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\nlog('Hello, World') // > 'my-module:  Hello World'\r\n```\r\n\r\nCalls to native methods are not formatted:\r\n\r\n```js\r\nlog.info('Hello, World') // > 'Hello World'\r\n```\r\n\r\nAdding the option to add formatters came at a cost of ~50 bytes on the total\r\nfile but I feel it is worth it.\r\n\r\n\r\n## Logging levels\r\n\r\nulog defines 6 logging levels, which correspond with the natively available \r\nlogging functions:\r\n\r\n```js\r\nlog.ERROR // 1\r\nlog.WARN  // 2\r\nlog.INFO  // 3\r\nlog.LOG   // 4\r\nlog.DEBUG // 5\r\nlog.TRACE // 6\r\n```\r\n\r\nIn addition, there is a 7th level that completely disables all logging:\r\n\r\n```js\r\nlog.NONE  // 0\r\n```\r\n\r\n### log.level\r\nTo get or set the log level, we use the `log.level` property:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tlog.info('This message will be logged')\r\n}\r\nlog.level = log.WARN\r\nlog.info('This info message will NOT be logged.')\r\nlog.warn('This warning message WILL be logged.')\r\nlog.level = log.NONE\r\nlog.error('Logging is completely disabled.')\r\n```\r\n\r\n> In general, code should not set the log level directly, but instead rely on \r\n> the host environment for the log level. See the sections below about the \r\n> [default log level](#default-log-level), the related \r\n> [startup parameter](#changing-the-log-level-via-a-startup-parameter) and \r\n> [debug mode](#debug-mode).\r\n\r\n\r\n## Default log level\r\n\r\nI've found that it makes sense to have different default log levels in \r\nthe browser and in Node. In Node, logging is often the only UI we have \r\navailable and we (the devs) are the only ones that will see that logging. \r\nIn the browser, we have an alternative UI (the webpage itself), so \r\nlogging will be less useful for normal users.\r\n\r\n### In Node\r\nIn Node, the log level defaults to `log.INFO`. This allows you to use \r\nINFO, WARN and ERROR when informing the user of stuff that happened. \r\nWith Picolog I found I had to resort to logging informational messages \r\nat WARN because I wanted them to be visible with the default settings \r\nand this did not feel right.\r\n\r\n### In the browser\r\nIn the browser the log level defaults to `log.WARN`. This means INFO \r\nmessages will be excluded, but for most users these messages won't be \r\nrelevant anyway and we can easily change the log level in the browser \r\nusing a query parameter in the URL or localStorage (see next section).\r\n\r\n\r\n## Changing the log level\r\n\r\nChanging the log level can be done in two ways:\r\n 1. Programmatically, through the API\r\n 2. Via a startup parameter\r\n\r\n### Changing the log level via the API\r\nWe can set the global log level directly on the `ulog` function:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\nulog.level = ulog.DEBUG\r\n```\r\n\r\nBut this is not recommended for most code! It is much better to set the\r\nlog level directly on a single module and leave the global settings alone.\r\n\r\nWe can set the level of a specific module in much the same way:\r\n```js\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\n```\r\n\r\nFor most code, it is best to treat `log.level` as if it was read-only,\r\nand rely upon the environment to set the log level, using the startup\r\nparameters described below.\r\n\r\n### Changing the log level via a startup parameter\r\nWe can set the initial global log level with a startup parameter. In \r\nNode we use an environment variable, whereas in the browser we use a \r\nquerystring parameter in the url or a key in localStorage.\r\n\r\n#### Environment variable\r\nSet the environment variable `LOG` to the desired log level.\r\n\r\n```sh\r\n$ LOG=info && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set LOG=INFO && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `log` to the querystring of the page:\r\n\r\n`http://www.example.com/?log=debug`\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n#### localStorage key\r\nAdd the key `log` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('log', 'info')\r\n```\r\nthen refresh the page.\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n\r\n## Debug mode\r\n\r\nIn addition to setting the global log level and setting the log levels of\r\nindividual loggers, you can also enable debug mode for a group of loggers.\r\nWhen in debug mode, the logger's individual log level will only be used if\r\nit is set to TRACE. Otherwise it will be ignored and the module will behave\r\nas if its level was set to DEBUG.\r\n\r\n### Enabling debug mode via the API\r\nThe `ulog` function has 3 methods that allow us to control debug mode:\r\n* `ulog.enable(str)` - Enables debug mode for the loggers listed in `str`\r\n* `ulog.enabled(name)` - Tests whether the logger is currently in debug mode\r\n* `ulog.disable()` - Disables debug mode for all loggers\r\n\r\nThe `*` character may be used as a wildcard. Suppose for example your module has\r\nloggers named \"connect:bodyParser\", \"connect:compress\" and \"connect:session\".\r\nInstead of listing all three with `connect:bodyParser,connect:compress,connect:session`,\r\nyou may simply use `connect:*`.\r\n\r\nYou can also exclude specific loggers by prefixing them with a \"-\" character.\r\nFor example, `*,-connect:*` would include all debuggers except those\r\nstarting with \"connect:\".\r\n\r\n```js\r\n// given modules app, lib, connect:bodyParser, connect:compress and connect:session\r\nulog.enable('app,connect:*')\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // true\r\nulog.enable('app,connect:*,-connect:compress') // negation symbol means 'except'\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // false\r\nulog.disable()\r\nulog.enabled('app') // false\r\n```\r\n\r\n### Enabling debug mode via a startup parameter\r\nWe can enable debug mode for some loggers using a startup parameter. On Node\r\nwe use environment variables and on the browser we use querystring parameters\r\nor localStorage keys.\r\n\r\n#### Environment variable\r\nSet the environment variable `DEBUG` to the string with logger names:\r\n\r\n```sh\r\n$ DEBUG=my-module && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set DEBUG=my-module && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `debug` to the querystring of the page:\r\n\r\n`http://www.example.com/?`**`debug=my-module`**\r\n\r\n#### localStorage key\r\nAdd the key `debug` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('debug', 'my-module')\r\n```\r\nthen refresh the page.\r\n\r\n\r\n## Using ulog as a replacement for debug\r\n\r\nIf you are using `ulog` as a replacement for `debug`, you may want to try the\r\nnew endpoint `ulog/debug` introduced in v2:\r\n\r\n```js\r\nimport ulog from 'ulog/debug'\r\nconst log = ulog('my-module')\r\nconst other = ulog('other-module')\r\nlog('Message')             // > '20:15  my-module           Message'\r\nother('Another message')   // > '20:15  other-module        Another message'\r\n```\r\n\r\nIt is not doing that much at the moment but I plan to make this a\r\ncompatibility endpoint for debug.\r\n\r\nYou can also use this as a Webpack alias, to make all modules that use `debug` \r\nswitch to `ulog/debug` instead. Compatibility is not guaranteed though so your\r\nmileage may vary:\r\n\r\n```js\r\n{\r\n    resolve: {\r\n        alias: {\r\n            'debug': 'ulog/debug'\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n\r\n## Using ulog as a polyfill\r\n\r\nulog supports all functions in the \r\n[NodeJS Console API](https://nodejs.org/api/console.html), so you should be \r\nable to use it as a polyfill in environments where there is no `console` \r\navailable (e.g. Nashorn):\r\n\r\n```js\r\n// assuming you already made sure there is a `global` object\r\nglobal.console = log;\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\nSince v2, the logger objects are functions and not objects, which may affect\r\ncode testing for the existence of the console like:\r\n\r\n```js\r\nif (typeof console == 'object') {\r\n\t// use the console\r\n}\r\n```\r\n\r\nSuch tests will fail as of v2. I am hoping to solve this with a dedicated \r\n`ulog/polyfill` endpoint, but have not yet got around to implementing it. \r\nIn the mean time you can use some `extend` function to create an object \r\nfrom a logger function:\r\n\r\n```js\r\n// assuming you have some `extend` function:\r\nglobal.console = extend({}, log)\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\n\r\n## `assert` does not throw\r\n\r\nulog patches the [different behavior](https://github.com/jasnell/node/blob/master/doc/api/console.md#consoleassertvalue-message-args) \r\nof `console.assert` in Node compared to browsers. In ulog, `assert` behaves \r\njust like in the browsers and never throws.\r\n\r\n\r\n## Performance considerations\r\n\r\nThe logging methods on the `log` object that correspond to a log level which \r\nis higher than the currently set level, are replaced by no-op methods. As such,\r\nyou generally don't have to worry about the performance overhead of leaving \r\nthe log statements in the production code. There is one exception to this rule\r\nthough. If preparing the message itself is a costly operation, you may want to\r\nsurround the log code with an `if (log.level >= myLevel)` statement:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tvar message = doLotsOfWorkToGenerateLogMessage();\r\n\tlog.info(message);\r\n}\r\n```\r\n\r\n\r\n## Issues\r\n\r\nAdd an issue in the [issue tracker](https://github.com/download/ulog/issues)\r\nto let me know of any problems you find, or questions you may have.\r\n\r\n\r\n## Credits\r\n\r\nCredits go to:\r\n* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly \r\n  giving up the `ulog` namespace on NPM. Thanks Felix!\r\n* TJ Holowaychuk for creating [debug](https://github.com/visionmedia/debug), \r\n  which was a great inspiration for ulog.\r\n\r\n\r\n## Copyright\r\n\r\nCopyright 2018 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.\r\n\r\n\r\n## License\r\n\r\nLicensed under the [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/) Open Source license.\r\n","readmeFilename":"README.md","gitHead":"98e83aaaf715d39733cb13c1db977a60a9b05c0d","_id":"ulog@2.0.0-beta.4","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-/hxBcJs3GNRQ2XJnbBjeJT+QickqQr4g/vlm2IKB1yHndmoJt/kTq0mluLZQ42NIGmgnPzabGBraJTutuqFzFg==","shasum":"d20f4b3dc7b842f81af0cb884cd3e6da2ad5b438","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.4.tgz","fileCount":26,"unpackedSize":162559,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcA1xwCRA9TVsSAnZWagAA93wP/05Z/mn/CarSEoUTJskG\n5NQAWBciHRMs9tdgudpjgYxESGnU4h1K6yohsccqPo7l41Y8X3iUbVNS1juD\nvANeSMCfRrGRbWX4wVJKfiyJqT1GdEfpTJlTEqSI+ojg/0u1NIvpJXm01SHx\nobZU3k4RTx7UOD15zRH+4GkKv4arnLruIO/2AdmxdSUHGN6Soduk/Pq/O2ar\nTHUvOOKvZJ5EG2BqmA4L1bO/kWJLBPvCahJJLNxhRwci4O7kR+w7Gu7+0tJm\nYeYDbJa3uc6g5JUI7SQC67863MOc6JLw7euB922NxSrRDZolbMrfTBiPPyH8\n59mpxFKOk1pMrxyd52H7ug2ZZF5uQ4olCL8Xtu5ArQb3WAeSAs/I2d1GENrF\nWkTDhOwO9E7DJt++0nSrRZG/pnrWdc7dtRu5Fgw+lxBBr2RvZMVeOXP1AzQk\nLy2f3wVOdsoOdH/6mZ3IgFUSKYGUgTTxoInZtqV71QdXLwlsKoIg7O/5vYWs\nEAsrT8LBPcJcgN6xsk+Lb/S/uN7igEaNevFTM1aqD0HRM2dKhLZbNFnwsl54\nAr3Kjb+TZjnNwW1QMXRX23v9hTZkgfxqISpc4U+YlKJ0hhxQ20dZd/1ADO4j\nYQU1KEZiH2NF/W84Vl7NCENP5R9jHEOsSL5LkjYiVeEGzWxRUt4d0XW/in4K\nMl5W\r\n=tmkd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHyRBdYx8WAxZ6B/qgI9iF8+9qKHY2cEUh25e1svbVNOAiBO9EhPRyGLGShi+ITAOHr9M7xithAr7b4JTLbteZ9Mrw=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.4_1543724143502_0.7102085699808831"},"_hasShrinkwrap":false},"2.0.0-beta.5":{"name":"ulog","version":"2.0.0-beta.5","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^7.1.1","uglify-js":"^3.4.9","webpack":"^4.26.1","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.10"},"dependencies":{},"readme":"# ulog <sub><sup>v2.0.0-beta.5</sup></sub>\r\n### Microscopically small universal logging library\r\n\r\n[![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog)\r\n[![license](https://img.shields.io/npm/l/ulog.svg)](https://creativecommons.org/licenses/by/4.0/)\r\n[![travis](https://img.shields.io/travis/Download/ulog.svg)](https://travis-ci.org/Download/ulog)\r\n[![greenkeeper](https://img.shields.io/david/Download/ulog.svg)](https://greenkeeper.io/)\r\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\r\n\r\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\r\n\r\n![logo](https://cdn.rawgit.com/download/ulog/1.0.0/ulog.png)\r\n\r\n`ulog` started as [Picolog](https://npmjs.com/package/picolog), the smallest \r\npossible logging library I could build that could act as a drop-in replacement \r\nfor the native console (which varied wildly across environments back then).\r\nCompared to `picolog`, `ulog` adds some features from \r\n[debug](https://npmjs.com/package/debug) that I missed. Even with these extra \r\nfeatures, `ulog` is still **very** small, weighing in just over 1 kB minified \r\nand gzipped.\r\n\r\n\r\n## ulog v2\r\n\r\nIn version 2, `ulog` is more compatible with `debug` than ever before. \r\nThe biggest change is that the logger objects returned from `ulog()` are no \r\nlonger objects. They are functions, just like in `debug`. But unlike the \r\nfunctions returned by `debug`, those from `ulog` are *also* fully functional \r\nlogger objects will all methods we have on the native console and more.\r\n\r\nFor most code using `ulog` v1 or `debug`, upgrading to `ulog` v2 should be \r\nrelatively painless. The only backward-incompatibility this version introduces\r\ncompared to `ulog` v1 is the fact that the statement `typeof log == 'object'` \r\nis no longer true for `ulog` v2 loggers. For code \r\n[using `ulog` as a replacement for `debug`](#using-ulog-as-a-replacement-for-debug), \r\nthe upgrade path should be easier than for `ulog` v1, because of the improved \r\ncompatibility in v2.\r\n\r\n### beta\r\nPlease try out the latest v2 beta. To do so, you need to add a beta flag to the\r\nnpm install command:\r\n\r\n```sh\r\nnpm install --save ulog@beta\r\n```\r\n\r\nI do recommend trying out the beta, but if you just need the tried and tested\r\nv1, switch branch to the latest 1.x tag for the docs for that release and just\r\ndon't add the beta flag to your npm install command.\r\n\r\n\r\n## Install\r\n\r\nI recommend installing `ulog` with NPM:\r\n\r\n```sh\r\nnpm install --save ulog\r\n```\r\n\r\nYou should also be able to use e.g. Yarn etc.\r\n\r\n\r\n## Download\r\n\r\nIf you want the file for the browser to include in your project yourself,\r\nyou can download it from here.\r\n\r\n* [ulog.umd.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.5/ulog.umd.js) (~3kB, source)\r\n* [ulog.min.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.5/ulog.min.js) (~2kB, minified)\r\n\r\n\r\n## Include in your app\r\n\r\nI recommend using `require` or `import` in your projects and bundling a browser\r\nversion with Webpack.\r\n\r\n### require\r\n*my-module.js*\r\n```js\r\nvar ulog = require('ulog')\r\nvar log = ulog('my-module')\r\n// or, shorthand\r\nvar log = require('ulog')('my-module')\r\n```\r\n\r\n### import\r\n*my-module.js*\r\n```sh\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\n```\r\n\r\n### Script tag\r\nIf you want, you can import `ulog` with a script tag:\r\n\r\n```html\r\n<script src=\"https://cdn.rawgit.com/download/ulog/2.0.0-beta.5/ulog.min.js\"></script>\r\n<script src=\"myscript.js\"></script>\r\n```\r\n*myscript.js*\r\n```js\r\n\tvar log = ulog('my-module')\r\n```\r\n\r\n\r\n## Logging methods\r\n\r\n`ulog` defines 6 logging methods, which correspond with available log levels:\r\n```js\r\nlog.error('This logs an ERROR message')\r\nlog.warn('This logs a WARN message')\r\nlog.info('This logs an INFO message')\r\nlog.log('This logs a LOG message')\r\nlog.debug('This logs a DEBUG message')\r\nlog.trace('This logs a TRACE message')\r\n```\r\nNote how these methods are all from the \r\n[standard console API](https://console.spec.whatwg.org/).\r\nWhenever possible, calls to these methods go directly to the corresponding \r\nnative method.\r\n\r\n> On some systems, `debug()` is not natively available.\r\n\r\nIn addition, ulog v2 defines some additional methods that map to native \r\nfunctions and are there to increase compatibility with other popular logging\r\nlibraries:\r\n\r\n```js\r\nlog.verbose('This logs a message at level LOG using method log()')\r\nlog.silly('This logs a message at level TRACE using method log()')\r\n```\r\n\r\nCalls to all these methods will be direct calls to the native logging \r\nfunctions if available and enabled. This means that there will be no code in \r\nthe callstack that is not yours. This helps with debugging because browsers \r\ntend to show the file name and line number of the point the log call was made \r\nfrom. When logging using these methods, line numbers shown in the console will\r\nbe from your code, not from some wrapper function. \r\n\r\n> In recent years, browsers have been adding features to ignore some parts of the call stack\r\n\r\n\r\n## log()\r\n\r\nIn v2, the logger objects returned by `ulog` are functions. We can call them to\r\nlog messages, like so:\r\n\r\n```js\r\nlog('This logs a DEBUG message')\r\n```\r\n\r\nBy default, this will log a message at level `DEBUG`. But we can change that\r\nby specifying the desired log level as the first argument:\r\n\r\n```js\r\nlog('info', 'This logs an INFO message')\r\n```\r\n\r\n\r\n## Formatting\r\n\r\nIn the section about [logging methods](#logging-methods) we discussed how calls to \r\nthese methods will be direct native calls whenever possible. This is great for our \r\nline numbers. But this also means `ulog` can't do any formatting on these log calls. \r\nAnd formatting log messages can be a great feature.\r\n\r\nSo for v2, calls to the new logger function will be intercepted, so we can do some \r\nformatting if we want. No formatting is applied by default, but you can easily add \r\nyour own formatter like this:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\n\r\nfunction myFormat(logger, method, args){\r\n\t// add the logger name to the call\r\n  args.unshift(logger.name + ': ')\r\n}\r\n\r\nulog.formats.push(myFormat) // from here on, our format is used\r\n```\r\n\r\nAny code calling the logger function will have the formatting applied:\r\n\r\n```js\r\nimport ulog from 'ulog' \r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\nlog('Hello, World') // > 'my-module:  Hello World'\r\n```\r\n\r\nCalls to native methods are not formatted:\r\n\r\n```js\r\nlog.info('Hello, World') // > 'Hello World'\r\n```\r\n\r\nAdding the option to add formatters came at a cost of ~50 bytes on the total\r\nfile but I feel it is worth it.\r\n\r\n\r\n## Logging levels\r\n\r\nulog defines 6 logging levels, which correspond with the natively available \r\nlogging functions:\r\n\r\n```js\r\nlog.ERROR // 1\r\nlog.WARN  // 2\r\nlog.INFO  // 3\r\nlog.LOG   // 4\r\nlog.DEBUG // 5\r\nlog.TRACE // 6\r\n```\r\n\r\nIn addition, there is a 7th level that completely disables all logging:\r\n\r\n```js\r\nlog.NONE  // 0\r\n```\r\n\r\n### log.level\r\nTo get or set the log level, we use the `log.level` property:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tlog.info('This message will be logged')\r\n}\r\nlog.level = log.WARN\r\nlog.info('This info message will NOT be logged.')\r\nlog.warn('This warning message WILL be logged.')\r\nlog.level = log.NONE\r\nlog.error('Logging is completely disabled.')\r\n```\r\n\r\n> In general, code should not set the log level directly, but instead rely on \r\n> the host environment for the log level. See the sections below about the \r\n> [default log level](#default-log-level), the related \r\n> [startup parameter](#changing-the-log-level-via-a-startup-parameter) and \r\n> [debug mode](#debug-mode).\r\n\r\n\r\n## Default log level\r\n\r\nI've found that it makes sense to have different default log levels in \r\nthe browser and in Node. In Node, logging is often the only UI we have \r\navailable and we (the devs) are the only ones that will see that logging. \r\nIn the browser, we have an alternative UI (the webpage itself), so \r\nlogging will be less useful for normal users.\r\n\r\n### In Node\r\nIn Node, the log level defaults to `log.INFO`. This allows you to use \r\nINFO, WARN and ERROR when informing the user of stuff that happened. \r\nWith Picolog I found I had to resort to logging informational messages \r\nat WARN because I wanted them to be visible with the default settings \r\nand this did not feel right.\r\n\r\n### In the browser\r\nIn the browser the log level defaults to `log.WARN`. This means INFO \r\nmessages will be excluded, but for most users these messages won't be \r\nrelevant anyway and we can easily change the log level in the browser \r\nusing a query parameter in the URL or localStorage (see next section).\r\n\r\n\r\n## Changing the log level\r\n\r\nChanging the log level can be done in two ways:\r\n 1. Programmatically, through the API\r\n 2. Via a startup parameter\r\n\r\n### Changing the log level via the API\r\nWe can set the global log level directly on the `ulog` function:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\nulog.level = ulog.DEBUG\r\n```\r\n\r\nBut this is not recommended for most code! It is much better to set the\r\nlog level directly on a single module and leave the global settings alone.\r\n\r\nWe can set the level of a specific module in much the same way:\r\n```js\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\n```\r\n\r\nFor most code, it is best to treat `log.level` as if it was read-only,\r\nand rely upon the environment to set the log level, using the startup\r\nparameters described below.\r\n\r\n### Changing the log level via a startup parameter\r\nWe can set the initial global log level with a startup parameter. In \r\nNode we use an environment variable, whereas in the browser we use a \r\nquerystring parameter in the url or a key in localStorage.\r\n\r\n#### Environment variable\r\nSet the environment variable `LOG` to the desired log level.\r\n\r\n```sh\r\n$ LOG=info && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set LOG=INFO && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `log` to the querystring of the page:\r\n\r\n`http://www.example.com/?log=debug`\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n#### localStorage key\r\nAdd the key `log` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('log', 'info')\r\n```\r\nthen refresh the page.\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n\r\n## Debug mode\r\n\r\nIn addition to setting the global log level and setting the log levels of\r\nindividual loggers, you can also enable debug mode for a group of loggers.\r\nWhen in debug mode, the logger's individual log level will only be used if\r\nit is set to TRACE. Otherwise it will be ignored and the module will behave\r\nas if its level was set to DEBUG.\r\n\r\n### Enabling debug mode via the API\r\nThe `ulog` function has 3 methods that allow us to control debug mode:\r\n* `ulog.enable(str)` - Enables debug mode for the loggers listed in `str`\r\n* `ulog.enabled(name)` - Tests whether the logger is currently in debug mode\r\n* `ulog.disable()` - Disables debug mode for all loggers\r\n\r\nThe `*` character may be used as a wildcard. Suppose for example your module has\r\nloggers named \"connect:bodyParser\", \"connect:compress\" and \"connect:session\".\r\nInstead of listing all three with `connect:bodyParser,connect:compress,connect:session`,\r\nyou may simply use `connect:*`.\r\n\r\nYou can also exclude specific loggers by prefixing them with a \"-\" character.\r\nFor example, `*,-connect:*` would include all debuggers except those\r\nstarting with \"connect:\".\r\n\r\n```js\r\n// given modules app, lib, connect:bodyParser, connect:compress and connect:session\r\nulog.enable('app,connect:*')\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // true\r\nulog.enable('app,connect:*,-connect:compress') // negation symbol means 'except'\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // false\r\nulog.disable()\r\nulog.enabled('app') // false\r\n```\r\n\r\n### Enabling debug mode via a startup parameter\r\nWe can enable debug mode for some loggers using a startup parameter. On Node\r\nwe use environment variables and on the browser we use querystring parameters\r\nor localStorage keys.\r\n\r\n#### Environment variable\r\nSet the environment variable `DEBUG` to the string with logger names:\r\n\r\n```sh\r\n$ DEBUG=my-module && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set DEBUG=my-module && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `debug` to the querystring of the page:\r\n\r\n`http://www.example.com/?`**`debug=my-module`**\r\n\r\n#### localStorage key\r\nAdd the key `debug` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('debug', 'my-module')\r\n```\r\nthen refresh the page.\r\n\r\n\r\n## Using ulog as a replacement for debug\r\n\r\nIf you are using `ulog` as a replacement for `debug`, you may want to try the\r\nnew endpoint `ulog/debug` introduced in v2:\r\n\r\n```js\r\nimport ulog from 'ulog/debug'\r\nconst log = ulog('my-module')\r\nconst other = ulog('other-module')\r\nlog('Message')             // > '20:15  my-module           Message'\r\nother('Another message')   // > '20:15  other-module        Another message'\r\n```\r\n\r\nIt is not doing that much at the moment but I plan to make this a\r\ncompatibility endpoint for debug.\r\n\r\nYou can also use this as a Webpack alias, to make all modules that use `debug` \r\nswitch to `ulog/debug` instead. Compatibility is not guaranteed though so your\r\nmileage may vary:\r\n\r\n```js\r\n{\r\n    resolve: {\r\n        alias: {\r\n            'debug': 'ulog/debug'\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n\r\n## Using ulog as a polyfill\r\n\r\nulog supports all functions in the \r\n[NodeJS Console API](https://nodejs.org/api/console.html), so you should be \r\nable to use it as a polyfill in environments where there is no `console` \r\navailable (e.g. Nashorn):\r\n\r\n```js\r\n// assuming you already made sure there is a `global` object\r\nglobal.console = log;\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\nSince v2, the logger objects are functions and not objects, which may affect\r\ncode testing for the existence of the console like:\r\n\r\n```js\r\nif (typeof console == 'object') {\r\n\t// use the console\r\n}\r\n```\r\n\r\nSuch tests will fail as of v2. I am hoping to solve this with a dedicated \r\n`ulog/polyfill` endpoint, but have not yet got around to implementing it. \r\nIn the mean time you can use some `extend` function to create an object \r\nfrom a logger function:\r\n\r\n```js\r\n// assuming you have some `extend` function:\r\nglobal.console = extend({}, log)\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\n\r\n## `assert` does not throw\r\n\r\nulog patches the [different behavior](https://github.com/jasnell/node/blob/master/doc/api/console.md#consoleassertvalue-message-args) \r\nof `console.assert` in Node compared to browsers. In ulog, `assert` behaves \r\njust like in the browsers and never throws.\r\n\r\n\r\n## Performance considerations\r\n\r\nThe logging methods on the `log` object that correspond to a log level which \r\nis higher than the currently set level, are replaced by no-op methods. As such,\r\nyou generally don't have to worry about the performance overhead of leaving \r\nthe log statements in the production code. There is one exception to this rule\r\nthough. If preparing the message itself is a costly operation, you may want to\r\nsurround the log code with an `if (log.level >= myLevel)` statement:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tvar message = doLotsOfWorkToGenerateLogMessage();\r\n\tlog.info(message);\r\n}\r\n```\r\n\r\n\r\n## Issues\r\n\r\nAdd an issue in the [issue tracker](https://github.com/download/ulog/issues)\r\nto let me know of any problems you find, or questions you may have.\r\n\r\n\r\n## Credits\r\n\r\nCredits go to:\r\n* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly \r\n  giving up the `ulog` namespace on NPM. Thanks Felix!\r\n* TJ Holowaychuk for creating [debug](https://github.com/visionmedia/debug), \r\n  which was a great inspiration for ulog.\r\n\r\n\r\n## Copyright\r\n\r\nCopyright 2018 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.\r\n\r\n\r\n## License\r\n\r\nLicensed under the [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/) Open Source license.\r\n","readmeFilename":"README.md","gitHead":"dacbc0da8ece86a4d0146944b9499ae8fa0a5fbe","_id":"ulog@2.0.0-beta.5","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-PYRY7EzwlRS1Si6YdN5Nh6emK7EbeeTw4HECKixax4B84rvUe17r1toVbY1Pldu3FpQfGvVGkJrBlac22MCiWw==","shasum":"bddfe1a1f6ac12455728e56658d9cd1a20d15fc9","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.5.tgz","fileCount":26,"unpackedSize":162561,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcA8zzCRA9TVsSAnZWagAA7msP/j0XVmJPlArSXlKuZprl\nOIZQOQhj1UQ8nTKhT0XxuuKuPCTWDupp70dbSHZmttJcYMkP34LG2su0EQvO\nrvjMt5hFJILth0KH7grGK1FJUwjsSOZ3FqQemU2EXIa9G+jm1s5GQftvKVrl\nkG1ekw78Pc6/k7RcfZ9K4E5wpNCxL3l3k6U5sKF8q9osvKenk0tPfJly7dyS\nwt3rlbkhuEi8ubAJD4m6ZpCajOScpkjrr6WvX2lP8q32fLTzB4FkoUgvf29k\naHSMaK8ytSk9BovYZbFIptaIO6OZiHMKz7mOnD+zSGRhEySQVesKJ4gVQt30\n1O5pQ4d9QOw19z9e5OXpSqG81jw2AXsTG31K4hNxydzcPuHV0+gv98l04LQV\nx8bc7r7UTLZjrykZ9OcIPpXmeRoVeiUQl1dxoPIpJNXV5ztxkM5xtna46K9s\n+Ten4Rkq+S7STMtaKIqMt2wnyPTDOZ/tzrAYRm1naLP/5jGEjcI10zVXFh52\nDYfzkRs2DeTJWXuQPI07eB/jMYplTtsfA/tjmgAhVzD6+WPehKpIUwMWkN4M\n0P2lop1bastyn6GyYhiXnr90Ehzj7o4maXyW8sRBSIDckYGh71pYlfgTxIb/\nhPF2QuiQGBzBN8VF6WH+4eCBfhXXbJzOxNBGcz1kg0IQHBgDfOlKf9w84gKe\nk9tB\r\n=RDY/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+YJoKju5ytRqWOW1wHr5qMLJb06LyRyxhsPcyzOstwAiBuCKHzIDFAnk1l/cHC50/AEp9JBvQteCzPVvrCHvSFLA=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.5_1543752947225_0.6726898007272355"},"_hasShrinkwrap":false},"2.0.0-beta.6":{"name":"ulog","version":"2.0.0-beta.6","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^7.1.1","uglify-js":"^3.4.9","webpack":"^4.26.1","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.10"},"dependencies":{},"readme":"# ulog <sub><sup>v2.0.0-beta.6</sup></sub>\r\n### Microscopically small universal logging library\r\n\r\n[![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog)\r\n[![license](https://img.shields.io/npm/l/ulog.svg)](https://creativecommons.org/licenses/by/4.0/)\r\n[![travis](https://img.shields.io/travis/Download/ulog.svg)](https://travis-ci.org/Download/ulog)\r\n[![greenkeeper](https://img.shields.io/david/Download/ulog.svg)](https://greenkeeper.io/)\r\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\r\n\r\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\r\n\r\n![logo](https://cdn.rawgit.com/download/ulog/1.0.0/ulog.png)\r\n\r\n`ulog` started as [Picolog](https://npmjs.com/package/picolog), the smallest \r\npossible logging library I could build that could act as a drop-in replacement \r\nfor the native console (which varied wildly across environments back then).\r\nCompared to `picolog`, `ulog` adds some features from \r\n[debug](https://npmjs.com/package/debug) that I missed. Even with these extra \r\nfeatures, `ulog` is still **very** small, weighing in just over 1 kB minified \r\nand gzipped.\r\n\r\n\r\n## ulog v2\r\n\r\nIn version 2, `ulog` is more compatible with `debug` than ever before. \r\nThe biggest change is that the logger objects returned from `ulog()` are no \r\nlonger objects. They are functions, just like in `debug`. But unlike the \r\nfunctions returned by `debug`, those from `ulog` are *also* fully functional \r\nlogger objects will all methods we have on the native console and more.\r\n\r\nFor most code using `ulog` v1 or `debug`, upgrading to `ulog` v2 should be \r\nrelatively painless. The only backward-incompatibility this version introduces\r\ncompared to `ulog` v1 is the fact that the statement `typeof log == 'object'` \r\nis no longer true for `ulog` v2 loggers. For code \r\n[using `ulog` as a replacement for `debug`](#using-ulog-as-a-replacement-for-debug), \r\nthe upgrade path should be easier than for `ulog` v1, because of the improved \r\ncompatibility in v2.\r\n\r\n### beta\r\nPlease try out the latest v2 beta. To do so, you need to add a beta flag to the\r\nnpm install command:\r\n\r\n```sh\r\nnpm install --save ulog@beta\r\n```\r\n\r\nI do recommend trying out the beta, but if you just need the tried and tested\r\nv1, switch branch to the latest 1.x tag for the docs for that release and just\r\ndon't add the beta flag to your npm install command.\r\n\r\n\r\n## Install\r\n\r\nI recommend installing `ulog` with NPM:\r\n\r\n```sh\r\nnpm install --save ulog\r\n```\r\n\r\nYou should also be able to use e.g. Yarn etc.\r\n\r\n\r\n## Download\r\n\r\nIf you want the file for the browser to include in your project yourself,\r\nyou can download it from here.\r\n\r\n* [ulog.umd.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.6/ulog.umd.js) (~3kB, source)\r\n* [ulog.min.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.6/ulog.min.js) (~2kB, minified)\r\n\r\n\r\n## Include in your app\r\n\r\nI recommend using `require` or `import` in your projects and bundling a browser\r\nversion with Webpack.\r\n\r\n### require\r\n*my-module.js*\r\n```js\r\nvar ulog = require('ulog')\r\nvar log = ulog('my-module')\r\n// or, shorthand\r\nvar log = require('ulog')('my-module')\r\n```\r\n\r\n### import\r\n*my-module.js*\r\n```sh\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\n```\r\n\r\n### Script tag\r\nIf you want, you can import `ulog` with a script tag:\r\n\r\n```html\r\n<script src=\"https://cdn.rawgit.com/download/ulog/2.0.0-beta.6/ulog.min.js\"></script>\r\n<script src=\"myscript.js\"></script>\r\n```\r\n*myscript.js*\r\n```js\r\n\tvar log = ulog('my-module')\r\n```\r\n\r\n\r\n## Logging methods\r\n\r\n`ulog` defines 6 logging methods, which correspond with available log levels:\r\n```js\r\nlog.error('This logs an ERROR message')\r\nlog.warn('This logs a WARN message')\r\nlog.info('This logs an INFO message')\r\nlog.log('This logs a LOG message')\r\nlog.debug('This logs a DEBUG message')\r\nlog.trace('This logs a TRACE message')\r\n```\r\nNote how these methods are all from the \r\n[standard console API](https://console.spec.whatwg.org/).\r\nWhenever possible, calls to these methods go directly to the corresponding \r\nnative method.\r\n\r\n> On some systems, `debug()` is not natively available.\r\n\r\nIn addition, ulog v2 defines some additional methods that map to native \r\nfunctions and are there to increase compatibility with other popular logging\r\nlibraries:\r\n\r\n```js\r\nlog.verbose('This logs a message at level LOG using method log()')\r\nlog.silly('This logs a message at level TRACE using method log()')\r\n```\r\n\r\nCalls to all these methods will be direct calls to the native logging \r\nfunctions if available and enabled. This means that there will be no code in \r\nthe callstack that is not yours. This helps with debugging because browsers \r\ntend to show the file name and line number of the point the log call was made \r\nfrom. When logging using these methods, line numbers shown in the console will\r\nbe from your code, not from some wrapper function. \r\n\r\n> In recent years, browsers have been adding features to ignore some parts of the call stack\r\n\r\n\r\n## log()\r\n\r\nIn v2, the logger objects returned by `ulog` are functions. We can call them to\r\nlog messages, like so:\r\n\r\n```js\r\nlog('This logs a DEBUG message')\r\n```\r\n\r\nBy default, this will log a message at level `DEBUG`. But we can change that\r\nby specifying the desired log level as the first argument:\r\n\r\n```js\r\nlog('info', 'This logs an INFO message')\r\n```\r\n\r\n\r\n## Formatting\r\n\r\nIn the section about [logging methods](#logging-methods) we discussed how calls to \r\nthese methods will be direct native calls whenever possible. This is great for our \r\nline numbers. But this also means `ulog` can't do any formatting on these log calls. \r\nAnd formatting log messages can be a great feature.\r\n\r\nSo for v2, calls to the new logger function will be intercepted, so we can do some \r\nformatting if we want. No formatting is applied by default, but you can easily add \r\nyour own formatter like this:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\n\r\nfunction myFormat(logger, method, args){\r\n\t// add the logger name to the call\r\n  args.unshift(logger.name + ': ')\r\n}\r\n\r\nulog.formats.push(myFormat) // from here on, our format is used\r\n```\r\n\r\nAny code calling the logger function will have the formatting applied:\r\n\r\n```js\r\nimport ulog from 'ulog' \r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\nlog('Hello, World') // > 'my-module:  Hello World'\r\n```\r\n\r\nCalls to native methods are not formatted:\r\n\r\n```js\r\nlog.info('Hello, World') // > 'Hello World'\r\n```\r\n\r\nAdding the option to add formatters came at a cost of ~50 bytes on the total\r\nfile but I feel it is worth it.\r\n\r\n\r\n## Logging levels\r\n\r\nulog defines 6 logging levels, which correspond with the natively available \r\nlogging functions:\r\n\r\n```js\r\nlog.ERROR // 1\r\nlog.WARN  // 2\r\nlog.INFO  // 3\r\nlog.LOG   // 4\r\nlog.DEBUG // 5\r\nlog.TRACE // 6\r\n```\r\n\r\nIn addition, there is a 7th level that completely disables all logging:\r\n\r\n```js\r\nlog.NONE  // 0\r\n```\r\n\r\n### log.level\r\nTo get or set the log level, we use the `log.level` property:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tlog.info('This message will be logged')\r\n}\r\nlog.level = log.WARN\r\nlog.info('This info message will NOT be logged.')\r\nlog.warn('This warning message WILL be logged.')\r\nlog.level = log.NONE\r\nlog.error('Logging is completely disabled.')\r\n```\r\n\r\n> In general, code should not set the log level directly, but instead rely on \r\n> the host environment for the log level. See the sections below about the \r\n> [default log level](#default-log-level), the related \r\n> [startup parameter](#changing-the-log-level-via-a-startup-parameter) and \r\n> [debug mode](#debug-mode).\r\n\r\n\r\n## Default log level\r\n\r\nI've found that it makes sense to have different default log levels in \r\nthe browser and in Node. In Node, logging is often the only UI we have \r\navailable and we (the devs) are the only ones that will see that logging. \r\nIn the browser, we have an alternative UI (the webpage itself), so \r\nlogging will be less useful for normal users.\r\n\r\n### In Node\r\nIn Node, the log level defaults to `log.INFO`. This allows you to use \r\nINFO, WARN and ERROR when informing the user of stuff that happened. \r\nWith Picolog I found I had to resort to logging informational messages \r\nat WARN because I wanted them to be visible with the default settings \r\nand this did not feel right.\r\n\r\n### In the browser\r\nIn the browser the log level defaults to `log.WARN`. This means INFO \r\nmessages will be excluded, but for most users these messages won't be \r\nrelevant anyway and we can easily change the log level in the browser \r\nusing a query parameter in the URL or localStorage (see next section).\r\n\r\n\r\n## Changing the log level\r\n\r\nChanging the log level can be done in two ways:\r\n 1. Programmatically, through the API\r\n 2. Via a startup parameter\r\n\r\n### Changing the log level via the API\r\nWe can set the global log level directly on the `ulog` function:\r\n\r\n```js\r\nimport ulog from 'ulog'\r\nulog.level = ulog.DEBUG\r\n```\r\n\r\nBut this is not recommended for most code! It is much better to set the\r\nlog level directly on a single module and leave the global settings alone.\r\n\r\nWe can set the level of a specific module in much the same way:\r\n```js\r\nimport ulog from 'ulog'\r\nconst log = ulog('my-module')\r\nlog.level = log.DEBUG\r\n```\r\n\r\nFor most code, it is best to treat `log.level` as if it was read-only,\r\nand rely upon the environment to set the log level, using the startup\r\nparameters described below.\r\n\r\n### Changing the log level via a startup parameter\r\nWe can set the initial global log level with a startup parameter. In \r\nNode we use an environment variable, whereas in the browser we use a \r\nquerystring parameter in the url or a key in localStorage.\r\n\r\n#### Environment variable\r\nSet the environment variable `LOG` to the desired log level.\r\n\r\n```sh\r\n$ LOG=info && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set LOG=INFO && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `log` to the querystring of the page:\r\n\r\n`http://www.example.com/?log=debug`\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n#### localStorage key\r\nAdd the key `log` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('log', 'info')\r\n```\r\nthen refresh the page.\r\n\r\nBoth the uppercase and lowercase names of the log levels work,\r\nas well as their numerical values.\r\n\r\n\r\n## Debug mode\r\n\r\nIn addition to setting the global log level and setting the log levels of\r\nindividual loggers, you can also enable debug mode for a group of loggers.\r\nWhen in debug mode, the logger's individual log level will only be used if\r\nit is set to TRACE. Otherwise it will be ignored and the module will behave\r\nas if its level was set to DEBUG.\r\n\r\n### Enabling debug mode via the API\r\nThe `ulog` function has 3 methods that allow us to control debug mode:\r\n* `ulog.enable(str)` - Enables debug mode for the loggers listed in `str`\r\n* `ulog.enabled(name)` - Tests whether the logger is currently in debug mode\r\n* `ulog.disable()` - Disables debug mode for all loggers\r\n\r\nThe `*` character may be used as a wildcard. Suppose for example your module has\r\nloggers named \"connect:bodyParser\", \"connect:compress\" and \"connect:session\".\r\nInstead of listing all three with `connect:bodyParser,connect:compress,connect:session`,\r\nyou may simply use `connect:*`.\r\n\r\nYou can also exclude specific loggers by prefixing them with a \"-\" character.\r\nFor example, `*,-connect:*` would include all debuggers except those\r\nstarting with \"connect:\".\r\n\r\n```js\r\n// given modules app, lib, connect:bodyParser, connect:compress and connect:session\r\nulog.enable('app,connect:*')\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // true\r\nulog.enable('app,connect:*,-connect:compress') // negation symbol means 'except'\r\nulog.enabled('app') // true\r\nulog.enabled('lib') // false\r\nulog.enabled('connect:compress') // false\r\nulog.disable()\r\nulog.enabled('app') // false\r\n```\r\n\r\n### Enabling debug mode via a startup parameter\r\nWe can enable debug mode for some loggers using a startup parameter. On Node\r\nwe use environment variables and on the browser we use querystring parameters\r\nor localStorage keys.\r\n\r\n#### Environment variable\r\nSet the environment variable `DEBUG` to the string with logger names:\r\n\r\n```sh\r\n$ DEBUG=my-module && node ./myapp.js\r\n```\r\nor, in Windows:\r\n```sh\r\n$ set DEBUG=my-module && node ./myapp.js\r\n```\r\n\r\n#### Querystring parameter\r\nAdd the parameter `debug` to the querystring of the page:\r\n\r\n`http://www.example.com/?`**`debug=my-module`**\r\n\r\n#### localStorage key\r\nAdd the key `debug` to the localStorage of the page:\r\n```js\r\nlocalStorage.setItem('debug', 'my-module')\r\n```\r\nthen refresh the page.\r\n\r\n\r\n## Using ulog as a replacement for debug\r\n\r\nIf you are using `ulog` as a replacement for `debug`, you may want to try the\r\nnew endpoint `ulog/debug` introduced in v2:\r\n\r\n```js\r\nimport ulog from 'ulog/debug'\r\nconst log = ulog('my-module')\r\nconst other = ulog('other-module')\r\nlog('Message')             // > '20:15  my-module           Message'\r\nother('Another message')   // > '20:15  other-module        Another message'\r\n```\r\n\r\nIt is not doing that much at the moment but I plan to make this a\r\ncompatibility endpoint for debug.\r\n\r\nYou can also use this as a Webpack alias, to make all modules that use `debug` \r\nswitch to `ulog/debug` instead. Compatibility is not guaranteed though so your\r\nmileage may vary:\r\n\r\n```js\r\n{\r\n    resolve: {\r\n        alias: {\r\n            'debug': 'ulog/debug'\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n\r\n## Using ulog as a polyfill\r\n\r\nulog supports all functions in the \r\n[NodeJS Console API](https://nodejs.org/api/console.html), so you should be \r\nable to use it as a polyfill in environments where there is no `console` \r\navailable (e.g. Nashorn):\r\n\r\n```js\r\n// assuming you already made sure there is a `global` object\r\nglobal.console = log;\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\nSince v2, the logger objects are functions and not objects, which may affect\r\ncode testing for the existence of the console like:\r\n\r\n```js\r\nif (typeof console == 'object') {\r\n\t// use the console\r\n}\r\n```\r\n\r\nSuch tests will fail as of v2. I am hoping to solve this with a dedicated \r\n`ulog/polyfill` endpoint, but have not yet got around to implementing it. \r\nIn the mean time you can use some `extend` function to create an object \r\nfrom a logger function:\r\n\r\n```js\r\n// assuming you have some `extend` function:\r\nglobal.console = extend({}, log)\r\nconsole.info('Nashorn can do logging to!');\r\n```\r\n\r\n\r\n## `assert` does not throw\r\n\r\nulog patches the [different behavior](https://github.com/jasnell/node/blob/master/doc/api/console.md#consoleassertvalue-message-args) \r\nof `console.assert` in Node compared to browsers. In ulog, `assert` behaves \r\njust like in the browsers and never throws.\r\n\r\n\r\n## Performance considerations\r\n\r\nThe logging methods on the `log` object that correspond to a log level which \r\nis higher than the currently set level, are replaced by no-op methods. As such,\r\nyou generally don't have to worry about the performance overhead of leaving \r\nthe log statements in the production code. There is one exception to this rule\r\nthough. If preparing the message itself is a costly operation, you may want to\r\nsurround the log code with an `if (log.level >= myLevel)` statement:\r\n\r\n```js\r\nif (log.level >= log.INFO) {\r\n\tvar message = doLotsOfWorkToGenerateLogMessage();\r\n\tlog.info(message);\r\n}\r\n```\r\n\r\n\r\n## Issues\r\n\r\nAdd an issue in the [issue tracker](https://github.com/download/ulog/issues)\r\nto let me know of any problems you find, or questions you may have.\r\n\r\n\r\n## Credits\r\n\r\nCredits go to:\r\n* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly \r\n  giving up the `ulog` namespace on NPM. Thanks Felix!\r\n* TJ Holowaychuk for creating [debug](https://github.com/visionmedia/debug), \r\n  which was a great inspiration for ulog.\r\n\r\n\r\n## Copyright\r\n\r\nCopyright 2018 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.\r\n\r\n\r\n## License\r\n\r\nLicensed under the [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/) Open Source license.\r\n","readmeFilename":"README.md","gitHead":"d91a29a91bdb6791eafa49272758702f54b314c0","_id":"ulog@2.0.0-beta.6","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-nmE3GinIEr2IDOJTdUrX4VsfkHywapAwO+NYwOQPNEqV6mpSGPTEHOdFI/NzFr5GGcVk9Ayj8pw8zlfboh0W0A==","shasum":"e8410635ba1f6eddc164ddf221cdc4355d10c95e","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.6.tgz","fileCount":26,"unpackedSize":164203,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcBURKCRA9TVsSAnZWagAAzhkP/3fAUESsTYkUtBcMGZv5\nIkIipI3VPaTSUR0iVYhg+HZ6dWjLbvhTRX6qNlPdaS9zdQwcAh9AXwAUaMte\nRBNEvoypOtbKPi1X2FAFdI5UI5t0LZnLa1DYYLBK9cMUksX/AghnOQBefO7x\nwya29Ux0eUZDOer6e51xER2f2x9UmpCu5FaQD2ikxeeHoILHwv+1bLEGQ7/j\nbKRVckVMvKu4pWc6GscCAT1g8C1ThDZMxu62xdhyqj2VqeEE/UWSg7DX//5Q\nmGmDkpwSTIPLUVM2PsKbT5nxUJlLbbNosGLAu2wXF5Y3bcEe+GUAp41N740m\nB1ViB0CK6hnEf63yb7mdAiJu6gUxS7NVS3v0y7/l/9UmRL/UfzkZ7+pMS6ei\nr4of0dh7PZJuwX0dGTdfrLd4u5YvtjlhQM40cnJ3I2yvC6rrCOAfJ4B1CNPm\n4gHfKVCoc7TW8YtYN5zPu00MZ9Vwk2coMxZ4asYCM1s7FJXt+oLMZNHSzgH6\n1k3/AYUCXH7I1a3INX6+z4gTMKUAq+sSgS5iDFjTE/boUvdSvrEX3sldNc2c\njNZi6RrotvUaLpuEe7BD4bRKpkYlrmuFeeR/4pLA1Dp+6FX1q5KcbASfydHr\nvAnryTo/6SajycqbBuPvTlbvvDeGLSd1fTRZkV3VvmqKtONBfdur4UTCtbwD\n+YSe\r\n=fIvi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICIMefnXDXsmg5/D0D82YKu5zhMDYjJU/jU/2lpRWlk+AiAtTYylaSfhSCCv4np3OUJ4RNpD4Rz/Bx+AdxSjH97+5A=="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.6_1543849033645_0.4800847314475496"},"_hasShrinkwrap":false},"2.0.0-beta.7":{"name":"ulog","version":"2.0.0-beta.7","description":"Microscopically small universal logging library","main":"node.js","unpkg":"ulog.min.js","browser":"browser.js","scripts":{"clean":"rimraf ulog.umd.js && rimraf ulog.min.js","build-umd":"node ./build/build-umd.js","build-min":"uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8","build-all":"npm run -S build-umd && npm run -S build-min","build":"cross-env NODE_ENV=production npm run -S build-all","release":"npm run -S clean && npm run -S build && npm run -S test","test":"mocha *.spec.js","dev":"webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888","debug":"webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888"},"keywords":["universal-components","microscopically small","small","tiny","universal","isomorphic","logging","logger","browser","node","nashorn","console","polyfill","1kB"],"author":{"name":"Stijn de Witt","email":"StijnDeWitt@hotmail.com","url":"http://StijnDeWitt.com"},"copyright":"Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.","license":"CC-BY-4.0","licenseUrl":"https://creativecommons.org/licenses/by/4.0/","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"http://github.com/download/ulog","devDependencies":{"chai":"^4.1.2","cross-env":"^5.1.3","mocha":"^4.0.1","mocha-loader":"^1.1.1","path":"^0.12.7","rimraf":"^2.6.2","sinon":"^7.1.1","uglify-js":"^3.4.9","webpack":"^4.26.1","webpack-cli":"^3.1.2","webpack-dev-server":"^3.1.10"},"dependencies":{},"gitHead":"423ce1c6dc1c8c2a2ecae13e6dbb99308e301eba","_id":"ulog@2.0.0-beta.7","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LvQY6j+CcIilySof66EMr8spdCBmsklAUmvqvCqjWAGiyY2f44MgUbLgGyT27YM35pj0lLZlkCnNn1CcmDGbhQ==","shasum":"760a234f64ddbfc689e93fe8754c81cd97960340","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.7.tgz","fileCount":25,"unpackedSize":162273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeaQPfCRA9TVsSAnZWagAAfdkP/0tnUu/P61mSjH1LXtMv\n8SRCL4x1LQSwe2X1YntxeGzpbMeyTRCYO2J+DVsYCy/fsP6Rn0iIZOB0f/yP\nkugPYeynEnNG9FVy7rAjBFp2nlqX3PQOL3drnVdX9iAxHmUciu6hEgjDGhKg\nibIl/p2tWm0pdni7eB7YUyp8X++jCR4GlYhx5037N8+ZPF03GVKMg1F07dUo\nxsHIVWCZhp/D08GvyyWcNFg0PP6Veeno2yys0gyTRKsU019R2gUBOECir0yW\ncC9FcUUyL+NTeDz9XbVgBNXmSs0Vd5Tf0FBxTs0p/xiSCTjHRO07vHDAnTHG\nstwMieJLsCmCFPTsdHT5J88K29cM3zlWhxIlFYMRe7KDMehcIZsFDtce4BGF\nDpotx4g52mCoVFwfHZ67GgYp3q3v5aL0Q9nfazgJo1PZqQaQsHbG4SBE3hiZ\nXfOoo83QwmMhUUlCtt3bjvLpQzWpkgJdpLSez1uG9s0Nczz360T4Z5VqAYhJ\nvKVvnh+mQGrta08Ys/6UWntYMsEi34f77wBO8YEkapBMHTZ189SmqgcI8/uC\nYbVoDAPIlZOd5NQF5hjSCwHiZEEiBlXHRnEqN9kqh+ThYXB1qAa9ACCdySEO\nzn6ipdUUDASn9s+m+enUvfpnUw55ciRdYomjrz2+tpSIPk3rbBnEAQJ2grbH\nH4gU\r\n=WpWI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcTTbHyZYLXlZJT5qtfHYenNKnam3tjSElOl35Gy/3ugIgO0lbzk9aCo9PeeTqmbyp5ot/uXlVytqMmBtfQjZb8UE="}]},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"StijnDeWitt@hotmail.com"}],"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.7_1583940574919_0.3580700448058083"},"_hasShrinkwrap":false},"2.0.0-beta.8":{"name":"ulog","version":"2.0.0-beta.8","description":"The universal logger","main":"./main.js","browser":{"./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/simple.js":"./mods/formats/simple.browser.js"},"unpkg":"ulog.min.js","scripts":{"build":"webpack --mode production --display-modules && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"author":"","license":"MIT","dependencies":{"anylogger":"^1.0.5","kurly":"^1.0.0"},"devDependencies":{"gzip-size":"^5.1.1","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.1","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.0.1","webpack":"^4.43.0","webpack-cli":"^3.3.12"},"peerDependencies":{"anylogger":"^1.0.5"},"gitHead":"36506de12aef1538535cbd6e3c4a8bce1d998e16","_id":"ulog@2.0.0-beta.8","_nodeVersion":"10.16.3","_npmVersion":"6.14.8","dist":{"integrity":"sha512-kUkp2fLtQnkpUlUCw05n7bgUbZIEdHxaBj/XqDoolkY8YJ8LPEBc+EcsH9F7qrNOUdoD7cFvqfXZ0wAHk4aG8g==","shasum":"901ae40488135223d7200e35515660251563deb9","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.8.tgz","fileCount":61,"unpackedSize":183602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfsCOKCRA9TVsSAnZWagAApOkP/1VjXhu7ohIvJHzCXbrS\n0OpebKA6Zxtqdmcs3AzPSvW+bEymKv19vQ6uC9VMftTadKZNaDpSuu6EgivO\nUqMNLcyI9HT9ss1zFbXBXwq4EGmAaDohQYAfbZJdJ29fWtSTd7IoMYgjo/SQ\nRgwyA0UPE/zGx7O+QieYAsu1zQtwrhP4sd1A6BiE4GC3f5/TfSNH36f4Ww+W\nsQGjgUhdUIAbUkZh7RMUi5byubnsLsALJSwvCcozQR7/hWDROR05TwMZkm0V\nLKAoWlbWjUakQK7yj6q9KThojEvgKB4t5zOzSUlbqoNAXxYk1lthMvV9293b\nKr4IheHzD9fPZpByKElHTwBjct2b9f39QHnPUJHv9aiNc187j/+FgPtqq7DN\nVbjfpimK81tQHLMs+wFAu8Mfq6INh61pOsmPFc5+r1PGs1clIkXthndUWUNh\n0HcMMrlFgYCEafqfIsLvi58wPC1DMGd/ueGLXluuXq59c73yghE5vYV2+T5m\nvTe4uGFqxRkSXazhfdzObwNOb6/IFNeJuHvNZlZ9YlLkMyogo9jEBJWjrRgm\nAQETZPGfePdIo/GgCPrsKsi61PANXGgkKfQERWTvJLvFBYThQ3WNennqnkxM\naav0CPXNODAp79O3iWItQlcxSQuRiQtPUt+6Ly9KQLb7ezerrV3V36o5mxvq\nEa/N\r\n=/1Rp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/FIBcpmSfuyicbJ75oG0qS+zk8Lsw80ND5oBSDbJkdQIhAMkm7Azu95N52Ac9eWuVZ9DdNQttnJcn51jdbo4J6VAu"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.8_1605378953866_0.16211845762571953"},"_hasShrinkwrap":false},"2.0.0-beta.9":{"name":"ulog","version":"2.0.0-beta.9","description":"The universal logger","main":"./ulog.js","browser":{"./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/simple.js":"./mods/formats/simple.browser.js"},"unpkg":"ulog.min.js","scripts":{"build":"webpack --mode production --display-modules && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"author":"","license":"MIT","dependencies":{"anylogger":"^1.0.5","kurly":"^1.0.0"},"devDependencies":{"gzip-size":"^5.1.1","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.1","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.0.1","webpack":"^4.43.0","webpack-cli":"^3.3.12"},"peerDependencies":{"anylogger":"^1.0.5"},"gitHead":"0a12658edc14e34cd3d76597ebb649ec7d6aab34","_id":"ulog@2.0.0-beta.9","_nodeVersion":"10.16.3","_npmVersion":"6.14.8","dist":{"integrity":"sha512-XmfLmRarQNayadKsUwHNVOYFkDhGxvx//ecDnpExr3ZKwJot/SDdHeUqbJ3HNW+84EF5nNq0ToDACCN2jW2aww==","shasum":"b7d0ef076530e880c51fc50ff977cdf066ff2294","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.9.tgz","fileCount":63,"unpackedSize":194849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfsSoOCRA9TVsSAnZWagAAb38P/36Orll/kfq7KU1L1PN2\njCgoE1b8pG6+yQiDIAglLxOVDUBGh/+/m/MiAZcyFVZJCqErDkbPyb0Pi+eF\n43ExwuCBbKLusgX4JmOYfM2F08wZ34Gilfngzrxe+LhFbTxxdxuge5QcJPu8\nxOJC8/5d2XpUThomJPOYbW9fQgPbfAK7NnXSUBN3hNx7WS6YJmaSykqFJO4d\nm33lYyi6t3c/jR/PLUEgRaqtdtupjimqGZkXNTtrEPPD6FVyqzHXFv3/WWKu\nl1wuRCpgHrZacjxZLQG2j1MsCsbuEyUzn/zIOVM3F+vh+aHK+Vl73qvjAufv\nkfNlwIv6V3eDGBhEvaI677mzzYbMsPITJZ2Prvz/Vr29qd58tG1J2l4AeaI/\ntOAHKU9QyrEVU3zV4o8k7tPX7EMEH0klD3Ym4+srByTwnVX5trhQRqeJdKcQ\nXo8WGEDtgsjSW3z8ACr2EhaIqIeokBwaS+C2VuDSmEZoTcLFOuK5InbxNbdA\nBK9lNVVLAwPxIcm0RY8UkTv0W0iSbfdqbl1Cla73VF88wmiilOZby08PHkcy\nFrT4Q4OxpULK0GZhD3EVYRIeIz7E+tvXMR2LjtDVth/spiEb3jUnCkWvLFab\nmvq/r9g/Mp5zm4/QcMXFHnNKycGfmjvDH9tWDpJpertA1t7u3Y8ka9G8T+lF\nEeyT\r\n=orA8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcbK2Mn2ZOYjlpiE5A+0VBxxoVs7sQnKHpeoT87GrtNQIhAJuOgwaGhF9fCZfHMhpcCJrfC96UxFGQOYS4be6W0CHE"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.9_1605446157821_0.5779420364644241"},"_hasShrinkwrap":false},"2.0.0-beta.10":{"name":"ulog","version":"2.0.0-beta.10","description":"The universal logger","main":"./ulog.js","browser":{"./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/simple.js":"./mods/formats/simple.browser.js"},"unpkg":"ulog.min.js","scripts":{"build":"webpack --mode production --display-modules && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"author":"","license":"MIT","dependencies":{"anylogger":"^1.0.9","kurly":"^1.0.0"},"devDependencies":{"gzip-size":"^5.1.1","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.1","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.0.1","webpack":"^4.43.0","webpack-cli":"^3.3.12"},"peerDependencies":{"anylogger":"^1.0.9"},"gitHead":"e112fd0b88385f3510daffc905c9aee69e2b1e39","_id":"ulog@2.0.0-beta.10","_nodeVersion":"10.16.3","_npmVersion":"6.14.9","dist":{"integrity":"sha512-rsF+CL8ORuSx6c8c2Ji2ZMAc0u6ahzMiPIMV0c0q4eRzaGiJb9ibE5h/03jrYE3fRM9rlNBSMudMoZPclx7L2w==","shasum":"bad3a2696540c29f3348970a280cd16bb514b447","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.10.tgz","fileCount":63,"unpackedSize":194252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfzg2cCRA9TVsSAnZWagAAsY4P/24pCbpvbSk4PVymFRXM\nHgUCHm2xJ/16/nOAkbxL9dE65iOAkOzON3ZurPY4X72RF2C2B1MirjNSjn4Q\nlfQRRGQTFOqkDIpw0jTxLWDLZDmSWbLZ1Hm/ZxzerKLlrBXVQuHp/jKxE9EN\nYwis0aLVnRhUftwEKHM0d/2fEHfH1YdE5jZOmSqNQZQaDVE4Priykfg9ePPY\nkPSyGPjagsFTnTUnhhlC/m86B0OU8WPswIiiJNDcfCupQb/NfeqkHGB3i/ya\nknRCueOSrYBqSrwcSV7aB64v9wqB6JCmB5YQvyjgfpcBpHPPPWJoRz45Ayj6\nJ5RHndv/EE5LyUrqJg9C0qqcFpJ4N7wv/UcL8OUVid17tOjSKpDfsTBkdC8b\n+23Pm7SNuEraMAhV5pfwmA0HBBQ0+7hJ6Ww6ExMgplmK31I73YcznPH8Ks/+\nMV8adVZhfn7U6AHMcYX8Ql0LLgrsOvgLTr6Opn1jTEk/447oop3+Vx6Oo/QY\nV+Wg3hT8ntSqUQc1f82UIhQXILWtyUfJfXxpOIZrsoMPTWViKgNkv2xqbckD\nL5UhRU5BpMH8806VxcbD44if6u71UkuEerc/fdB9zi/lduOuq1iIN3ARJcLe\neDXyQ7oXxotvyzXy3UTUP+mO0TgEgfKJLt5d6EcTRE3k/9R6QaKDNXIiAjvv\n+b7H\r\n=iICz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDHdIiPObgAaEtFhNEWvZ07datZ6096xjlCv5X6QwlSmAiEA8UDUW+ZBAhg7XLbx/s0I/AnadqK1qohpbDrUMshXS1Y="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.10_1607339419800_0.780577501265652"},"_hasShrinkwrap":false},"2.0.0-beta.11":{"name":"ulog","version":"2.0.0-beta.11","description":"The universal logger","main":"./ulog.js","browser":{"./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/simple.js":"./mods/formats/simple.browser.js"},"unpkg":"ulog.min.js","scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"author":"","license":"MIT","dependencies":{"anylogger":"^1.0.9","kurly":"^1.0.1"},"devDependencies":{"gzip-size":"^5.1.1","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.3","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.16.0","webpack-cli":"^4.4.0"},"peerDependencies":{"anylogger":"^1.0.9"},"gitHead":"31b23ad05fd1218285323a6affab2cd02bc792e3","_id":"ulog@2.0.0-beta.11","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-2KlC4Y0GEpzYnde9v/nip7XHqIyWZI9Pip8EiJ9W0IydAkTnRAlqwtr4Tt6MwIW7vcVKE9ZwetE2xxlOCbp6Ow==","shasum":"ca05eccf19e228a5d97b2835760211873d6fe046","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.11.tgz","fileCount":63,"unpackedSize":192174,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCsLyCRA9TVsSAnZWagAAQewP/0NjvXaMsXxQqQDSMxoi\nPP1bQnBECF3KkW9GB8MNSc4tZ3EI5QhrSSbfGPcyRaQZNYM0khvhiyNiP9mu\nHBoM4dKQawmM39o9aZoIC3GwsvJmhuS0rdEDfw79AIhf5J7gse18+Pc9doCZ\nalP813tdgetJBAxh89hWTuWcETjjWFWMGNyTdcTUcsIVAu6Eia79ajMWxIGj\nySJLAK7kgI+Y8w/PdEP2npYjD+DDuYoEUb1Eayw8iPCQM7XOP/T8t5gd1PSy\nnH32AZ9uFQHet7BrSTk3/nQ42EfBQb6wo9yp991GFbwT9NRWuW9hy7tEiFzv\nNPe2b9LdtcU4XNuXoO8l7Rv2lkYFCSid37hGT6+ptMFZipYv3UHO2K20oqyJ\nAilNH1H3j3mdcuTbqe9slUkWuOcVQaNuCORD408YzLXlcG37HrbbE1umdYMK\no01/L/1bOcLtkLpXVTU1QiSbAUnSlvVI9M7dHs9oP8L4H9iQV90QtoE+qbUo\nVcl072KGvQuJjlW5pisl5joF4BvsRk9XoH2jHJXT3EkeFF/2MPH3v+/7fTq9\nUZoajtys5n7QsKc7hCUr7jmcJZukuNl1KiHJCuBBtoh2E2V0Z3ZxV5kmv1Z1\n0/cp/m6+aEXJhYNTwz89J/K3nuI6l8UOuz0PHVS5gIhNKhOuYukrCU8NPGaN\n7TTj\r\n=fazi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEMlhrXe8NvEjNgadG+5Ezs2LvjO6b/YANo8TXNqbVvrAiEArWmTNEKjXnN/1nYgtlWOCwShqWU2CEsSLaMeljHozBI="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.11_1611318002080_0.6505081763324028"},"_hasShrinkwrap":false},"2.0.0-beta.12":{"name":"ulog","version":"2.0.0-beta.12","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["log","logging","console","debug","loglevel","anylogger","ulog"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"1e072ba3059f930f8c9843d9d3c5025d7f2d9106","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.12","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-AKvGLaIQruD28RE85GyK3Werd09eJJWpP5aPB/Xnq5IWUgLs+SpH36oBZMxoialw4YDbul7l1gA5b1bdqvfk3w==","shasum":"0445de9bb75ce03e3e26c9b4ac79b2cbb6a4fd93","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.12.tgz","fileCount":79,"unpackedSize":253289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgG18sCRA9TVsSAnZWagAAtSsP+gNMoooOTW7Q1u7A+SwH\nogeqL9Ab7WrOnQeLcHtuAatAluK6HyA939PHXdDSLG8f9UZoB/ExSv0y2kgU\ncRWRx84rZPSnJTgF1VyPfWhZYEJCZyuvbcQQBSj7tnt8ff/grHyIwPv5wvVt\nv6+HPDu4/32yMWV41Hl47Ih4XyPCzqg0L9dxNAS91wH9IuCZ5yGRN12l2NAt\nkKFCoExebmAVDfW1EhPPx2AJiHA1Xt/iexLZWSDluNp06pk4ukL415DvKqOX\nesChc7yoFwmcQiZny/SHomm1SlJwPOO91tcQA5If0fhy2assl6/QxG/CafQM\nZq6uihRu6FzZpMRxR9ihC8vsiceHR6VS0M5nQicU5c2IXe5K4/5oQOp0LRWn\npQBiQgyzCNoQseFTBpIcS/2/QcfZE/s6dw4A47ovNtfAqnNfWOeJkS/k12qy\noW9jcv4z84AdcG4aE9/c1F+dSdLsiBPh9W6qzYs1XlGtOBAbtTCVqmC3Nres\njcGDSdoMurzHRRmD75IgvDKyp0Osdqi6hNKyhejcJBB0v+BqlRc08juGRe2S\ncKj9uenP/UrZQPhWACu/ZSKcgMFxdTbTdXTdiNnMV9+fwcCVBaTCIfbWK61c\ns0+KrBoL9xTrnLyepp19ZrR0tlpJ7MIC47WKB4q12kptvb2Yv4tuMeboI3B8\nffzL\r\n=JCJM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAeZ32i3cBN6j6tcQyRBfn+LW2ECRRplcAGnfU6XydfVAiBC4p3WVBUt3SJ1hveIn/xj4sNP1HFuHkzaxoKqSM62wg=="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.12_1612406572088_0.15552523340104396"},"_hasShrinkwrap":false},"2.0.0-beta.13":{"name":"ulog","version":"2.0.0-beta.13","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["log","logging","console","debug","loglevel","anylogger","ulog"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"1bf186ecca8760a3961ec8b470b527de4ce57d65","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.13","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-nRtOO8WbxtfMluDmsIAwwP2he+BFHls0Jys95e+ZsArw+oFJcPegNk1B30ROLNfQZ9OFpi+jVbodfhz47d6O4Q==","shasum":"f9ea77237ac09a3ad12905b9c57367cd3c0cc235","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.13.tgz","fileCount":79,"unpackedSize":253292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgG2dZCRA9TVsSAnZWagAAd5EP/j6hVU5LswV4hSa6w3+S\n/dmvVSnCk1VKr5ZTtfGiJwVtcmHJn60jXEasQY6Mpqgt+JfbkPTQ7N5EgLT+\nsboIl4eGFeg6O3tfSyOWNqCVgTzHUsAx1zAjT+yn0Zf3t136hElZ1+xg1n5j\nLpfvqmaOU5OwD0+euvq+AMeKwYshgfu36X+p78LsS6AkRiIzI9j/2TcmNiVI\nKLpblJTOWr7r0VkoSUhDhWi5fFRk9vn/iFiKz1VcNDBTtdlsRRvHZEIWbiSP\ndregGyhzHFOsnoH6Q9gUFtTKo3yOUuSmS/l1lLCqdUWz8JA0OwwemKjKFyj8\no5u5gUTbdcKvp+fA+eyR+xjxFQqzUISQOolVBOSbDxmlZfxYO41km4V5+FvC\nnpnJ/r/txqOe9vOeTnkduF2awdIui3oHCWF8f3SSvEV8UiS04mTYnCTsRasa\nyIaWoFdtVwxFPRPaygRsq3LYQKxPp1sXGp5KhIvZaIsYF3M4RPIcz3nmVg8R\nL4jKSzim2kBnIV4eCLxvGiGiio6qijU7EfIIqago8qFZ0qChROTs/lyerqwI\nHNHC7K/SqZxHBirg7O8+rKIrnSJ5P38H9MgVLcdUsd7iF4ABJa59s30jWoyF\nrHV9E7fZ/McbYyETTgoHS9BIFRyFwE3BVorYWFIyADpD7mfZStlCyCY5Tu+o\n3B7M\r\n=O1Gi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBu8VBhi9JeMDODySis5xomY3x3Yx9mj7ljBL84XpUigIhAM0rRz8XxHJjd+MI63ojgav1KmEl1ZTCm/PMVjoJW7qD"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.13_1612408664936_0.436730375196134"},"_hasShrinkwrap":false},"2.0.0-beta.14":{"name":"ulog","version":"2.0.0-beta.14","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["log","logging","console","debug","loglevel","anylogger","ulog"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"1c0d7971e7d356aec8efd0f187525db85874385a","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.14","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-1pGrECCMhvBI3VBo+ducC0g8umxBUlQ+GcUCr9afiSV1SqC9sqKWkrdv5+vxwPuEFSVzJ9D97pmjCixyoyynfg==","shasum":"8ee7fb42934dade9bc46456ac9c1ef3ad03ebd83","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.14.tgz","fileCount":79,"unpackedSize":262009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHEmwCRA9TVsSAnZWagAAsLUP/2hfWMuTN4MD4NXCBWJN\nB2epKc6pY1qiYEXkVeeh4j64r4LefppZM7Y+SM12YWhHDtqZmksxNkhy5pzR\nPDp8rxSb5trxi6YKUFsk+SJXwBBY4Vw7OhcFFYSlTkuvvNnLZYT45PsdyjZf\n1ZDwhKrB8NMydDlqIJ50UTEqEFNPuyWHvFaQrJOefyrnvcEabe9Zt73d3gdH\nv0Ss/Fw9qH6looSg2dzzsAs1KoskdO8Say2IEYRlxOgKQx1EC7Lsvv7zkuWa\nwlEqAqd1fPP6i48/3A3eSt64hqyO5fFFY7jz/VoScJJamShu6YlVsgS5lE87\nNZUBoDV/0KLygM/Zxu9kYeccGfQMpzTSShnhVrtwPAK43PJWbct0YDTmuKrK\nxe2uCBUizUIVK6TqzTWjkDC8OlYgik0Izz54DZYtISriYWwCVGA7pgrY6Tu5\n6urpXicEbsc+65jKQOL6cALUurh0ShrtYBcz1Zgyq/m6uYGVOk7ClCkee53U\nDMrwSZ9+5LW7z5BFXk24ZIeE+bXftPiqT3qZNLerJ5T24D3ptICYtGot/kyA\nB6fKHn4P8ONAPhwfGiyGXXnkywrr/6kp4TXQ8Hg5fwjNZ594pCF+g+ItrElE\nT4jJn24eJrCCl/g2xhmSEvpzrEuhe6SIRD52ieYb4ZdN3Hq8Oz2MccmI37XD\nV097\r\n=H1pg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE0Ggigj3iGTpS6hnqY+3gXJEmFf+4wRtH7pF6w17Z6oAiAZsOpmjVpEak75X7WV9ap/Jt97u8KPoDEOv59p+sPF1A=="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.14_1612466608185_0.48648099187505944"},"_hasShrinkwrap":false},"2.0.0-beta.15":{"name":"ulog","version":"2.0.0-beta.15","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["log","logging","console","debug","loglevel","anylogger","ulog"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js test.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"1c0d7971e7d356aec8efd0f187525db85874385a","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.15","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-pjqXb2KwgRM6w3PvDMzQO4ImHc98ZQJNUGeMmaZkqLcklhmUwyuxsjVvaKrP+/+Cyv5qY6xw+W1BaAcD0bVkcg==","shasum":"59087f2d1ed732b86e7bb89fc78b370c152aedf9","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.15.tgz","fileCount":80,"unpackedSize":331297,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHE7oCRA9TVsSAnZWagAA0HQQAJYrVkqgCRBvj2pjRPyy\n5WKrP/6CexDVPoPHD8PYE9PDj5MlYTV/6vuXH1cwImc10N0eLUm64hGA1ppY\nvKeQySynapNS6bdro1EATfEWFZmBavBnj0d+a02qNI/Z4oFPSMgaSEzTejzS\nkki4W+e9q1VZEwi3prtLKoM2WkCthld2K9ZtdIB+JZpH2XofghhzIVum/jOo\nQ/z8RhswzXsey8YyZ8yOuekiE0YwgAawa8Wk9CrJ4DolQtXdEAcd8FpTYnrw\nRrbkBjOa+ceXVcYahy7qzfSBzMMbh5HlNArbOl6u/FUnkH1PxSRc/akzNSVX\n1u+Pw21En00+/UFyuFccKt/rvQ64n1FJDFLbujoT+0Z6f4NWvW/usV+hZt5Y\n15P8ky9VtkIyjU93EWFwCdxs3ITMeyuwkbI1vp3NUoa3CqVnRDF5wINh2phc\nAauRY6WIgXAeHrV5xQgxi8tkX2xzINAYB7oxU9OfkhsMYQXU9MJzwzTbuvBq\nqJ5XUh1065A8YK+FFcBalyvQvGMV0kiRJiIRXYvrGtCa5vBUt6NDHQuhLzVt\nPlrG06/kqXic1hfATifIJyZroK8S/lS41xCeBWD5p1ZFn4JVC9zVSb4HQMiN\nOVlmFoj7B4GzPreYtbnAzMiPPwajHibnZQw0tJrNl4UowmXojAArpZ6iinuh\nzqRg\r\n=TKH5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjZD1UmO+ms8UjOQgocqeuRUcYB0n0YoPynkv27qkI5AIhAKzTOY0xFe5fuPjIyNo2qu56121FyqfUGQVv5kWXuMmT"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.15_1612467944234_0.0006807182039696436"},"_hasShrinkwrap":false},"2.0.0-beta.16":{"name":"ulog","version":"2.0.0-beta.16","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js ulog.lazy.min.js full.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.21.2","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"f52ed9e14b6101a4813e7348b1766a3d7cffb222","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.16","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-6uaGN/b4j2E8evTeQIL5HUHTrpcUwU2Gq1G9LTjLiHbaO+rOIaDEoe9vXfxC0iH7WFBtIeyil9cwcgj1jdGtrA==","shasum":"8de4ba8c786b18856659083e067a635188eee9ca","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.16.tgz","fileCount":81,"unpackedSize":330825,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKAe0CRA9TVsSAnZWagAAAQEQAJJL8kglKkU9DobVrhhw\nqPkirprrFgmhSUiriWWxuJM8ZiAVBTaJd7A3lmE8woELO0Ow/bDy+lzAyMve\nvYb/f6rKlG5Tq1U38te9F8xTyrXui41uQzNY3Sc8Ef3iJwm+R/3JevigvYMf\nAY69wT58xRwvQLoEkr4VJFfbaTJej3LOH8zTe/D3uhx9kHHLgykPvqPtZaUE\nliTmT5JgnAYKR3VQzGjDnLrjoSXO5cPyUmhT7DIzW0gRsGaHBw8vpTOUr/xR\nFKVDPjy5bN4BtD9hX19Egy0Ws/CEkl5xkCHEH/eXM+6xyuWJGyN8N4MT3EUq\nNTOwCO6OxN8kO/VwlIkJ3gyNytPhDI0tHcxloEMDyv+ARte1yAI8/JPmVur8\nxQjLkneP6HVD+xf8xtOxT7kuwJj0lVZFrKD7ZBA4hccC1wHRsnxVYgyNrzfZ\niVtwf5QazBghY4IxJdhssBfOMrpb9lAS6qiUKaAtWboSAZzvNJpThGcdcSHH\ng8MDp3rgVQudILsQxKDkEF17PFaCm6Xk1B3V7t5Sin+L9sUuaSaOFIHY+RSg\nUzNy3KtKsb/HW91NJzlg7Zh2eCW15GPSJVeEqCZ44goX2XV6jxsqD6Wjl044\nIjbeH/j5l7OtPppdBH3/21bYr+EXD4WcbDCspCYnNaIOR7pT2wagXgX8y9H5\nK4hM\r\n=r/0/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWs4LX5LOaKlukFASpFyD0UpC38MOdv7afqYSCX2EFDwIhAKKYlIDuwqQxMjwY0qumpb2hf6WDk+VyI7gNFQhQ5Huo"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.16_1613236147598_0.5095599792061272"},"_hasShrinkwrap":false},"2.0.0-beta.17":{"name":"ulog","version":"2.0.0-beta.17","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js ulog.lazy.min.js full.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.2"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.21.2","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"f52ed9e14b6101a4813e7348b1766a3d7cffb222","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.17","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-iDcCzukrc6nvsGeFyq4I/CfgTQBwiKpeRnQaXe/O7UQonoRE7ZGtC8n4LBEEP4pPvNmZW0HJ16lsJ7eG9S9FLA==","shasum":"1336c73d912634d9315cd64a3d6a1a0031f0008f","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.17.tgz","fileCount":81,"unpackedSize":331420,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKF4cCRA9TVsSAnZWagAA5sUP/3BgUux+Ceg5Tputd/im\nQYaXaeqvxueSnaJg4RqQ2rVVG1fbn7XtagJwNdFDMYyqmLD8lfMXOux8cEx4\nxVEjU195aUTAzb9YQO4SCywgJ8Mcy+/2QWXL9vM2BezyDdi+hwVR4RgqJ3+l\ncUrOaI1pNXmKpxqyhjKaBhKzj4ZBwb4v1Ii8VZW265Zi4bPNwIpK7SdHkks+\nClive+rOiCpIfOavwirFxufQqsc4St0fTKmXwRCJ1t1VdrSfkzWGtObK0fsm\no7+OecawfnfodIk5sEdaXo7gPZ9Ngbu2M6vgPTdwjG5BHyq9tGLjvlSMA7LI\n2MzcHLYDeVLBiKu0XlpCJSep99PPycmM2Wfepq2h1zctNfdgxgeB4+HgXFc5\nYdE8M9PWs3xyytUoGhcCNmcWj30jNcoehVlq5riVjZt24clSN+oTuWijLY6Y\n8VwuBpyQ/+0UTro1C8Ppj1FJuhCrSEjCmvMQk83vW1nA1UJ9Iw2GqOArvdnJ\nUUH2EMdAc7dVJve5BoU8KhKSfb+1Tsa9OUVgHxpLbEF3jQ4o9cN0vhMA0yWQ\nDQNUHcpCclVxes4b6EdlbjrR8Whfzm8DmE8qfYPJidL3HVihCs1Tuam8sY2S\nY1Ij2798IjFj2ExqU9/4IPFJFYy/rVrvMQDBoyHTcth4fX4T66Uxu/veATSS\ntu4U\r\n=40Qt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnBs92arKglqiewWVKArrlF5PvC/VpvR70tKmXvpANBwIhAOqMIJMuJ3c4rkqwPJPATyQA3FBKJuFs82V5M0IfA8Lt"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.17_1613258267381_0.007061921150007366"},"_hasShrinkwrap":false},"2.0.0-beta.18":{"name":"ulog","version":"2.0.0-beta.18","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js","./mods/formats/utils.js":"./mods/formats/utils.browser.js"},"keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js ulog.lazy.min.js full.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.10","kurly":"^2.0.0-beta.3"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.2.4","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.1.1","webpack":"^5.21.2","webpack-cli":"^4.5.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"2aa34192c1804a143eaf0931fc196c712549a8f0","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.18","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-VDu/VBOAJxUr2+WBrNdSWSFc9TzjUppf5hNVTYkW3hf23oEWMYftS0w2cImoH6tKnhBvzCy/z6ZNgorPYyfnWA==","shasum":"ef4f51879047d312e71f4e38a1bd05ceef8ff020","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.18.tgz","fileCount":81,"unpackedSize":331420,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKVxoCRA9TVsSAnZWagAAex4P/AtIdWu4IRpiaLlggFmP\nYAbHcoDtqGyIiWkt8c7hKoPqarILo8q9G4cQG3QITysQdxhHrle4SCfWPtUy\nnUkSVTpsesjZnMBD11ZPz0zJv5qtzBWFD2zYxiHtyaGuXesvtO2hVwCp0lTX\nsGi4QZ0GfJjULNg/mg+iLHXWLcHLlwO/xNMeBAj/ZSqXMmrDll8kSMZbpk+T\nXbS/10P2zb6E9SN3tM0CAHyVArsT5YmsjWHchO6EMw/oF8Oxk05tgg5GMHB2\nPWkBBJwOWedFb2tyO6AG1+Drl/Bra0tzitGmFXtHde4+9mUDwuzqUVMXzyHB\nu/lzyqS7sgrftOFotPUd+LSvwJggYpfEW/X2xoJ9rTiCCY4W76/nM078dMag\n0j3bUssVn2D+OWPkFUmI9DdTeIV0MfhnSnyv+o4gyCdNWSuLLICnIYJBljoJ\nbC2AxlOZvpQuXC+b3EfRRBftoP6KwrYtDh46kZ/cowFrjKceuw2wzOpSTZYF\nXRE+9hQbT/22p6qLavM3M99bhAIhWg7Mom04slLwXc2F4TiFkTuesKGisoAz\n8P46O/X3sCfvg9Js53EwNnSfRD3tXfu9aOk4HhiaRSWwzeChhrafw/Ut0Z0X\n+sxlot9jaOwFenkHQViyrpp9hAt8zmfTvgVkl3FJk8lRc7aMGths0urwuJXn\nfAp8\r\n=qrUy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA7AhUCN4wwNXjxdXt3g1wBiN4AIf8STqaap1PMQEV/PAiEA5PoMXNdvKg90vP5K0R1Hi/tAGhJRjaI6OHbYuFFg2IM="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.18_1613323368060_0.2906719423082935"},"_hasShrinkwrap":false},"2.0.0-beta.19":{"name":"ulog","version":"2.0.0-beta.19","description":"The universal logger","main":"./ulog.js","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"browser":{"./mods/align/utils.js":"./mods/align/utils.browser.js","./mods/colors/utils.js":"./mods/colors/utils.browser.js","./mods/config/args.js":"./mods/config/args.browser.js","./mods/config/env.js":"./mods/config/env.browser.js","./mods/config/read.js":"./mods/config/read.browser.js","./mods/config/watch.js":"./mods/config/watch.browser.js","./mods/levels/default.js":"./mods/levels/default.browser.js","./mods/formats/aligned.js":"./mods/formats/aligned.browser.js","./mods/formats/default.js":"./mods/formats/default.browser.js"},"keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"scripts":{"build":"webpack --mode production && node ./build.js","clean":"rimraf ulog.min.js ulog.lazy.min.js full.min.js","test":"nyc tape test.js 2>&1 | tap-nirvana","prepare":"npm run test -S && npm run clean -S && npm run build -S"},"dependencies":{"anylogger":"^1.0.11","kurly":"^2.0.0-beta.3"},"devDependencies":{"gzip-size":"^6.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^11.1.2","tap-nirvana":"^1.1.0","tap-spec":"^5.0.0","tape":"^5.3.1","webpack":"^5.52.1","webpack-cli":"^4.8.0"},"peerDependencies":{"anylogger":"^1.0.10"},"gitHead":"d52630b4af31654e96e79d65d059b9d3facfefc1","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_id":"ulog@2.0.0-beta.19","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-27YIp4dUwaJQTh7ovk60wWjBMVV/AXMZhSVftkU7HMjaPc1t8wO5u6hVVUyBTyGKrLxYmR0v34Iihq8mE26LUg==","shasum":"0296f61498028f7eabf7b07c9b44cb30f6e16eba","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.19.tgz","fileCount":79,"unpackedSize":329749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQPBVCRA9TVsSAnZWagAAVJIP/1NNkLZsOsG6xdSfkb5r\n/oIkyF2Sm73FHOb299d6TAvXP54j0C3crgb/MiVhn4KnQnqrAsim6+aauEaj\nLbZJ1yFE7/SHMZz3X1YH1R5CKYOmrZDZKHV6lyypI9kbBMIYit4tt0gWxMc3\nSWAdKDNE1BS7g/r7tD1Fe6SJRo8jaVIcBHdX90n7pKlOVGa08gfKdZmH0bxa\nPAvLaVu+IgeEvdMn0yWHJdASD46SaduwW/5ccAJlx+hcZ7+rTd4apPgTgzOh\nqTtrFBSbCrD/BFv0JfTFRoOs3Nx2BeGM2PlG4GKq+ymEUCOsAlLf0lPvcYk0\nTvSQshPci4skNJF4utw44o3sTfxCi/knXMUzUPzFjzbFe70au7W5w+pHVx+Y\nd3Xta8rq8lRvdKn0WeM9AleP61dRfMsRz8IjYjNJ/5OHhuh5+Ux+P/VMK6WI\nmmvgYl88IRpL79olSf7+pfzEd+ZMu3lc7i3L2WAt1vlI4TtIBDBQaco5vPib\nkaHPDA3Pw4Tb7YAbQ6cJNwzuOm5BIu1+uItSQxCF4AhxAP3nDCM15u0Hzyx6\neYnn+NFTp2gWiq044Y1KiGjcPdsN9AG2ERd8FqnvK0aqB330geAt2r5/9Fd6\n3B3p5Yu9qR8YQv9nUFBWYtJ7jicCQCzU0sM9cG3BVFd2/OLOOkLdJ4zB4ZSO\nMcZ/\r\n=u3uM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAmqBr5maNd3dz08yV8+/Z/zYmCJlCWDVHvd27JbT69RAiA1pgBD2onqeOUA4V6Czv53QFXw8s6G+x4GoeS0naI0qA=="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.19_1631645780998_0.8682481237202593"},"_hasShrinkwrap":false},"2.0.0-beta.20":{"name":"ulog","version":"2.0.0-beta.20","description":"The universal logger","type":"module","exports":{".":{"import":"./ulog.js","require":"./ulog.cjs"},"./adapter":{"import":"./adapter/adapter.js","require":"./adapter/adapter.cjs"},"./core":{"import":"./core/core.js","require":"./core/core.cjs"},"./mods/cfg":{"import":"./mods/cfg/cfg.js","require":"./mods/cfg/cfg.cjs"},"./mods/cfg/env":{"import":"./mods/cfg/env.js","require":"./mods/cfg/env.cjs"},"./mods/lvl":{"import":"./mods/lvl/lvl.js","require":"./mods/lvl/lvl.cjs"},"./mods/lvl/outputs/drain":{"import":"./mods/lvl/outputs/drain.js","require":"./mods/lvl/outputs/drain.cjs"},"./mods/lvl/outputs/noop":{"import":"./mods/lvl/outputs/noop.js","require":"./mods/lvl/outputs/noop.cjs"},"./mods/fmt":{"import":"./mods/fmt/fmt.js","require":"./mods/fmt/fmt.cjs"},"./mods/fmt/formats/cr":{"import":"./mods/fmt/formats/cr.js","require":"./mods/fmt/formats/cr.cjs"},"./mods/fmt/formats/date":{"import":"./mods/fmt/formats/date.js","require":"./mods/fmt/formats/date.cjs"},"./mods/fmt/formats/lvl":{"import":"./mods/fmt/formats/lvl.js","require":"./mods/fmt/formats/lvl.cjs"},"./mods/fmt/formats/message":{"import":"./mods/fmt/formats/message.js","require":"./mods/fmt/formats/message.cjs"},"./mods/fmt/formats/name":{"import":"./mods/fmt/formats/name.js","require":"./mods/fmt/formats/name.cjs"},"./mods/fmt/formats/perf":{"import":"./mods/fmt/formats/perf.js","require":"./mods/fmt/formats/perf.cjs"},"./mods/fmt/formats/time":{"import":"./mods/fmt/formats/time.js","require":"./mods/fmt/formats/time.cjs"},"./mods/fmt/formats/wildcard":{"import":"./mods/fmt/formats/wildcard.js","require":"./mods/fmt/formats/wildcard.cjs"}},"browser":{"./mods/cfg/env.js":"./mods/cfg/env.browser.js","./mods/cfg/env.cjs":"./mods/cfg/env.browser.cjs","./mods/fmt/align/utils.js":"./mods/fmt/align/utils.browser.js","./mods/fmt/align/utils.cjs":"./mods/fmt/align/utils.browser.cjs","./mods/fmt/color/utils.js":"./mods/fmt/color/utils.browser.js","./mods/fmt/color/utils.cjs":"./mods/fmt/color/utils.browser.cjs","./mods/fmt/default-cfg.js":"./mods/fmt/default-cfg.browser.js","./mods/fmt/default-cfg.cjs":"./mods/fmt/default-cfg.browser.cjs","./mods/lvl/default-cfg.js":"./mods/lvl/default-cfg.browser.js","./mods/lvl/default-cfg.cjs":"./mods/lvl/default-cfg.browser.cjs"},"src":"./ulog.ts","main":"./ulog.js","cjs":"./ulog.cjs","unpkg":"ulog.min.js","author":{"name":"Stijn de Witt"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"scripts":{"build":"tsc && npm run package && webpack --mode production && node ./build.js","clean":"npm run clean:adapter -s && npm run clean:core -s && npm run clean:merge -s && npm run clean:mods -s && npm run clean:root -s","clean:adapter":"rimraf --glob adapter/**/*.d.ts adapter/**/*.d.ts.map adapter/**/*.js.map adapter/**/*.js  adapter/**/*.cjs","clean:core":"rimraf --glob core/**/*.d.ts core/**/*.d.ts.map core/**/*.js.map core/**/*.js core/**/*.cjs","clean:merge":"rimraf --glob merge/**/*.d.ts merge/**/*.d.ts.map merge/**/*.js.map merge/**/*.js merge/**/*.cjs","clean:mods":"rimraf --glob mods/**/*.d.ts mods/**/*.d.ts.map mods/**/*.js.map mods/**/*.js mods/**/*.cjs","clean:root":"rimraf *.d.ts *.d.ts.map *.js.map *.min.js *.bundle.js test.js ulog.js ulog.cjs","package":"cross-env NODE_ENV=production rollup -c","prepare-":"npm run test -S && npm run clean -S && npm run build -S","test":"nyc tape test.js"},"dependencies":{"kurly":"^2.0.0-beta.3","uqs":"^1.0.0"},"devDependencies":{"@types/sinon":"^17.0.3","@types/tape":"^5.6.4","anylogger":"^1.1.0-beta.5","cross-env":"^7.0.3","gzip-size":"^7.0.0","nyc":"^15.1.0","rimraf":"^5.0.5","rollup":"^4.12.0","sinon":"^17.0.1","tape":"^5.7.5","tsx":"^4.7.1","typescript":"^5.3.3","webpack":"^5.90.3","webpack-cli":"^5.1.4"},"peerDependencies":{"anylogger":"1.x || >=1.1.0-beta || >=1.2.0-beta || >=1.3.0-beta || >=1.4.0-beta || >=1.5.0-beta || >=1.6.0-beta || >=1.7.0-beta || >=1.8.0-beta || >=1.9.0-beta"},"_id":"ulog@2.0.0-beta.20","readme":"# ulog <sub><sup>v2.0.0-beta.20</sup></sub>\n### The Universal Logger\n\n[![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog)\n[![license](https://img.shields.io/npm/l/ulog.svg)](https://opensource.org/licenses/MIT)\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\n\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\n\n![logo](https://unpkg.com/ulog@2.0.0-beta.20/ulog.png)\n\n\n## The logger for javascript applications\n\n`ulog` is *the* logger for Javascript applications. It's universal, meaning it\nruns everywhere. You can use `ulog` in your Express server application running\non Node JS just as well as in your React single page application running in the\nbrowser. It just works.\n\n![screenshot](https://unpkg.com/ulog@2.0.0-beta.20/screenshot.jpg)\n\n\n## Features\n\nUlog marries the feature sets from [`debug`](https://npmjs.com/package/debug)\nand [`loglevel`](https://npmjs.com/package/loglevel) and adds some of it's own!\n\n| Feature                                     |  debug  | loglevel |   ulog  |\n| ------------------------------------------- | ------- | -------- | ------- |\n| [Footprint](#footprint)                     |  3.2 kB |  1.4 kB  |  2.7 kB |\n| [Debug mode](#debug-mode)                   |   ✓     |   ✓ (1)  |    ✓    |\n| [Levels](#levels)                           |         |   ✓      |    ✓    |\n| [Configurable](#configure)                  |   ✓     |   ✓ (2)  |    ✓    |\n| [Outputs](#outputs)                         |         |          |    ✓    |\n| [Custom outputs](#custom-outputs)           |         |          |    ✓    |\n| [Formatting](#formatting)                   |   ✓     |          |    ✓    |\n| [Preserves callstack](#preserves-callstack) |         |   ✓      |    ✓    |\n| [Configurable format](#configurable-format) |         |          |    ✓    |\n| [Custom formats](#custom-formats)           |         |          |    ✓    |\n| [Colors](#colors)                           |   ✓     |          |    ✓    |\n| [Alignment](#alignment)                     |         |          |    ✓    |\n| [Add-ons / Mods](#mods)                     |         |   ✓      |    ✓    |\n| [Lazy loading](#lazy-loading)               |         |          |    ✓    |\n| [Anylogger support](#anylogger-support)     |   ✓ (3) |   ✓ (3)  |    ✓    |\n\n1. emulated with levels\n2. in browser only\n3. via an adapter\n\n## Try it\n\nHave a look at the interactive\n<a href=\"https://ulog.js.org/tutorial/index.html\">tutorial</a>. It's the\nfastest way to get a quick taste of `ulog`.\n\n\n## Install\n\nIn application projects, use:\n\n```sh\nnpm i -S anylogger ulog\n```\n\nFor libraries, see the instructions [for libraries](#the-logger-for-libraries).\n\n### Add to entry point\nIn the entry point of your application import `anylogger` and `ulog` and use\nthe *adapter* to make sure anylogger is using `ulog`:\n\n*index.js*\n```js\nimport adapter from 'ulog/adapter'\nimport anylogger from 'anylogger'\nimport ulog from 'ulog'\nadapter(anylogger, ulog)\n```\n\n> You only need to do this in the entry point of your application\n\n## Use\n\nIn your code, import `anylogger` and use it to create loggers and do logging:\n\n```js\nimport anylogger from 'anylogger'\nconst log = anylogger('my-app')\nlog('Logging is easy!')\n```\n\nThis way, your code is decoupled from `ulog` and if you ever want to switch to\nanother logging library, you will be able to do so without having to change any\nof that code.\n\n##### Anylogger support\n> [`anylogger`](https://npmjs.com/package/anylogger) is a logging facade that\n> allows code to use logging without getting coupled to a specific logging\n> system. You can use that code with any logging system out there. `ulog` has\n> anylogger support built in. For other loggers, adapters are available.\n\n\n## The logger for libraries\n\n`ulog` is *the* logger for libraries!\n\nIf you are building a library to be published on NPM, you should use only the\n`anylogger` API, making sure your library will work with the most popular\nlogging libraries out there.\n\nYou then install `ulog` as a development dependency so your library remains\n*decoupled* from `ulog`. This way you get `ulog`s features, without forcing\nthe client of your library to use it.\n\n### Install ulog as a dev dependency\n\nInstall `anylogger` and `ulog` as dev dependencies:\n\n```sh\nnpm install --save-dev anylogger ulog\n```\n\nAdd `anylogger` to `peerDependencies`:\n\n```json\n  \"peerDependencies\": {\n    \"anylogger\": \"1.x || >=1.1.0-beta || >=1.2.0-beta || >=1.3.0-beta || >=1.4.0-beta || >=1.5.0-beta || >=1.6.0-beta || >=1.7.0-beta || >=1.8.0-beta || >=1.9.0-beta\"\n  },\n```\n\n> Listing the betas makes your library compatible with any future beta releases\n> of anylogger as well. This is a quirk in how NPM handles beta ranges. If you\n> don't like the long list, you can just use `\"1.x\"`\n\nBy adding `anylogger` as a peer dependency, you ensure that it will be\ninstalled in the client project and that your library will use the anylogger\nthat comes with the project in stead of bundling it with your library.\n\nIn our tests:\n\n*test.js*\n```js\nimport adapter from 'ulog/adapter'\nimport anylogger from 'anylogger'\nimport ulog from `ulog`\nadapter(anylogger, ulog)\n// ..\nconst log = anylogger('my:logger')\nlog.info('Ulog is easy!')\n```\n\nIn our library code:\n\n*my-lib.js*\n```js\nimport anylogger\nconst log = anylogger('my-lib')\nlog('Logging is easy')\n```\n\nNote how in the library code we never import `ulog`, thus remaining decoupled.\n\n\n## Script tag\n\nIf you want, you can import `ulog` with a script tag:\n\n```html\n<script src=\"https://unpkg.com/anylogger@1.1.0-beta.5/anylogger.min.js\"></script>\n<script src=\"https://unpkg.com/ulog@2.0.0-beta.20/ulog.min.js\"></script>\n<!-- any other scripts using anylogger will also start to use ulog :) -->\n<script src=\"myscript.js\"></script>\n```\n*myscript.js*\n```js\nvar log = anylogger('my-module')\nlog('Logging is easy!')\n```\n\n## Download\n\nIf you want the minified file for the browser to include in your project\nyourself, you can download it from here.\n\n* [ulog.min.js](https://unpkg.com/ulog@2.0.0-beta.20/ulog.min.js)\n  (~1.8kB minified and gzipped)\n* [ulog.lazy.min.js](https://unpkg.com/ulog@2.0.0-beta.20/ulog.lazy.min.js)\n  (~4.1kB minified and gzipped)\n\n> `ulog.min.js` lazy loads `ulog.lazy.min.js` on demand, so make sure to\n> include both files in your download\n\n* [full.min.js](https://unpkg.com/ulog@2.0.0-beta.20/full.min.js)\n  (~4.0kB minified and gzipped)\n\n> Full bundle, no lazy loading\n\nI recommend to use a bundler instead. Loading lots of script tags is\ninefficient and hard to manage. Also see the section on\n[lazy loading with webpack](#lazy-loading-with-webpack)\n\n\n## Why `ulog`\n\nThe two most popular logging libraries on NPM at the moment are [`debug`](https://npmjs.com/package/debug) and [`loglevel`](https://npmjs.com/package/loglevel). They are both great loggers, but neither of them completely satisfied my requirements for a logging library.\n\n`debug` allows for namespaced debug logging, where each logger has a name.\nWhether these loggers output debug logging is configurable via an environment\nvariable. It's simplicity makes `debug` an excellent choice for debug logging\n(as it's name implies), but it lacks support for log levels, so if you want to\nlog error messages for example, you end up needing another library for that. It\noffers nicely formatted (and even colored!) log messages, but because of that\nmangles the call stack, which is a huge downside in the browser imho. It's not\nvery extensible, basically being a monolith.\n\n`loglevel` also supports namespaced logging and it does offer log levels. It's\nconfigurable via localStorage but not via environment variables. By default, it\nleaves your call stack alone, making the filename/line number entries in the\nbrowser console that much more useful. It does not offer alternative log\ndestinations or formatters out of the box, but it can be extended via plugins\nand there are some good plugins out there. It weighs only 1.4kB.\n\nBoth these loggers lack the ability to configure the logger from the\nquerystring, which I found to be a very desirable feature for web development\nas it allows you to create a URL that has the log config embedded, which you\ncan then send to other developers or users etc.\nE.g: `https://example.com/page?log=debug`.\n\nWhat I want is a logging library that combines the best aspects of both these\nloggers and adds the features that I miss in both. `ulog` is my attempt at\nbuilding this library. It's base API is compatible with that of `debug` and\n`loglevel` and with the console, making it a drop-in replacement for all of\nthese in many cases. It has a configuration mechanism that is compatible with\nthat of `debug`, but that is more powerful and flexible. It accepts\nconfiguration from the querystring allowing you to craft URLs with log config\nembedded in it. It has powerful, configurable formatting included by default\nand it does this without mangling the call stack, so the filename/line number\nentries in the browser console remain unharmed. You can specify where the log\noutput should go and where it should drain. It's completely modular, so you can\nnot only easily add features through 'mods', but you can actually even drop\nfeatures you don't need by not loading the mods those features are in. It has\nnative `anylogger` support, decoupling the client code from the logger. And it\nsupports lazy loading so we can get all those great features without bloating\nour bundle.\n\nI hope you will give `ulog` a try. If you have feedback on it, or found\nan issue, please let me know on the\n[issue tracker](https://github.com/download/ulog/issues).\n\n\n## API\n\n`ulog` is very natural to use:\n\n```js\nimport anylogger from 'anylogger'\nconst log = anylogger('my-module')\nlog('A log message')\nlog('info', 'An info message')\nlog('warn', 'A warning message')\nlog.info('Starting...')\nlog.log('Yeah!')\nlog.error('Something went wrong', new Error('Oh no!'))\nif (log.enabledFor('warn')) {\n  log.warn(expensiveArguments())\n}\n```\n> Note that in the code above, we import `anylogger` and not `ulog`. This way\n> the client code is decoupled from the logger.\n\n`ulog` inherits it's API from `anylogger`. If you are able to restrict yourself\nto the [Anylogger API](https://www.npmjs.com/package/anylogger#anylogger-api),\nyour code will work with any supported logging library.\n\nNote that any logging code written for either `debug`, `loglevel` or the\nconsole should be able to do it's logging just like it did before, but now\nusing a `ulog` logger instead. This backward compatibility should make\nmigrating from any of these to `ulog` very easy. And because this is just the\n`anylogger` API, you should even be able to migrate back to `debug` or\n`loglevel` without any changes at all, by just including the right adapter\nin your entry point. Of course once you get used to `ulog`, you will never\nwant to go back! :p\n\n\n## Levels\n\n`anylogger` defines 6 logging levels, which correspond with the natively\navailable logging functions on the console:\n\n```js\nanylogger.levels = {\n  error: 1,\n  warn: 2,\n  info: 3,\n  log: 4,\n  debug: 5,\n  trace: 6,\n}\n```\n\n### `log.enabledFor`\n\n`anylogger` defines `log.enabledFor` and `ulog` implements it by checking the\nlogger's current log level and whether it's in debug mode. Normally, you should\nnot have to use this method, unless you are doing some expensive calculations\nonly to write log output. In such a case you can write:\n\n```js\nimport anylogger from 'anylogger'\nconst log = anylogger('my-app')\nif (log.enabledFor('info')) {\n  log.info(calculateResults())\n}\n```\n\n### `log.level`\n\n`ulog` adds a property `level` to each logger that is a numeric representation\nof the current log level.\n\n```js\nif (log.level >= anylogger.levels.info) {\n\tlog.info('This message will be logged')\n}\n```\n\n> To check the log level, `enabledFor` is preferred over the `level` property\n> as it is within the `anylogger` API.\n\nAlso see the section on [configuring ulog](#configure).\n\n### Default log level\n\nI've found that it makes sense to have different default log levels in the\nbrowser and in Node. In Node, logging is often the only UI we have available\nand we (the devs/admins) are the only ones that will see that logging.\nIn the browser, we have an alternative UI (the webpage itself), so\nlogging will be less useful for normal users.\n\n#### In Node\nIn Node, the log level defaults to `info`. This allows you to use\n`info`, `warn` and `error` when informing the user of stuff that happened.\n\n#### In the browser\nIn the browser the log level defaults to `warn`. This means `info`\nmessages will be excluded, but for most users these messages won't be\nrelevant anyway.\n\n> Attention! Chromium-based browsers have their own level filter and by\n> default, debug messages are filtered away.\n\n\n## Footprint\n\nWhen we support logging with some logging library, we add code to our\napplication that many users don't actually need. There are techniques to remove\nthis code from our production builds, but they sacrifice logging with it. In\nmany scenarios we actually do want logging in the production builds. To assist\nsupport personel in diagnosing user problems for example. So it's beneficial if\nthe minimum amount of code we need to load to support logging is small. This\nminimum amount of code we call the *footprint*. `ulog` keeps its footprint\nsmall by utilizing [lazy loading](#lazy-loading).\n\n\n## Debug mode\n\nDebug mode is a feature that `ulog` copied from `debug` and it responds to the\nsame [config option](#config_option_debug). Setting a logger to debug mode\neffectively means forcing it's log level to be at least debug:\n\n```sh\nDEBUG=my:app\n```\n\n```js\nimport anylogger from 'anylogger'\nconst log = anylogger('my-app')\nlog('Hi!') // is output because logger is in debug mode\n```\n\n## Outputs\n\nIn `ulog`, where messages are going is completely configurable at runtime.\nYou can even configure where discarded messages are going.\n\nAll log methods on a logger are associated with one of two channels,\n`output` and `drain`. To configure the outputs for these channels, two\nconfig options are available:\n\n* [config option `log_output`](#config-option-log_output), defaults to `'console'`\n* [config option `log_drain`](#config-option-log_drain), defaults to `'noop'`\n\nWhen the logger is created, each log method is sent either to the `output`\nchannel, or to the `drain` channel, based on the current log level for that\nlogger and whether that logger is in debug mode.\n\nTo configure the output channel, we assign the name of the output to use\nto the relevant config:\n\n```sh\nlog_output=\"console\"\n```\n\nThis setting can include expressions to target individual loggers, just like\nthe `debug` and `log` settings:\n\n```sh\nlog_output=\"console; noisy-lib:*=noop\"\n```\n\nBy default, the following outputs are included:\n\n### Output `console`\n\nThis actually is the native console object. Using the native console directly is\nwhat allows us to leave the call stack intact in the browser developer tools.\n\n### Output `noop`\n\nThis is just a log object that discards all calls\n\n### Output `drain`\n\nLike `noop`, but logs a debug message for every call\n\n### Custom outputs\n\nThe default outputs are not very special, but the entire machinery is in place for\nyou to easily add any custom outputs you could ever need. You can define additional\noutputs by making `ulog` use a mod with an `outputs` key:\n\n*index.js*\n```js\nimport ulog from 'ulog'\n\nulog.use({\n  outputs: {\n    custom: {\n      error(...args) { /* custom code */ },\n      warn(...args) { /* custom code */ },\n      info(...args) { /* custom code */ },\n      log(...args) { /* custom code */ },\n      debug(...args) { /* custom code */ },\n      trace(...args) { /* custom code */ },\n    }\n  }\n})\n```\n\nThis way you can add outputs that send log messages to memory, a file, localStorage, a database, over the network, etc etc.\n\n\n## Formatting\n\nFormatting is another feature that separates `ulog` from `debug` and\n`loglevel`. `debug` has formatting, but it is hardcoded and messes up the\ncallstack and there is not much you can do about it. `loglevel` does not mess\nup the callstack, but it also has no formatting at all out of the box.\n\nUlog uses [kurly](https://npmjs.com/package/kurly) to support advanced,\nconfigurable and customizable formatting, [without mangling the callstack](#preserves-callstack).\n\n### Configurable format\n\nThe actual format used is configurable easily via `ulog`'s powerful\nconfiguration mechanism.\n\nThe default format string on Node is:\n\n```sh\nlvl name message perf\n```\n\nThis sacrifices the callstack for a colored and formatted `message` and having\nthe `perf` measurements after the message i.s.o before it. Node JS doesn't\noutput any file name / line number information anyway.\n\nOn browsers, we want to spare the call stack, so there the default is:\n\n```sh\nlvl name perf\n```\n\nWe don't include the `message`, but it will be appended as the last argument\nautomatically. The result is nicely formatted messages with the file name /\nline number entries in the browser debug console intact.\n\nTo override the default format, just set\n[config option `log_format`](#config-option-log_format) to the format you want.\n\nFormats available out of the box include:\n\n* [Format `cr`](#format-cr)\n* [Format `date`](#format-date)\n* [Format `lvl`](#format-lvl)\n* [Format `message`](#format-message)\n* [Format `name`](#format-name)\n* [Format `perf`](#format-perf)\n* [Format `time`](#format-time)\n* [Fallback format](#fallback-format)\n\n\n### Format syntax\n\n`ulog` uses the new [options](https://www.npmjs.com/package/kurly/v/2.0.0-beta.2#options)\nin `kurly` v2 to make tag open/close markers optional and enable nicer looking format\nstrings. This means that `lvl name perf` and `{lvl} {name} {perf}` are\nequivalent. When using no open/close markers, any non-identifier symbols\nfollowing the tag name are considered nested text. For example for the format\nstring `name:22`, the `name` format will receive `':22'` as `ctx.text`. This\nallows for parameterized formats, as `ulog` has done to support\n[padding options](#padding-options).\n\n### Preserves callstack\n\n`ulog`'s formatting system has the unique <sup>(1)</sup> ability to do\nformatting while [preserving the callstack](#preserves-callstack). As long as\nonly [static kurly tags](https://www.npmjs.com/package/kurly/v/2.0.0-beta.2#static-tags)\nare used as formats, the call stack can remain unharmed.\n\n> <sup>(1)</sup> I do not know of any other logger out there that has this feature, but if\n> you do know one, please let me know in the\n> [issue tracker](https://github.com/download/ulog/issues)\n\n### Included formats\n\nExcept for the `message` format, all included formats are static. Meaning they\ndon't mangle the call stack, but also don't have access to the message. The\n`message` format must be dynamic, because it needs access to the message.\n\nMore about static vs dynamic formats later, in the\n[Custom formats](#custom-formats) section.\n\n#### Format `cr`\nPrints a 'carriage return line feed'\n\nThis allows you to easily set a multi-line format:\n\n```sh\nlog_format=\"lvl name perf cr\"\n```\n\nThis will print the message on the next line.\n\n#### Format `date`\nPrints the date the message was logged as `yyyy/MM/dd`.\n\nCombined with `time`, this can give you the full date time.\n\n#### Format `lvl`\nPrints the level of the message as a single character:\n\n* `'x'` for error messages\n* `'!'` for warning messages\n* `'i'` for info messages\n* `'-'` for log messages\n* `'>'` for debug messages\n* `'}'` for trace messages\n\nTo get the full level name, you can use `level`, which will be\ncaught and handled correctly by the `wildcard` format.\n\n#### Format `message`\nPrints the message, formatted and colored.\nUsing this format breaks the callstack as it is dynamic.\n\n#### Format `name`\nPrints the logger name\n\n#### Format `perf`\nPrints the time difference between two invocations to the same logger, only if\nthis difference is larger than 1ms. Produces output that looks like `62ms`.\nIf the time difference becomes large, switches to larger units. E.g. `12.4s`.\n\n#### Format `time`\nPrints the time the message was logged as `hh:mm`.\n\n#### Format `wildcard`\nAny unrecognized tags are being interpreted by the wildcard format. This just\nreturns the field on the log record whose name matches. For example suppose\nwe'd write `level`. This is an unrecognized tag so the wildcard formatter is\nused, which just returns the `level` field from the log record. If no field\non the log record matches, it returns the original text unchanged, making\n`'Hello World!'` a valid format string.\n\n#### Padding options\nAll included formats support some padding options. For example, to pad out the\nlogger names to 16 characters and align the text on the left, use `name<16` or\n`name:16`. To align the text on the right, use `name>16`.\n\n### Custom formats\n\n`ulog`'s formatting system is easily extendable by adding\n[kurly tags](https://www.npmjs.com/package/kurly#tags) to a key `formats`\nunder a mod:\n\n```js\nimport ulog from 'ulog'\nimport formats from 'ulog/mods/formats'\nulog.use({\n  use: [ formats ],\n  formats: {\n    custom: (ctx) => (rec) => (['custom'].concat(rec.message)),\n    random: (ctx, rec) => () => String(Math.random())\n  }\n})\n```\n\nThese tags then become available in the format string.\n\n> We used two different signatures here, because there are two types of formats.\n\n### Types of formats\n\nFormats come in two flavors:\n\n#### Dynamic formats\nDynamic formats have full access to the message.\nBut they do mess up the call stack.\n\n> The reason dynamic formats interfere with the call stack is that in order to\n> get access to the message, we have to *wrap* the console log function with\n> our own function. This wrapping results in the wrapping function being the\n> caller from the console's perspective. And thus the filename and line number\n> of this function are shown in the debug console.\n\nA dynamic format has this signature:\n\n```ts\n  (ctx: FormatContext) => (rec: DynamicFormatRecord) => string || string[]\n```\n\nHere is how you would add a dynamic format:\n\n```js\nimport ulog from 'ulog'\n\nulog.use({\n  formats: {\n    dynamicFormat(ctx) {\n      // one-time init here\n      return (rec) => {\n        // rec.message contains full message\n        return /* ... */\n      }\n    }\n  }\n})\n```\n\n#### Static formats\nStatic formats do not have access to the message. But they do not break the call stack! So prefer static formats if possible.\n\nStatic formats have this signature:\n\n```ts\n  (ctx: FormatContext, rec: StaticFormatRecord) => () => string || string[]\n```\n\n```js\nulog.use({\n  formats: {\n    staticFormat: function(ctx, rec) {\n      // one-time init here\n      return function(){\n        // rec.message is undefined\n        // rec.name, rec.level etc is populated\n        return /* ... */\n      }\n    }\n  }\n})\n```\n\nTo read more about kurly and custom kurly tags, refer to the kurly documentation on [creating kurly tags](https://www.npmjs.com/package/kurly#creating-tags)\n\n\n## Colors\n\nWho doesn't like some colors?! Apart from making things prettier, when used\ncorrectly they can actually also make our logs *easier* to read. Now I don't\nknow about you, but I find reading logs hard, so I'll take all the help I can\nget!\n\nIf you don't want colors, you can suppress them using\n[config option `log_color`](#config-option-log_color).\n\n\n## Alignment\n\nBrowsers have great debug consoles these days. They even include stacktrace\ninfo for higher-level messages. But they did mess one thing up imho; the\nmessages at these higher levels are indented a bit more than the other\nmessages, making the logging harder to read. This can be clearly seen in the\nscreenshot from `ulog` v2.0.0-beta-11, which did not yet have alignment:\n\n![screenshot](https://unpkg.com/ulog@2.0.0-beta.20/screenshot-beta.11.jpg)\n\n`ulog` now automatically adds some formatting that negates the extra indentation\nthe messages at these higher levels get, so all messages are nicely aligned:\n\n![screenshot](https://unpkg.com/ulog@2.0.0-beta.20/screenshot.jpg)\n\nYou can control alignment with [config option `log_align`](#config-option-log_align).\n\n\n## Configure\n\n`ulog` features a simple, yet powerful and flexible configuration mechanism. On\nNode JS, we can configure `ulog` via environment variables. On browsers, we use\nlocalStorage or querystring arguments.\n\n`ulog`'s configuration mechanism is an extension to that of\n[`debug`](https://npmjs.com/package/debug) and is compatible with it. `debug`\nis one of the most popular logging packages in the NPM ecosystem, with tens of\nthousands of packages depending on it, so having `ulog`'s configuration\nmechanism be compatible with it makes for a very smooth migration path. If your\napp or library is currently using `debug`, you should be able to replace it\nwith `ulog` with no or only minor changes.\n\nWe configure `ulog` by adjusting configuration options.\n\n* [`log`](#config_option_log): The main setting to control logger's levels with\n* [`debug`](#config_option_debug): For compatibility with `debug`\n* [`log_output`](#config_option_log_output): To configure where logging should go\n* [`log_drain`](#config_option_log_drain): To configure where logs should drain\n* [`log_format`](#config_option_log_format): To configure the format for log messages\n* [`log_color`](#config_option_log_color): To enable or disable colors\n* [`log_align`](#config_option_log_align): To enable or disable alignment\n\n### Log configuration syntax\n\n`debug` has a simple but powerful configuration mechanism. You set an environment variable or localStorage option named `DEBUG` and you assign it a value that expresses which loggers to enable. E.g.:\n\n```sh\nDEBUG=test,my:*,-my:lib\n```\nThe format is basically a comma-separated list of logger names, using the\nasterisk as a wildcard character and optionally negating the expression by\npreceding it with a minus sign. So the expression above includes `test` and\n`my:*` loggers, except for `my:lib` which is excluded.\n\n`ulog` extends this configuration mechanism. With `debug`, you can only turn\nloggers on and off, but `ulog` allows for a much more varied range of options.\nThis is achieved by extending the configuration syntax so it also accepts the\nvalue applicable for the loggers matching the expression. Also we allow a\nsemicolon-separated list of such expression=value pairs. For example, to set\nthe logger `test` to debug and `my:*` loggers except for `my:lib` to info, we\ncould write:\n\n```sh\nlog=\"test=debug; my:*,-my:lib=info\"\n```\n\nIf an option only contains a value, `ulog` implicitly adds `*` as the expression. So we can write:\n```sh\nlog=\"info\"\n```\nand it's equivalent to\n```sh\nlog=\"*=info\"\n```\nWe can even combine this. So we could write:\n```sh\nlog=\"info; my:*=debug\"\n```\nand it will set the level for all loggers to info, except for the ones starting\nwith `my:`, which are set to debug.\n\nMost of the config options support this syntax.\n\nA special case is the config option [debug](#config_option_debug), which is\ndesigned to be compatible with `debug` so code using `ulog` will react to that\nsetting in the same way.\n\n### Via environment variables\n\nOn Node JS we can pass log configuration options via environment variables:\n\n```sh\nlog=\"debug\" node ./myapp\n```\n\n### Via querystring parameters\n\nIn browsers, we can pass log configuration options as querystring parameters in the URL:\n\n```\nhttps://example.com/page?log=debug\n```\n\n### Via localStorage\n\nIn browsers, we can place our log configuration in localStorage:\n\n```js\nlocalStorage.setItem('log', 'debug')\n```\n\n### Config option `log`\n\nConfigure the levels loggers should be filtered at.\n\n```sh\nlog=\"test=debug; my:*,-my:lib=info\"\n```\n\n### Config option `debug`\n\nEnables debug mode for the selected loggers.\n\n```sh\ndebug=\"test,my:*,-my:lib\"\n```\nThis option is compatible with that of `debug`.\n\n### Config option `log_output`\n\nSpecify the name of the output logs should be written to. Defaults to `'console'`.\n\n```sh\nlog_output=\"console; noisy-lib=noop\"\n```\n\n### Config option `log_drain`\n\nSpecify the name of the output logs should be drained to. Defaults to `noop`.\nWhen log messages are filtered out, they are sent to the drain instead of to\nthe normal output. The default `noop` output is just a noop, but you could\noverride this to send them to a separate file for example.\n\n```sh\nlog_drain=\"noop\"\n```\n\n### Config option `log_format`\n\nSpecify the format to use. Defaults to `lvl name message perf` on Node JS and\n`lvl name perf` on browsers.\n\n```sh\nlog_format=\"lvl name message; my:*=lvl name message perf\"\n```\n\nThis sets `lvl name message` as the default format, while assigning a different\nformat string to all loggers starting with `my:`.\n\nFor more details, refer to the [section on formatting](#formatting)\n\n\n### Config option `log_color`\n\nSpecify whether colors should be enabled. Defaults to `on`.\n\n```sh\nlog_color=\"off\"\n```\n\nOne neat trick is to colorize only a few loggers, to make them stand out:\n\n```sh\nlog_color=\"off; my:*=on\"\n```\n\n### Config option `log_align`\n\nSpecify whether messages should be aligned. Defaults to `on`.\n\n```sh\nlog_align=off\n```\n\n\n## Mods\n\n`ulog` is completely modular, consisting of a microscopically small core and a\nbunch of mods. The mods are small pieces of functionality, designed to be\nusable stand-alone or in combination with each other. All functionality that\n`ulog` adds to `anylogger`, it adds in the form of mods. All, except for the\nability to add mods itself, in the form of method `ulog.use`, that is in core\nand one helper function, `grab`, to grab config from mods.\n\nTo add a mod, call `ulog.use` with either an individual mod\n\n```js\nulog.use({\n  // an empty mod\n})\n```\n\nor with an array of mods:\n\n```js\nulog.use([\n  { /* a mod */ },\n  { /* another mod */ },\n])\n```\n\nA mod is an object that can define many things declaratively:\n\n* That it uses other mods\n* That it adds config settings\n* That it adds properties to loggers\n* That it adds outputs\n* That it adds formats\n* Anything else you build\n\nAs an example, here is a mod that does most of these things:\n\n```js\nimport ulog from 'ulog'\nimport cfg from 'ulog/mods/cfg'\n\nulog.use({\n  use: [ cfg ],\n  cfg: {\n    // override the default of an existing config setting\n    log_output: 'file',\n    // add a new config setting with default value\n    log_cool: 'on',\n  },\n  props: {\n    // add a property `cool` to every logger\n    cool: {\n      // provide the getter.\n      // get `log_cool` for the current logger and coerce to bool\n      get: (logger) => cfg.get('log_cool', logger.name) == 'on'\n    }\n  },\n  // add the `file` output that we made the default\n  outputs: {\n    // you can write any code that returns a LogObject and call it here\n    file: myFileOutput('my/file/name')\n  },\n  // you can add custom formats just as easy\n  formats: {\n    // create a static format that prints a random number\n    random(ctx, rec){\n      return () => String(Math.random())\n    }\n    // you can later use the custom format in the format string\n    // e.g. log_format=\"lvl name random\"\n  }\n})\n```\n\nInterestingly, most of these features of mods are being added by mods. For\nexample the ability to add config settings is added by the `cfg` mod. Studying\nthe way `ulog`'s featureset is built from mods by reading the source code of\nthe included mods is the best way to learn about writing mods for now.\n\n\n## Lazy loading\n\n`ulog` being built with mods makes it easy to use lazy loading to reduce the\nminimum [footprint](#footprint). If you use ulog from a [script tag](#script-tag)\n(not recommended), you can get it for free. Otherwise, you have to configure\nyour bundler to code-split.\n\n### Lazy-loading with Webpack\n\nHave a look at\n[ulog.bundle.ts](https://github.com/Download/ulog/blob/master/ulog.bundle.ts)\nfor an example of doing lazy loading with [Webpack](https://webpack.js.org/).\n\nBasically it only loads `ulog/core` and then checks whether any of the\nconfig options `debug` and `log` are set. Only if one of these is set\ndoes it actually load the remaining mods on-demand.\n\nIt is using the standardized dynamic import construct so this code should work\nwith other bundlers as well. The only Webpack-specific thing in this code is\nthe comment that specifies the chunk name, used here to specify the filename\n`ulog.lazy.min.js`.\n\n```js\nimport ulog from 'ulog/core'\nimport env from 'ulog/mods/cfg/env'\n\n// just making sure ulog is available as global in the script version\n(window as any).ulog = ulog;\n\nif (env.get('log') || env.get('debug')) {\n  import(\n    /* webpackChunkName: 'ulog.lazy' */\n    'ulog/mods/fmt'\n  )\n  .then(({ default: fmt }) => {\n    ulog.use(fmt)\n    for (const logger in ulog.all) {\n      ulog.ext(ulog(logger))\n    }\n  })\n}\n```\n\n## Decoupling code from `debug`\n\nAs I said before, `debug` is excellent for debug logging and there are tens of\nthousands of packages using it. The downside of this is that you will more or\nless get `debug` shoved through your throat if you include any of these\nlibraries because they are *tighly coupled* to it. But we can uncouple them\nwith the magic of bundlers like Webpack.\n\nTo replace `debug` with `anylogger` everywhere, you can use this Webpack\nalias to make all modules that use `debug` switch to `anylogger` instead:\n\n```js\n{\n    resolve: {\n        alias: {\n            'debug': 'anylogger'\n        }\n    }\n}\n```\n\nThis works because the anylogger API is backwards compatible with that of\n`debug`. And because `ulog` has native `anylogger` support, once you import\n`ulog` in your entry point, all those libraries that were using `debug` start\nto use `ulog` automagically!\n\n\n## Performance considerations\n\nBy default, the logging methods on the `log` object that correspond to a log\nlevel which is higher than the currently set level, are replaced by no-op\nmethods. As such, you generally don't have to worry about the performance\noverhead of leaving the log statements in the production code. There is one\nexception to this rule though. If preparing the message itself is a costly\noperation, you may want to surround the log code with an\n`if (log.enabledFor(level))` statement:\n\n```js\nif (log.enabledFor('info')) {\n\tvar message = doLotsOfWorkToGenerateLogMessage();\n\tlog.info(message);\n}\n```\n\n\n## Issues\n\nAdd an issue in the [issue tracker](https://github.com/download/ulog/issues)\nto let me know of any problems you find, or questions you may have.\n\n\n## Credits\n\nCredits go to:\n* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly\n  giving up the `ulog` namespace on NPM. Thanks Felix!\n* TJ Holowaychuk for creating [debug](https://npmjs.com/package/debug),\n  which was a great inspiration for ulog.\n* Tim Perry for creating [loglevel](https://npmjs.com/package/loglevel),\n  which was another great inspiration for ulog.\n* Community members [Jakub Jirutka](https://github.com/jirutka) and\n  [Alex Kesling](https://github.com/akesling) for making code contributions.\n\n\n## Copyright\n\nCopyright 2024 by [Stijn de Witt](https://stijndewitt.com).\n\n\n## License\n\nLicensed under the [MIT](https://opensource.org/licenses/MIT)\nOpen Source license.\n","readmeFilename":"README.md","gitHead":"6cc573501783caf26c1a9fd1262f44da266daff0","types":"./ulog.d.ts","bugs":{"url":"https://github.com/download/ulog/issues"},"homepage":"https://github.com/download/ulog#readme","_nodeVersion":"18.19.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-ALKiEMcr0zBoXGOybtwnSo7lt8RUHDD2IWiSE/IXyVH9GlTyI+7aWtznAG9Da61Jr/643fSKhd2OiNKFE9HRyg==","shasum":"a95218be4b8fa8cc073124f1d5f45cd4a6ac7ff2","tarball":"https://registry.npmjs.org/ulog/-/ulog-2.0.0-beta.20.tgz","fileCount":229,"unpackedSize":1145166,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFBnzgnOeCYniFqnH3SCLuh9z5dkSsV7v5hdFV8NTDo9AiEAmjzvSFXUXHWEFw8V7hYDNIq5aHZgf35avPVkQlSoCh8="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ulog_2.0.0-beta.20_1709566754409_0.6724310975154757"},"_hasShrinkwrap":false}},"readme":"","maintainers":[{"name":"felixge","email":"felix@debuggable.com"},{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"time":{"modified":"2024-03-04T15:39:14.989Z","created":"2011-11-27T14:29:18.926Z","0.0.0":"2011-11-27T14:29:20.380Z","0.1.0":"2016-09-25T23:22:54.956Z","0.2.0":"2016-09-26T11:36:01.331Z","0.3.0":"2016-09-26T12:46:30.895Z","1.0.0":"2016-10-23T14:52:01.741Z","1.0.1":"2017-02-20T22:41:19.111Z","1.0.2":"2017-02-20T22:55:51.852Z","1.0.3":"2017-07-13T16:17:14.191Z","1.1.0":"2017-12-23T19:18:08.123Z","2.0.0-beta.1":"2017-12-27T13:17:45.839Z","2.0.0-beta.2":"2017-12-27T14:28:24.790Z","2.0.0-beta.3":"2018-12-01T22:06:35.536Z","2.0.0-beta.4":"2018-12-02T04:15:43.642Z","2.0.0-beta.5":"2018-12-02T12:15:47.374Z","2.0.0-beta.6":"2018-12-03T14:57:13.798Z","2.0.0-beta.7":"2020-03-11T15:29:35.039Z","2.0.0-beta.8":"2020-11-14T18:35:53.990Z","2.0.0-beta.9":"2020-11-15T13:15:57.962Z","2.0.0-beta.10":"2020-12-07T11:10:19.938Z","2.0.0-beta.11":"2021-01-22T12:20:02.481Z","2.0.0-beta.12":"2021-02-04T02:42:52.259Z","2.0.0-beta.13":"2021-02-04T03:17:45.147Z","2.0.0-beta.14":"2021-02-04T19:23:28.343Z","2.0.0-beta.15":"2021-02-04T19:45:44.366Z","2.0.0-beta.16":"2021-02-13T17:09:07.759Z","2.0.0-beta.17":"2021-02-13T23:17:47.682Z","2.0.0-beta.18":"2021-02-14T17:22:48.321Z","2.0.0-beta.19":"2021-09-14T18:56:21.216Z","2.0.0-beta.20":"2024-03-04T15:39:14.575Z"},"readmeFilename":"","license":"MIT","homepage":"https://github.com/download/ulog#readme","keywords":["ulog","log","logging","console","debug","loglevel","anylogger"],"repository":{"type":"git","url":"git+https://github.com/download/ulog.git"},"author":{"name":"Stijn de Witt"},"bugs":{"url":"https://github.com/download/ulog/issues"}}