{"_id":"nani","_rev":"31-89a57575b1a473ed788521caa779d420","name":"nani","description":"Better error handling for Node","dist-tags":{"latest":"3.2.3"},"versions":{"1.0.0":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.0.0","gitHead":"ab5a6c6d5e8f6acee419923f8a01f40d499cf071","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.0.0","_shasum":"00fc298d8a3ad731186da2d871f22b9d03c50eac","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"00fc298d8a3ad731186da2d871f22b9d03c50eac","tarball":"https://registry.npmjs.org/nani/-/nani-1.0.0.tgz","integrity":"sha512-cBfjaJUEK0IvIr9L8Q/FVHfVGXbAVnqRYNdDB5rk+nPqRHb3nGwy0VLJwFEfZk3YhPwgW3gJM8StSREsq6rk6w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOhZ2n7GAkeE9x0jTkcgCaQ233VRazAzbkPeqD/gJHHQIhAI5ksvnfQL3BT7Oaq0zIfSYxSGy1Rj/BC6xsssVzHce0"}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"deprecated":"Package name taken over for a new project, starting with 2.0.0","directories":{}},"1.0.1":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.0.1","gitHead":"ee76df76b3a4e76800ef49d908452ef7cd108ad1","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.0.1","_shasum":"08bb198eff4b9f8f44ce0116a85a9e23190e4d3d","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"08bb198eff4b9f8f44ce0116a85a9e23190e4d3d","tarball":"https://registry.npmjs.org/nani/-/nani-1.0.1.tgz","integrity":"sha512-vDRyUqn2ZNSGZUK7ATfyh0XYEJ+eQZDaFcBGYbgPAd4opr+c8+VfqvTKxJOkaU4x12Bx/obryy+0ZKAnEHhFdA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA2BjQ/T0uOD/XqeTwEBebfi8Pq5i66hFkl3EnTLnj++AiAXubXfwXptVH1e66tfa53hbCa8ZdRIjskJSVHuJFYfPg=="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"deprecated":"Package name taken over for a new project, starting with 2.0.0","directories":{}},"1.0.2":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.0.2","gitHead":"9bd95e3fca98b7608daf3ea0beac00f9564c818b","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.0.2","_shasum":"7f63cec19ccfb47c4a41ee926f3e4d925444a929","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"7f63cec19ccfb47c4a41ee926f3e4d925444a929","tarball":"https://registry.npmjs.org/nani/-/nani-1.0.2.tgz","integrity":"sha512-g/34y2vdlc8s9jpolfVkShm6za3BvKpbVgCB+KiX17DGeRFLNpjfZnG7CbEtRM0rX1QTKl7DXz547vpsF6V4CQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIARNXz0auqlHygyZIe+c1J1k0re9ICNgpor7Eldu95bDAiASgAXLX8RT4Rdc9Tgh9EIuynyBdTzF4AFIOQxW4rbS2g=="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"deprecated":"Package name taken over for a new project, starting with 2.0.0","directories":{}},"1.0.3":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.0.3","gitHead":"ace689f55621fa8d484bfe9b446992dce1c257d0","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.0.3","_shasum":"408a158508a9269215dcea131473431cfdab3f20","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"408a158508a9269215dcea131473431cfdab3f20","tarball":"https://registry.npmjs.org/nani/-/nani-1.0.3.tgz","integrity":"sha512-8bMe4USYjyhmR8+LB++lKj94NHXFUc8rmzk3lGgd8zvOwslnm9SALjF2Bqro7UOC0nmWp+6vRaosJxrExFbN2A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDoOBOD1tYywf9nRTi/8tRjkDWVWKqZPFmOOhTSUMourAiAaX8dR8v+a4iYfwXHpZdb+wSbYpRh08zzKmpvCU7a2Cw=="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"directories":{},"deprecated":"Package name taken over for a new project, starting with 2.0.0"},"1.0.4":{"name":"nani","description":"Client for the Anilist API","version":"1.0.4","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"gitHead":"17bbe24034b7d15bad9168c29d0cd0bb955b4fef","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.0.4","_shasum":"a4557fddb9ea31174d867f6a54a304c294e30243","_from":".","_npmVersion":"3.3.12","_nodeVersion":"5.3.0","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"a4557fddb9ea31174d867f6a54a304c294e30243","tarball":"https://registry.npmjs.org/nani/-/nani-1.0.4.tgz","integrity":"sha512-i+/WdtLIMPZaoRmlbYX8aH5j+neOoqMHG8uU5LFVpjmHr9zrXzygsWUIPVfqCO53sDstmX9c7YXjwRbILp60cw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWqb53T9O72M8T5k1xOZag2McHvAuqI9P/dlQWejHOyAiA5nCyz7o9DsB1Mq6Sl83YU03ZuuXNwrKeZh5t89KcSyw=="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"directories":{},"deprecated":"Package name taken over for a new project, starting with 2.0.0"},"1.1.0":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"node-fetch":"^1.3.3"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.1.0","gitHead":"1539eda0bcf5679c180acf858d6ebb85251566fb","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.1.0","_shasum":"bdabef006d63750f2475afbff3efa7483b02ae8d","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"bdabef006d63750f2475afbff3efa7483b02ae8d","tarball":"https://registry.npmjs.org/nani/-/nani-1.1.0.tgz","integrity":"sha512-5+UitbJfqH4h/UPnHAG+SSncMfVRJlBcwtvCAGzUCuk5GrNdVe5sDSt616YvNZ54RIlgEqlilH4fQHy/UvIUMA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHgK2x2fUyOY1ivCGH/ft+S6ySmuzaaXFTTMOuEP2DC2AiBKAkbjVQtRFSt2hQHwPh54di8Oo45DEEXvAkdJqkyvQg=="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"directories":{},"deprecated":"Package name taken over for a new project, starting with 2.0.0"},"1.2.0":{"name":"nani","description":"Client for the Anilist API","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sotojuan/nani.git"},"author":{"name":"Juan Soto","email":"juan@juansoto.me","url":"juansoto.me"},"engines":{"node":">=4.2.0"},"scripts":{"test":"semistandard --verbose | snazzy && NODE_ENV=test ava","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"files":["index.js","lib/"],"keywords":["anime","anilist","client","api"],"dependencies":{"isomorphic-fetch":"^2.2.0"},"devDependencies":{"ava":"*","cz-conventional-changelog":"^1.1.5","ghooks":"^1.0.1","semantic-release":"^4.3.5","semistandard":"^7.0.4","snazzy":"^2.0.1"},"semistandard":{"ignore":["test.js"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"},"ghooks":{"pre-commit":"npm run test"}},"version":"1.2.0","gitHead":"e16cd29b2faad6a50810b8e7f52474377f4cbff4","bugs":{"url":"https://github.com/sotojuan/nani/issues"},"homepage":"https://github.com/sotojuan/nani#readme","_id":"nani@1.2.0","_shasum":"af91824f4584b5965fc05434628190b8ace5640f","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.4","_npmUser":{"name":"sotojuan","email":"imjuansoto@gmail.com"},"dist":{"shasum":"af91824f4584b5965fc05434628190b8ace5640f","tarball":"https://registry.npmjs.org/nani/-/nani-1.2.0.tgz","integrity":"sha512-8aZyXDMCMDLJJHvJQ+zElVhdW81cnxL8PJUVzEpbzhC/TzA/BYAnvZoAxQkDDu687euVg3Wdb5/HeM3WwFZXzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIChnIqa6LLAAZ7TykHWFiFGZPmzCxo0TYUdrAjyFz8jjAiEAgrZyDSr/6hYe4yXJJPtxvFBUC1e5KL61xFhIQ7GYyag="}]},"maintainers":[{"name":"sotojuan","email":"imjuansoto@gmail.com"}],"directories":{},"deprecated":"Package name taken over for a new project, starting with 2.0.0"},"2.0.0":{"name":"nani","version":"2.0.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.0","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.1","chai":"^4.2.0","documentation":"^9.1.1","eslint":"^5.13.0","eslint-plugin-jsdoc":"^3.15.1","gh-pages":"^2.0.1","mocha":"^5.2.0","sinon":"^7.2.3","sinon-chai":"^3.3.0"},"gitHead":"590b2bab95bd32d5f06927ba93915ee89edd06f4","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.0.0","_nodeVersion":"8.9.3","_npmVersion":"6.8.0","dist":{"integrity":"sha512-+kGF3mW3KrhHBiRYocaeMKxwpCSB+F3M/Jruo2/P1OAX7ShchvJ9TD64hoMxLCC1OizPSgTsCl/OcqM1StYx0A==","shasum":"531ffbf715684055c141eead0f0914876fba44b3","tarball":"https://registry.npmjs.org/nani/-/nani-2.0.0.tgz","fileCount":38,"unpackedSize":1628342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcbIlCCRA9TVsSAnZWagAAlaoP/2iT8taO/kPycIMgBTJ8\nwaeVuP16v45tRsQbjPDiu24/lsddq8Xx7r5fx3oGaNzih3xCFkyFxO3Uqi1y\nZyCZxufPOJotFef6rJf1e+N97EuvyGns8YeWVK/ZSpCqs/s8BiWjhqOB0Hku\nv5q49fkrq4W/CVk3flORBh0YiEvMlIVAarRJao5yMw6o9k86fkwKDx1n+Sqe\nm5DZeN4UV9416TESzaOCHfTRcHCy4mHhK/1slnijyvr9mOMCmi8zZ+qejmzq\nYobJxi2UOgrK/1+YoRnefoNgJ2+4vx0+MdiNaK+5Mp9JfAuWAfd1vAy7AM27\nBJKOKCB7sccRhVRLx/H3IRiznBlOtO70XPJ9/VbLWBClOtAa8351SzRYknYN\nTpiDTB9jOP86zTx+ZoV5Ln3cRUuBQJtT9+wyyEBhj3tkGjwYbDxd0itI9T+k\nWAk1o+ORrVS/bBFe7nKXDR1n4iiU0YU6j+KI02Rmm/rOfPDeaBXYzpW/etBe\nS/9xzXKj8IsfEqDqAHTrqqu6dBP8kNDy30/bul7/r+ttgUm1fAU8yJMi9t/f\ne/Rd5wla5UJ0Ewt5tzrndhoirOVjUT/xNhXwucazhyCXOxZWrJaB8RjL/P86\nvqTAWuQxBnL7D7vo7G7ZJprkjOFxNZaqO4XXhgGYlRMnA7/DIb8N9m+jVtX2\nJKLQ\r\n=jk7x\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSKkK/z7PirzjuUPitUYrHs2VAMdXS7A3HIiGtNSmWVAIgVnBH2WkbdfFaOYcDMBKKK6ICSQIfRFWMeY4Lm4WdplM="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.0.0_1550616897504_0.009979274173975483"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.1.0":{"name":"nani","version":"2.1.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.0","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.1","chai":"^4.2.0","documentation":"^9.1.1","eslint":"^5.13.0","eslint-plugin-jsdoc":"^3.15.1","gh-pages":"^2.0.1","mocha":"^5.2.0","sinon":"^7.2.3","sinon-chai":"^3.3.0"},"gitHead":"f03a29057ce17408aca607c6c334095e4996fb42","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.1.0","_nodeVersion":"8.9.3","_npmVersion":"6.8.0","dist":{"integrity":"sha512-fNb9XsNxdbtODd18fO/DEQ0i/ng4dYJdF8vcOS8GW6Yoa4u8oQAjWB3ItzJ8J2ZmsFlMriMUx1YcBMQNxR9EFg==","shasum":"589c19a76d037698bed0be4fe8d0189431c9dd85","tarball":"https://registry.npmjs.org/nani/-/nani-2.1.0.tgz","fileCount":39,"unpackedSize":1631657,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJccHb8CRA9TVsSAnZWagAAh+oQAJ2xpvTb9HRDDQX+DK+t\nlDD8Rtl6DNXTqjEgMmdQng1jLRt2FoUjP9XzO4TKr5m8RaxKMBLEhp9UR4ls\nY3w0saUPzor20a2RTWGSPGZQfelCauMz73/xJ/C+nurfkQv3OVRnp8TzLhMm\n2lb2aPWPwgZfZpyNeN79ItH3vRy/jQ6Sqr9wp58nJSe1PlLoBdnsixZlhNrP\nDxkY3c9KAdlzFpvzby9wNqTjuM/Lh9AFEYuiVB9NMMYAifocexGX/zJyLCq2\nsgyTk/Fey0AN9GNkXYEyRCqutyo4pE/pfMMfHGuiuwVzOWv880rh351pA3hl\nSmY9OpQc/Klktu4XeCAlugwM2J1N/izr1EH/iidiAejxXn+S+hbJvQ5QO6IP\naWZgYnjGCAX1lGFqbDWo3GGaJCWD0kUP2BwGqvNqxq5F797Py9RqPxN1rQg7\nsyndz/FZ6P9MkEBTVdusLxZQY/TeXD5opuHPFxL6sEbBVcFYXNyIc6pJ8vcL\neLCs8Zwlao52APsXMrqVQn1/I4dFOG6soi4NtVfQH+xwJPNeytnuqdLQmwqs\njEhFjgBgiiJLg3Pw19WBgJoD6iSsuV1oxJP5olP6s7oa2cCVVUF9lNpitCkq\n//SHTasLO8VTYnt2t+G74GusGSjlM9Jdj5oHriQYT9M7i/eV6Yx9Hox927M6\nfNEM\r\n=uk1y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb6xGCN6kb3nrzXK54zz+zQOWkJnOczsIY5rOYf7PPfQIhAK73lUQB0fS0WwhPMFmElyhQDGcsrrQl2voSDDej/sZM"}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.1.0_1550874363993_0.6735349700332356"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.2.0":{"name":"nani","version":"2.2.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.0","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.1","chai":"^4.2.0","documentation":"^9.1.1","eslint":"^5.13.0","eslint-plugin-jsdoc":"^3.15.1","gh-pages":"^2.0.1","mocha":"^5.2.0","sinon":"^7.2.3","sinon-chai":"^3.3.0"},"gitHead":"0722339dca1adbe6b789d2bd763c4114a85adcde","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.2.0","_nodeVersion":"8.9.3","_npmVersion":"6.8.0","dist":{"integrity":"sha512-uLdmswR39qtvVjy3vE10bn9Au6gmig16gqNEWLzsAubaTq7CWh5mkRBdk//MWhKB+FjDS+/ONcMbtWm7v84x4g==","shasum":"e1a2f245241283f0aa5e99be72a8b2411e9458dc","tarball":"https://registry.npmjs.org/nani/-/nani-2.2.0.tgz","fileCount":40,"unpackedSize":1637678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJccb4LCRA9TVsSAnZWagAAkEYP/1l5MWVhJsDjP4LMn5GC\nIAer+4OfGr71GJuyFwM2+YvKlKfE70XtS7SgbasggPVgmezB4KMjdikOhVOm\nefEU1DLLN8Zjqy6EgnksB5J6w0Fax1IZdmPEkslHaH8lLUH1g1c9REHJ+V9Z\nxMtRgG8ZGwaQD9MIvkciat50tcd8HXAVCYKegLSqzKm/elsLH2Wy4oOH1JxD\nNU2B83ddegE5YYlWpI+ivPc0bS7Ng51UGBdjE4l/LzGrWeVWu/FJyxtKEXf5\n3HiU40IhZDffhgl6Xp8qaZ+2Bx2aluL1wBfD+QUp5UZmLAkaGdEDcY9dyOW3\n434R40DwFSXxfosonFyh9JgOY4//WTEnJmFJFrF3e17p7M0iEw+WvTOmlg4x\nRD85NpLb+hf/yFKq49wgTIOgXjBE/QP7q3Q3AGgE9H7jKMyfg/2j1/raRntu\nUcnul71/4hqoJqQNnlH1JYyXWI4Txoars14FavjIvmXzK/BV5JN5+28pHi3M\nMRrHfikNd3/+L2bLwrNsbKjFoNx+Vi0cYNIAxf9VjHkZJbJdCa0/JQCuORl+\nUZ73RaCM0Yc7IPICSzHpCBiHTSVgDOzpa0pZCoEdbC/i3rzJeAzuHUJNUq7p\nAw0T0SyV4eYT6yMvhJyDcGaTYziLjCbaZpdogSYaO/3t7hNliJkLTrfMWnbe\n9ybZ\r\n=fCrp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFYY98MbldJ2suIsoFFVTGbp90Ul36JNDm1yS5jgevtQAiEA5TKWG4n6Gchzv/KlORH3v7UYtIZuvqdHxATDnQl2dGA="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.2.0_1550958090603_0.7385172983176098"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.2.1":{"name":"nani","version":"2.2.1","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.7","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.3","chai":"^4.2.0","documentation":"^9.3.0","eslint":"^5.14.1","eslint-plugin-jsdoc":"^4.1.1","gh-pages":"^2.0.1","mocha":"^6.0.2","sinon":"^7.2.5","sinon-chai":"^3.3.0"},"gitHead":"a1d61967c57ea039938e59207a083fdf08705606","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.2.1","_nodeVersion":"10.6.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-GwctZfPi3jb6HbxdVLyf9+Lc6EFzBWeusX7erYFL6nST45ofSSJiXbno+7/fQ6VloyXT30wnpwRNAAXkdxduOA==","shasum":"f6fb2933f09ceb6352d43953d16b0170eee737a7","tarball":"https://registry.npmjs.org/nani/-/nani-2.2.1.tgz","fileCount":40,"unpackedSize":1637093,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJceZE5CRA9TVsSAnZWagAAbzsQAJEzYw5cp5ndxZVUHuWg\nVHh4yAgcW9iZpBPHYwBJ/hUFkkaNsTSbLIpnhKAvBZb6EoqMHirQudJbBL9R\nY4Srp10e7c0TGherCoPEWUTvEzXer4YtvsTXv+QLhpeEkBdajvYWVWsMhd4c\nI771wSVbtG4iUTS8MUGTOS6hIk1rFKXUJmVa7uqmjQDclMiKAvuvHbmylCNC\nXP5ThqTZXyh3h8T2w86U1VTp3Bvw4cfjFvwKNPO7+Hcp41lnlEFmoZEFcpuD\nfiyYsvgpm61+C6/I5OHvq7yHkozFwEWkXz6grP3FRBQNXTHswDHG3Ih+Rat1\nhnUHd5CwHbwto94d0RX9sVAQoSRL6UvyZWE+mLalUJkuuY66vA6VPb6BWFWK\neOOX/ADGMGHwPc+myCvIFQchXCtIkc7HSUipkr2WEiV7i+BFwaACGhxOJ9Ly\n3aAUocsiAGUfBobjB0LXWEyDzvoKtvRXQ5UfZFrohvTHIn7pxI7RDcN6/Rmc\nBdfqTpzCFklF/sgCclpRha6K5YOZY7cD0ErgLSxKdvHDXC4ToufiVgwmywiJ\nwsuV5fUlVZFJ4z73vRxhYfK6b+MW9jmqxQ9u/93fy7crrfO0mkfzxVQI1eXN\nb0zCeR0kkP+QgFVneIQkfCbbKQcDtbO4z1blNQXheLKrIZoSOO7vOrSV8d6B\n0ET6\r\n=Sn6Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwZt0AhQZfWumg0InRDoO/1wUuSG0zPf1nmJ+SkSvawQIgA6eZlCM6C0BYCTVlXIZSusYToD1/3j3NsfgUCdeKfrk="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.2.1_1551470903750_0.7346398362617763"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.3.0":{"name":"nani","version":"2.3.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.7","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.3","chai":"^4.2.0","documentation":"^9.3.0","eslint":"^5.14.1","eslint-plugin-jsdoc":"^4.1.1","gh-pages":"^2.0.1","mocha":"^6.0.2","sinon":"^7.2.5","sinon-chai":"^3.3.0"},"gitHead":"85e3e9ea60c7c0544d123b13433b99ad2b718265","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.3.0","_nodeVersion":"10.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-p6WvQgqs3vQswoW9jv1AP0Rm+Ar7KR2MXLblsrfKdlhYPzoarAUxNbnUO7j0ua3Uwo/49qMmvXm6SGAxBbchzg==","shasum":"10e1a3300b5a56bd8ad0150ecb026112d5a16e90","tarball":"https://registry.npmjs.org/nani/-/nani-2.3.0.tgz","fileCount":41,"unpackedSize":1640577,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchGtTCRA9TVsSAnZWagAAbyEP/1XyruQR3l0H0Cq46T8n\naaYn/AlYc/bJ5/L6fpan6KOfdqcT0VQ33yAZSnNuDg8hQsRA4vuoMbtpiLps\nwk9/oLfUhaBOjPvXGqDSXqjbzAtK1azvJc6sKFvxoH4xtF4coXiKO9Z5jgKG\ngkBowb4fq+hfIU73C61XhaMa/6GqTqJaUzLY/ZZUAg9Xhpu1/x5LUpvOq4Ll\nYEloOdJqzQljJkRtnTdBOARkYT1ca5jjV8z1zQlTDQJtTM3Bdu3R9yt24X4X\nYzRMlJtXR8Fq2dmJpsIisJGpYYsyB38fjhhfn0b2jqqumNWmyBEMAB6yrAMm\nKFsxJJy+zWoznfVn521JFuhW0iIjVk+WTaxROf45fJyAc4vp2YDaIMbPtQY4\nqK0o/Wr/oKautgzTDqoIL+4XmJJlmnw/KyEmx9a8IiY6t5ajFOH889OQhwjY\n5aHY9Mjy9ZIjrWvxAhQnJ/ZkMUIDZ6GcycXk785gtz0LuV2HR/e7T+AE0PSS\nJXWQVxZlXJ0oYF2bbPf0gYTz/pQrqHgkS/MstbNclYi9U32lCDzcIjTKNV2X\nQtFICCJbsJGJ36oVdOehZDML79c/Qqc0/eU22aIAHybAsHuGz1mtnIm+BrZk\n0/NmUr544hV4TjhmGkn52aGe6tuTUO6QxAfxUMV/8wAhRdBnt5YxIsyMZmrO\nMecZ\r\n=aXUt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcUwFOFPPEVr3+5XJTEhBv3gp2pyWgfPH0eERsIwuJvAIhANAF3xiXGZFgDkCUgezcGU3chDtDe5jNR6Zx4fgoj3s8"}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.3.0_1552182098073_0.7761250892130631"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.3.1":{"name":"nani","version":"2.3.1","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"lint":"eslint .","unit":"mocha -r esm test/setup.js test/unit","integration":"mocha -r esm test/setup.js test/integration","test":"npm run lint && npm run unit && npm run integration","docs":"documentation build ./lib/index.js -c docs.yaml -f html -o docs","postversion":"npm run docs && gh-pages -d docs && git push && git push --tags"},"main":"cjs","dependencies":{"esm":"^3.2.7","lodash":"^4.17.11"},"devDependencies":{"@sripberger/eslint-config":"^1.0.3","chai":"^4.2.0","documentation":"^9.3.0","eslint":"^5.14.1","eslint-plugin-jsdoc":"^4.1.1","gh-pages":"^2.0.1","mocha":"^6.0.2","sinon":"^7.2.5","sinon-chai":"^3.3.0"},"gitHead":"a376126ff651e95e8cca86cf36b806eb56936949","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.3.1","_nodeVersion":"10.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-d3evTOM0YGd94Kj83hC/18fNSuVXyfKiqY6YC6kyGM+KtyNYO8FUaGE/r2jIJY/n7LXLYy13DKD4Do4cIi0Kdg==","shasum":"06055914f2888c6c87bc000b6d930a28f918b714","tarball":"https://registry.npmjs.org/nani/-/nani-2.3.1.tgz","fileCount":16,"unpackedSize":51877,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJci85wCRA9TVsSAnZWagAA3/cP/igEoq6m67tpro8NCB1V\n1szHGmWKrrrzYMp7WgoM2oAZabH/q/ch5Exe7e5Ug/0BuXZ5nC0AGpFKtv6K\nT1+S3h7ovpoQ0oRaK8mRTScmRXa2mb6E59chC71YQefV86+GNQLdl2GvktBd\nQxE1a5owBUugJTfcZoapTt9UPxwVOKXDAUJLIn/RMdgKWpeae9Y8/+SfEYmx\nde7dAkBRajbjcp68jpodJ19L3IUyhqL2Do8Wfi7EdQ9e2Sbt9qdcXSKxJm9Z\nOgBvwI4vAZamSbsxCHXGac2AamFn8+S55ztdfUZNDumNeDzlSbP1LOwfufQ1\n1WHCeS/gpVOZzZ7KY31HEkua0OPD6vKV47NXsTY2c5N6Y0GRBbrTXvvYOsIR\n+KzVwYmcb2BuLymor0enfwNtWRWLAB0N23UWekXFe8ekWlAKXczoYo13LE2O\nv9u0QwIz+jZCBGgp6CObNiG+Rxq/MUyJnljnokjXlEnqsYy3P6mMXNwj+36D\nGLW2f4awlN3AnoqsQ0W3YwV4KnHRGC0Cv7WAISCufc+Pal96Kwbdyjv0DJVV\nB/SkLvl0Qamsywo+v0aImfeabAPzelmiStTtqgI/vBKLy5EdrNOf8cuRMFzv\nED++I/xw6mCi+oJN4B/dBd14PDrVJ4n89zJZ7YaF29O+swCoI5JP3EDzwfu1\nuYwU\r\n=xlHH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFVniXe6c25rHOkJgqF672tPotveX1iBdz4PzHIl8XeLAiEAw3abyDXuHO/6Rerm8fkUlAH8BP/nXrTdxLmlTUdgRYA="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.3.1_1552666223640_0.42574915273312475"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"2.4.0":{"name":"nani","version":"2.4.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"generate":"yo","generate:class":"yo @batterii/ts-class","generate:module":"yo @batterii/ts-module","generate:test":"yo @batterii/ts-test","lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-ts":"^1.1.0","@batterii/generator-ts-class":"^0.1.0","@batterii/generator-ts-module":"^0.1.0","@batterii/generator-ts-test":"^0.1.0","@types/chai":"^4.1.7","@types/lodash":"^4.14.136","@types/mocha":"^5.2.7","@types/node":"^10.14.12","@types/sinon":"^7.0.13","@types/sinon-chai":"^3.2.2","@typescript-eslint/eslint-plugin":"^1.11.0","@typescript-eslint/parser":"^1.11.0","chai":"^4.2.0","eslint":"^5.16.0","mocha":"^6.1.4","sinon":"^7.3.2","sinon-chai":"^3.3.0","source-map-support":"^0.5.12","ts-node":"^8.3.0","typescript":"3.4.5","yo":"^2.0.6"},"dependencies":{"lodash":"^4.17.14"},"gitHead":"c2ddfab393e1fda1118f4efd699322194e1e7e8d","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@2.4.0","_nodeVersion":"10.16.0","_npmVersion":"6.10.1","dist":{"integrity":"sha512-U39anOuGgPMfljK945A6Rea9u9aq00Lmt0n8ivXue2eUHBz7WbFD+YDK4jPYkwJSVeErdhh1/FjgUNi9y4Zc8g==","shasum":"fff3da942f487c6b9d613ed4748e901bac7ddb84","tarball":"https://registry.npmjs.org/nani/-/nani-2.4.0.tgz","fileCount":50,"unpackedSize":67063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLf/yCRA9TVsSAnZWagAAScYP/jUS6h1Q5XOvM6kl4mHV\nwG4pYBXBsc4B48WvgvcooxGqG+yi+fiT31g74c/u2+b6w/itDkovd63bxo8O\nYMQfyyftiC/PoqOpN9WRTytnwZt2trgxouLKXoASBfvfdmBB/70ms/TLoESB\njIhWfAL79mmv0ClxyUcma2ugzHU8gBp0KLpyNwQzSR86I+dwEUBhrhVH7oZa\naHkuG4ZPDuRl++og16j8hq/tMoppIvFslJ85m5YVzTSi0plUPeI4cME78JmY\nP3F60rjizbcD7IxpD4mRD0G0YOB4fdYpBN5OaKp8vgnBXG5QqspEoRUClPHE\nM4UH7Dc1CiNcVopKwHAbNYxICcBIRlmud0VetgoyuvbBoUyp+m5XPRW0/Mw6\naBDfrLNtmO2iduYFhOXkjzncMEcF2BT1qsk6wYNeW1JWHQdG26565n+2syRf\nFQ11T+8ubB01odNKJ+R4MZfmDY/ioVxjpNj1QYtEm2g5Q9Ihm2GjWPEvKmjx\nuyruiDCtKiPBWKPgs4+Rg30OGPux4+IOWROQ5xhklG48T+n8TXGIigG1I2He\nEpbDyvZmcXlHt+wkJ4xhhFCn8/uwL3DKEgq90/qX7oHwKSGOWJD77z4soQSU\n9k1BKyVKU/IxjfGmleYMqqOfsEaIrjE1iWucPRrQwEQ0G8gC8HZ0/c/c1ihL\nJQkS\r\n=vrFy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGQRO8o5Pc5rPYPAY+YJnWJI9Iwk+BdCJBQnt47e0VtPAiEAqXvGhggeiPm9CWd1GU0J/VfO6oGBMld1W/Wbn2asvRQ="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_2.4.0_1563295729693_0.9680822367824908"},"_hasShrinkwrap":false,"deprecated":"Deprecated `is` signature"},"3.0.0":{"name":"nani","version":"3.0.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"generate":"yo","generate:class":"yo @batterii/ts-class","generate:module":"yo @batterii/ts-module","generate:test":"yo @batterii/ts-test","lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-ts":"^1.2.1","@batterii/generator-ts-class":"^0.1.0","@batterii/generator-ts-module":"^0.1.0","@batterii/generator-ts-test":"^0.1.0","@types/chai":"^4.2.7","@types/lodash":"^4.14.149","@types/mocha":"^5.2.7","@types/node":"^10.17.12","@types/sinon":"^7.5.1","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","chai":"^4.2.0","eslint":"^5.16.0","mocha":"^6.2.2","sinon":"^7.5.0","sinon-chai":"^3.3.0","source-map-support":"^0.5.16","ts-node":"^8.5.4","typescript":"3.4.5","yo":"^2.0.6"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"759bd9ce6b002c894bfe715c7bbb307181455ddf","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.0.0","_nodeVersion":"10.16.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-drzVtmpIXVLh2IRPV1d0UixnbHDJ7/bqr4EoTKAdYqqoTQK/h1ipD6xGg3yhObzoewjsF0AZqOhiq0xod7kwhQ==","shasum":"3bccadf3f3df1477e25ac33f3081f355db81e030","tarball":"https://registry.npmjs.org/nani/-/nani-3.0.0.tgz","fileCount":51,"unpackedSize":68631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeAPvcCRA9TVsSAnZWagAACxoP/2NO1AE9bjwMc2M14yMY\n0grT47+CYq0oG+wGIoROfmwlf6Kr/OMGP/DWijL4Jbj/4ZbZ+RSHsMU73HjQ\nhIxeYFyw4sZNHyR4yJYtFkJG8zX1p5xsCs2hh0CjC5qTp2NAq23/9XDtjXd+\nqhHfae4HCroA5mRNtAdAAF5befXvp1CX9dJMtmpamAvQ0wzeGR8nCBYx0hI5\nd/IzK0UR8NPvM8Bf+ny1wGQCZ2Bda8dny9clSNSUVpnAFhss+fMC9y8q0U6l\n5izdqsXHfwmow8PAqbBucGLwI4vB4+4nbM0+IUAYl2brANQXoDXfNrc5KKMR\nbRXLQUWQv36s3uEJ6XW0NgcGoxl/9mNRn5MYeyLgpXmBT9lA3y2yBj6p+ag6\nM+tnd860jr6BKd+ZFIF3hCRttIj0NHSr9ZM9AKkuYlfx6O/8r2IvMa0u9Xid\na8zQMLV9Q5N1VieKxrnbRaTO8U5xn7WSRN1iAl58lxQvSBMW+iNmdMO1J7gs\nFrGf5f+pdpoPKoEf8gxTb0mlCKMfZDFr1Ld+eQxrwDM44wEilIznleGE/OZe\nH4ndi0chXUMpWY9Nj7hCg3qVbcVJG74iI9GT+JY8V1QnJDMRvX1HFDNZwUWR\ntfodTAwQ6z/ogkbpImT2LsxdPQ4ux7i4aTtYRZUrqG0RN30tGm6QYYv9yQpc\nstPM\r\n=CGfb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDIi9jNwtFGX5gJVeLYuEiq4jsEoTf9tdzq1uGBzJIstAiA+FHmSv+ADyIYiwI8vTkmPEHDDE3EW2gnNh1gK74Azrw=="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.0.0_1577122780048_0.7763733378876654"},"_hasShrinkwrap":false},"3.1.0":{"name":"nani","version":"3.1.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"generate":"yo","generate:class":"yo @batterii/ts-class","generate:module":"yo @batterii/ts-module","generate:test":"yo @batterii/ts-test","lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-ts":"^1.2.1","@batterii/generator-ts-class":"^0.1.0","@batterii/generator-ts-module":"^0.1.0","@batterii/generator-ts-test":"^0.1.0","@types/chai":"^4.2.7","@types/lodash":"^4.14.149","@types/mocha":"^5.2.7","@types/node":"^10.17.12","@types/sinon":"^7.5.1","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","chai":"^4.2.0","eslint":"^5.16.0","mocha":"^6.2.2","sinon":"^7.5.0","sinon-chai":"^3.3.0","source-map-support":"^0.5.16","ts-node":"^8.5.4","typescript":"3.4.5","yo":"^2.0.6"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"62e260b0b511aeb30f29de18afc0bb990e4f20c1","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.1.0","_nodeVersion":"10.16.0","_npmVersion":"6.13.6","dist":{"integrity":"sha512-A6Mgi2i/uycLDTvG3zs0QzJ0iyMfUG4gYzsAsglFdlnhCKjfxJYUITOD9xxZpIr5t+LMBmJBQ/a2BKfpRhL45w==","shasum":"14bdbf88586371947408c49bc9893ca82a5eb84d","tarball":"https://registry.npmjs.org/nani/-/nani-3.1.0.tgz","fileCount":51,"unpackedSize":70184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeI4HGCRA9TVsSAnZWagAAoJwP+wUf65aLzTpkg3E1Xaaa\n9pYTCINeABAiyOZK8+/LmXgwLw5eH7j4b8/rDIMvCBjMZUXHfsZ0LX63+sN3\nSQREYnbQOVtr2Pu0axeMq+JOj/TLFUzE2FiO1h4kAO3cfdh5vM63pY97c+d5\nUptvPCDf9CGgY7pkAViBno2deHPN4l69aP2hX9RnOu4uJNteBp8Nds3TgHte\n/X8vnSY3ZXp2EgAcaRHTasPy/8BaRB94PlC/CAgUDcGUz6l4LTGtgHJpLtK+\nyrlkg5EyF+ONeS1xx/cUJg3JU6z9Fkd8e1vric52DPHn3opxK+BuaqurlSxx\nU8rOgF4xAtVLA6SfFN3uscUw1VnuEIwb6r0EhHIC5gDUYIoj3utLpIxU93RI\nCylr0dsN1W5CXHYwLExm5eMOYC0K0U4i1FqZ9MmDtvYWZ04lW7JPPOt1Fehi\nSeIbRF1sZaPeNgTERKn5yZGnbYokiVRoe1IG1mXQ7W+KHBTq+UPoC9TdpzUz\nEhxtygBZkmwb8ljVELtf+J9TIL3RJMgTgwrIoAEJUNY3z/wrHcWsX4YL9xNJ\nIqRV0v9sEEnVyTsnusomYYVW/VxcyqfDgztPobyzCdyQ7AtA4AoVjxcBf69c\n8ZRsMt80TwYq3/3ru1FAREG76E6TYGZ8stukipA7PRzl2njlz2x0EqDXmnkI\nWMsL\r\n=ggZ9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsDTNmLWyK2PXxJqYKeVr0+5dn9z6qqBMN2XTxZ3w4AQIgeE2PhNdiBmiksOxCd+NiHRgaL1JrzfFgHzQC0bEc37k="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.1.0_1579385285709_0.30062553790800517"},"_hasShrinkwrap":false},"3.2.0":{"name":"nani","version":"3.2.0","description":"Better error handling for Node","author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"keywords":["error","verror"],"scripts":{"generate":"yo","generate:class":"yo @batterii/ts-class","generate:module":"yo @batterii/ts-module","generate:test":"yo @batterii/ts-test","lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-ts":"^1.2.1","@batterii/generator-ts-class":"^0.1.0","@batterii/generator-ts-module":"^0.1.0","@batterii/generator-ts-test":"^0.1.0","@types/chai":"^4.2.7","@types/lodash":"^4.14.149","@types/mocha":"^5.2.7","@types/node":"^10.17.12","@types/sinon":"^7.5.1","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","chai":"^4.2.0","eslint":"^5.16.0","mocha":"^6.2.2","sinon":"^7.5.0","sinon-chai":"^3.3.0","source-map-support":"^0.5.16","ts-node":"^8.5.4","typescript":"3.4.5","yo":"^2.0.6"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"2d72a86f566fd4758d0d9b7694db955d07ee98b4","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.2.0","_nodeVersion":"10.16.0","_npmVersion":"6.13.6","dist":{"integrity":"sha512-c0XTdN+qsv3lsBGbpSn/iG9Aw2XlE0lQloO6Cy5RDSC1WGh2tREKvIsQowXjoT/6/gP5A4MMBTRxmgv388Whuw==","shasum":"2b8f8e77721f9e380c8755d96afa491b50c8dbd3","tarball":"https://registry.npmjs.org/nani/-/nani-3.2.0.tgz","fileCount":51,"unpackedSize":71159,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJiwyCRA9TVsSAnZWagAAbgsP/1/5zc1j1U1svogggQnG\n+pPfN1gH4f5ffEoFLKTQP4MIsIBMFQOqVkfRr2uPaMcw4AbOTFEmzq8z72Cb\ng21WVHN4DafPYdXOCjRW4wLhQOH4bv9z2CV46YkAjUyUM3JTmvY1kLZXW+gk\nGGuHYOPq1GzhQxfmS+VnAZgnZgwWWBbTMOIXCqsb80fSqpLwbCuZBkp1vfku\nCjCASKb6lc/Y/BnaKc/5gltS3kDeWrtE1gRQ/hM5o2BdhJutjUCcHtYu7Wkm\n+XqLNfvCakxMuuf3pwcKxESnUt9v4zoyFD7jfyMwT/qt4wzoBfFZNIUI5ku5\ni8OLUzzd54iNBguEphnLLkLAAZpNppEWPQWcpH1e5mtq0H5g2hcfnlouK6gY\nHolhliOrakb3oNDGzdGuXqikV1ZwU60Al8TY/cQFQBKqDeidldX85BCS5nY9\niIbCf+QK46GN9DAUMFzjuVEkRYQDLcQdRxGCPIW5IA/Ti9iqYPMyUAp8WsRw\naF5roju6d9xf1CTLxSHUg6MRqidlC+oGMK+RdhkkuGbYfGi6OExHGymucv6i\nL98GBHId5pujtEkp3dc0De4XwiosYOjVCAVmZeyVCjR3LUhUVjq+4wpAr17D\n6la0x0kmJnfyeUZdAiO8OnR7VjJjYQTCM5bX8HIZSZ+SdGv89czJt7imlmJ3\nTHyc\r\n=XVoW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBfHLuy0xSdiA4Tcms7gH8AgTr/JvvrW26fF6rnh9iI2AiBB1/mP0a8zIT7sXdoDLwIMqBBrMqDEhvr8ax2hBaLkQg=="}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.2.0_1579559985637_0.721581557337911"},"_hasShrinkwrap":false},"3.2.1":{"name":"nani","version":"3.2.1","description":"Better error handling for Node","keywords":["error","verror"],"author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"engines":{"node":">=8.6","npm":">=5.3"},"scripts":{"generate":"yo","generate:class":"yo @batterii/ts-class","generate:module":"yo @batterii/ts-module","generate:test":"yo @batterii/ts-test","lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-ts":"^2.1.0","@batterii/generator-ts-class":"^0.2.0","@batterii/generator-ts-module":"^0.2.0","@batterii/generator-ts-test":"^0.1.1","@types/chai":"^4.2.9","@types/lodash":"^4.14.149","@types/mocha":"^7.0.1","@types/node":"^12.12.28","@types/sinon":"^7.5.1","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^2.21.0","@typescript-eslint/parser":"^2.21.0","chai":"^4.2.0","eslint":"^6.8.0","mocha":"^7.0.1","sinon":"^7.5.0","sinon-chai":"^3.5.0","source-map-support":"^0.5.16","ts-node":"^8.6.2","typescript":"3.8.2","yo":"^3.1.1"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"6afc774b641183063ea03eae46b6eac82bb0d988","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.2.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-42RVhjBqDGwhg4+hsyoiTn2GdvxgJlhsvWWDTwSEP06TAqI9h1XP7UvTIw2nQQeP+NHv9NG0XQvqlseg8YIdxA==","shasum":"d326324e9874488af24a05b59a941b60073dd16e","tarball":"https://registry.npmjs.org/nani/-/nani-3.2.1.tgz","fileCount":51,"unpackedSize":71259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVUnmCRA9TVsSAnZWagAAr2YP/jEAXqTUDJHZOljkSz66\niB2kdnu5gGDoj/haU1flQqj5ova0mgFDYTy3l1Q/l6UXBo3/viLkHdBIucnm\nB28/pAmEv3nOswKChKjMZPh9otN+SV42sDxR6DuEgjt+iAPONlsyP0lCiaUm\n0hTnwy3KX1dlyoLn/SQPJOKGolJSLxIIWEqcozzpNyL2q/POElYTMpnoEcql\nD+rA1e4jH/8NpvQuyz+HHG27k/p0ony0xoAGdBE1eplIQgI/ZmLuP5F9jahO\nRfcL028+t1Dn3b6q5wWyZQ3sMfVYUbIDkHZED+2NPg774CNh+aklo5C+wKEC\nN2irM0LWKA1Th3bjJ1nIX9tey5RVjgcgtQ5oV5muhCLLDjAY1huhJvc8mXk8\nsvL7U4+CbLAZssaNCdh5ioXCFkYiXr29XfDgjQeLbgpO3JYDmaEfRdNz2jyO\nIjNeXGBEePv1rPa9WcEnj59SmkRfkwrnUhEIaO8oE5THdPM9e7/KLXJkQ5KJ\nRr8cLIhV0kMtDKt6XtDMQxj/F3Hpt2zHzMVCodmMmNw8+WoDWL6siwGqaMOo\nRJQolSccYzqZPTTp2LhIeAGDgnOMsy38cnZUy3Vt5o3Xy0vKHdhtbWkTUEhO\nJduN1zKFBTmTH52lR1hySDZespdYBCXOf3xZAJLHXjscrQzk1W/3ZwTz0VxN\nId9q\r\n=0wiG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6um8dvxSP4fGZSb5F1J6TXEro5VPsdpukzZ3K7ITLIwIhAPD9FEO3wkCpc+TyIhg59tAadK4tYcWwxMUkZ0HhD4/4"}]},"maintainers":[{"email":"steve.ripberger@gmail.com","name":"sripberger"}],"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.2.1_1582647781642_0.7034419300272317"},"_hasShrinkwrap":false},"3.2.2":{"name":"nani","version":"3.2.2","description":"Better error handling for Node","keywords":["error","verror"],"author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"engines":{"node":">=8.6","npm":">=5.3"},"scripts":{"lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-vurvey":"^0.3.6","@types/chai":"^4.2.9","@types/lodash":"^4.14.149","@types/mocha":"^9.1.1","@types/node":"^16.11.33","@types/sinon":"^10.0.11","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","chai":"^4.2.0","eslint":"^7.32.0","mocha":"^9.2.2","sinon":"^10.0.0","sinon-chai":"^3.5.0","source-map-support":"^0.5.16","ts-node":"^10.7.0","typescript":"^4.6.4"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"189d5089842f5049c86ac06c353299152c9434d7","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.2.2","_nodeVersion":"16.13.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-pIIrvbA0/Ohn+ClZE/xbOQMNv5UbfD0dmcJ3jMfw3I3ZjGFHPrM5ca2CDbKd+wD/EfT1GNbEsGYRhk6Glf/Beg==","shasum":"ac9e0b3a8c538911fa9444299811a065d4d3600d","tarball":"https://registry.npmjs.org/nani/-/nani-3.2.2.tgz","fileCount":53,"unpackedSize":72122,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICe9BvZps3JtmsVMbjMm3mdKbM8enTUfAegzH4NJW6IPAiA9UvE77ll2WUiJNzMo4zXr+cIecC8j05If9soaeJ1d4g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJicAALACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpEfQ/6AhMMAcQrYTN0dTZ5ZGmJHs+FqkiaCaLY0A0oj5wYKFutuH9o\r\nMDbqnRFpzlEro+VpKHmI9VXybKH+LTPG0eeZsxT+/69ao4gmy1KfVHJbgFDj\r\nZafi27cD9l69BqxGMzY3BpXdjg7Sf7sjNYjphLSr7tA01Q/CFeychNpSSy4z\r\nDfnVm3qAX8Yhka0ZX9yadAqJMV8Qppb7RHUsECJZUcM1Y1CvG3CJVyNy3Yrj\r\nLJ8ysPxEyJQV4UHzn5xHVAjkRowV7anvaOEmPpJwA8MAXiRYyGI1Poqsw+1O\r\n98ZEhoKG8fEjzTbykFe4RUI27cgqICcMrupRXPufExkKHvwFuChNYSW9tz2E\r\nHLNWuQMNo8MgDZV/0w2VhTlpsJGBAo3t64SmqUZghR9aZD2t4LeHW2r390c6\r\nTHqQh93olpWyczT8cawB+QIpwiNjzQ2eagpDR8gI20uhnn4WS4VQYgZAVszj\r\nCPZ1XLVIqgUy600NnVjg7qUL9WfJKPjjPJtgbArjkJuMFxAgIjpToJZyfD/k\r\nUsjJMd2TT3ZyjPiDnxeaNAO/ZDy2aMvzVincCAJcCL+iT/nLb3sE8qRLKk3B\r\nIFGdkY+HDjjPBAaRM5Zwhvlkx7o/Q2CmBPkk7C0PsQ07tjVskIRzGXOhpHdI\r\nS9PVTXo9//+7mvD1TYG5Z1Qb5f2mle7jEL0=\r\n=TqP4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"maintainers":[{"name":"sripberger","email":"steve.ripberger@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.2.2_1651507210818_0.8148375289103889"},"_hasShrinkwrap":false},"3.2.3":{"name":"nani","version":"3.2.3","description":"Better error handling for Node","keywords":["error","verror"],"author":{"name":"Steve Ripberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"engines":{"node":">=8.6","npm":">=5.3"},"scripts":{"lint":"eslint . --ext .ts","lintf":"eslint . --ext .ts --fix","prebuild":"rm -rf dist","build":"tsc && tsc --project tsconfig-types.json","test":"mocha","test:unit":"mocha test/unit","test:integration":"mocha test/integration","test:build":"npm run build && mocha --config .mocharc-dist.yaml dist/test","preversion":"npm run lint && npm run test:build","prepublishOnly":"git push && git push --tags"},"main":"dist/lib/index.js","types":"dist/types/index.d.ts","devDependencies":{"@batterii/eslint-config-vurvey":"^0.3.6","@types/chai":"^4.2.9","@types/lodash":"^4.14.149","@types/mocha":"^9.1.1","@types/node":"^16.11.33","@types/sinon":"^10.0.11","@types/sinon-chai":"^3.2.3","@typescript-eslint/eslint-plugin":"^5.21.0","@typescript-eslint/parser":"^5.21.0","chai":"^4.2.0","eslint":"^7.32.0","mocha":"^9.2.2","sinon":"^10.0.0","sinon-chai":"^3.5.0","source-map-support":"^0.5.16","ts-node":"^10.7.0","typescript":"^4.6.4"},"dependencies":{"lodash":"^4.17.15"},"gitHead":"e06c7670a514e8b4766a975382999ef0a794c9a1","bugs":{"url":"https://github.com/sripberger/nani/issues"},"homepage":"https://github.com/sripberger/nani#readme","_id":"nani@3.2.3","_nodeVersion":"16.13.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-NpW3yzkTdvH+z9GH3YJCuPsirZVsNuPR/6T2vmN61ED1K58s6Bj6aZh5Q+6BlWuKUrCWlfTX4FrTX4hsQSPXoQ==","shasum":"4d0a8d812e50653199406d55488d6409d63d03be","tarball":"https://registry.npmjs.org/nani/-/nani-3.2.3.tgz","fileCount":50,"unpackedSize":71518,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDepM+IGYxv4BVokiNPKx/VNT9UEFwbbLEnw5YQMQSJ2gIgPHriBwY2zPaSxXyeG7NucAf6smMyrd6pWi0s+CwGZRM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJicBTDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGcxAAgQii2Ed2GmOChxq3p9J4CZtg45PoQDPvTVftPS2r97diY7RU\r\nKKcuNF3ecHw1eSf7W4x2//leKW4R5BFpG7nB0q0wXK4X6GmVC/GwCnzreiJj\r\nzFe7ppP+e18vT40/Ke9BNYzIbRZ2rzq1SIF3wr1VKb0C1dCwivkhOZQ0ztcM\r\nTZS6wJa+kHGcF75lb5ApWnAHXdoAjitszKtO5FMVEkh4wlrGpt17vZ8Klfce\r\nsMjRb0VARAVXYtmt7DdePWW1oWYnSk8sObFQHSBRjx1ruCFoDwoNbFUiR+1D\r\nSTYEr8yfsez+Y3RuBM5KAb4HUv7dEo8a77HO30OI3o8xtJpRYBypmEQ7Dxxa\r\n8vp7y6q+O/7Z7RGN3S0fkBf4Ob4v7C1vI5cTwAcrWjn+6sEsLZ05KyVGPBE5\r\nEmlriDo8u0k7Ik1uPdbDT9y4oUSVfqp1ne99FUwYt8GCAtrT3pSi9sJQdDOK\r\nJgAWlRS/9In01/rq3rm/9IVLtpjlBPgnnVzfOhBRCXiZqvq10OD75oQHozJN\r\nFXAimSqFULrCuoPaPpTaG42Ss4lIAX4/TPC7ticQOBNyGTAfIiOnQMORsQ8r\r\nAVmMRX3OXJqUoNKDl1lBWQXqjMivJmDATg0U3PRLTadHD+L2DFaPZB6KRxFs\r\nwRCzjpUKQeB1RVOO94mp+NkVFzQThj36eCM=\r\n=qJ9d\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sripberger","email":"steve.ripberger@gmail.com"},"directories":{},"maintainers":[{"name":"sripberger","email":"steve.ripberger@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nani_3.2.3_1651512515081_0.15277940245560884"},"_hasShrinkwrap":false}},"readme":"# Nani\nBetter Error handling for Node, inspired in part by\n[VError](https://www.npmjs.com/package/verror). Includes a base class for custom\nerror types, along with utilities for identifying your errors based on their\nclass hierarchy *without* relying on `instanceof`.\n\nMakes it easier to tell what happened when things explode. :)\n\n![Screenshot](https://github.com/sripberger/nani/raw/master/nani.png)\n\n## Recent Changes\nThis section will include detailed explanation for only the most recent major or\nminor releases. You can view a full changelog [here](./CHANGELOG.md).\n\n### `usedDefaultMessage` property\nAs of `v3.2.0`, the `NaniError` constructor sets the `usedDefaultMessage`\nproperty, depending on whether or not a shortMessage was provided to it. This\nis intended to be used for unit testing, allowing you to easily write tests that\nensure an error was thrown with a default message, without actually caring what\nthe default message *is*.\n\n### Static `prefix` property\nAs of `v3.1.0`, you can specify a static `prefix` property on your error\nclasses. This string will be prepended to the full messages of all errors of\nthat type. It will not affect the `shortMessage` property, however.\n\nThe prefix, if present, is separated from the short message the same way cause\nmessages are separated from one another, with a colon surrounded by spaces.\n\n### `is` Function Signature (BREAKING CHANGE)\nAs of `v3.0.0`, the `is` function's positional arguments have been reversed. The\noriginal signature was chosen because to me, it seemed to read closer to\nEnglish, but it isn't really idiomatic with JS in general and ultimately is more\nlikely to confuse people familiar with libraries like `lodash`, which always put\nthe primary operand of an operation on the left side. To see if a collection\nincludes a value with lodash, for example, you would do this:\n\n```js\n_.includes(collection, value);\n```\n\n`is` is also intended mostly as a drop-in replacement for the `instanceof`\noperator, so even within the JS standard itself, the original signature is just\nbackwards for no good reason. While this might not seem like a big deal, it is\nsomething that is better changed sooner than later, if it's going to be changed\nat all. As such, I've changed it now, and will be deprecating all versions\nprevious to v3.0.0.\n\nSince the package originally published with this name (any 1.x release) is\nsomething completely different, it's hard to tell based on downloads alone how\nmany dependents this change will affect. I don't plan on continuing to add any\nfeatures for the 2.x releases, but if you end up needing one-- and don't want to\nswitch all of your `is` usages over just yet-- feel free to file an issue on\nGitHub and I'll take a look.\n\n\n## The Cause Chain\nUsers of VError will be familiar with cause message chains, but for those that\nare not, the idea is that errors can be given a `cause` when constructed. A\ncause's message will be chained to the end of the wrapping error's message,\nmaking it easy for a human programmer to get the full story at a glance.\n\nNani provides the `NaniError` class for this purpose, among other features:\n\n```js\nconst { NaniError } = require('nani');\n\ntry {\n\tJSON.parse('invalid JSON');\n} catch (err) {\n\tthrow new NaniError({\n\t\tshortMessage: 'Parsing failed',\n\t\tcause: err\n\t});\n}\n\n/*\nRunning the above code produces something like the following:\n\nNaniError: Parsing failed : Unexpected token i in JSON at position 0\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:6:8)\n    at Module._compile (module.js:635:30)\n    at Object.Module._extensions..js (module.js:646:10)\n    at Module.load (module.js:554:32)\n    at tryModuleLoad (module.js:497:12)\n    at Function.Module._load (module.js:489:3)\n    at Function.Module.runMain (module.js:676:10)\n    at startup (bootstrap_node.js:187:16)\n    at bootstrap_node.js:608:3\n*/\n```\n\nThe cause is of course optional, and defaults to `null`. If the `shortMessage`\nis omitted, a generic default one will be used instead.\n\nThe `cause`, `shortMessage`, and full `message` will be available as properties\non the created error.\n\n\n## Hiding Cause Messages\nOccasionally, you will want an error's message to simply match its shortMessage,\nwithout appending the cause's message. To do so, set the `hideCauseMessage`\noption to `true`. This will cause the `NaniError` to behave somewhat like a\n`WError`:\n\n```js\nconst { NaniError } = require('nani');\n\ntry {\n\tJSON.parse('invalid JSON');\n} catch (err) {\n\tthrow new NaniError({\n\t\tshortMessage: 'Parsing failed',\n\t\tcause: err,\n\t\thideCauseMessage: true\n\t});\n}\n\n/*\nRunning the above code produces something like the following:\n\nNaniError: Parsing failed\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:6:8)\n    at Module._compile (module.js:635:30)\n    at Object.Module._extensions..js (module.js:646:10)\n    at Module.load (module.js:554:32)\n    at tryModuleLoad (module.js:497:12)\n    at Function.Module._load (module.js:489:3)\n    at Function.Module.runMain (module.js:676:10)\n    at startup (bootstrap_node.js:187:16)\n    at bootstrap_node.js:608:3\n*/\n```\n\nThis can be useful for public-facing API's where you don't want to clutter\nthe error messages your users see with internal stuff they don't care about,\nwhile still preserving the underlying cause chain for your own debugging\npurposes.\n\n\n## Viewing the Full Stack\nNode's default uncaught exception handler simply prints out the `stack` property\nof the exception to `stderr` and exits. This, of course, doesn't tell you\nanything about the stack traces in the cause chain. To view this, Nani provides\nthe `getFullStack` function:\n\n```js\nconst { NaniError, getFullStack } = require('nani');\n\n// Setting our own uncaught exception handler.\nprocess.on('uncaughtException', (err) => {\n\t// Print full stack to sterr and exit.\n\tconsole.error(getFullStack(naniErr));\n\tprocess.exit(1);\n});\n\ntry {\n\tJSON.parse('invalid JSON');\n} catch (err) {\n\tthrow new NaniError({\n\t\tshortMessage: 'Parsing failed',\n\t\tcause: err\n\t});\n}\n\n/*\nRunning the above code produces something like the following:\n\nNaniError: Parsing failed : Unexpected token i in JSON at position 0\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:13:8)\n    at Module._compile (module.js:653:30)\n    at Object.Module._extensions..js (module.js:664:10)\n    at Module.load (module.js:566:32)\n    at tryModuleLoad (module.js:506:12)\n    at Function.Module._load (module.js:498:3)\n    at Function.Module.runMain (module.js:694:10)\n    at startup (bootstrap_node.js:204:16)\n    at bootstrap_node.js:625:3\nCaused by: SyntaxError: Unexpected token i in JSON at position 0\n    at JSON.parse (<anonymous>)\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:11:7)\n    at Module._compile (module.js:653:30)\n    at Object.Module._extensions..js (module.js:664:10)\n    at Module.load (module.js:566:32)\n    at tryModuleLoad (module.js:506:12)\n    at Function.Module._load (module.js:498:3)\n    at Function.Module.runMain (module.js:694:10)\n    at startup (bootstrap_node.js:204:16)\n    at bootstrap_node.js:625:3\n*/\n```\n\n`getFullStack` works even if the provided error is not an instance of\n`NaniError`, so you can safely use it even if you might be dealing with a plain\nold JS Error. If the error has no `cause` property, it will simply print out the\nstack as normal.\n\n\n## Error Info\nLike `VError`, `NaniError` supports arbitrary data in the form of the `info`\nobject, which can be used to provide further detail about what happened. This\nwill be available as the `info` property on the instance:\n\n```js\nconst err = new NaniError({\n\tshortMessage: 'Omg bad error!',\n\tinfo: { foo: 'bar', baz: 'qux' }\n});\n\nconsole.log(err.info.foo);\nconsole.log(err.info.baz);\n/*\nRunning the above code logs the following:\n\nbar\nqux\n*/\n```\n\nSince digging through the whole cause chain for all of its info can be tedious,\nNani provides the `collapseInfo` function, which assigns the properties from all\ninfo objects in the chain together into a single object:\n\n```js\nconst err = new NaniError({\n\tshortMessage: 'Omg bad error!',\n\tinfo: { foo: 'bar' },\n\tcause: new NaniError({\n\t\tshortMessage: 'Cause of bad error',\n\t\tinfo: { baz: 'qux' }\n\t})\n});\n\nconsole.log(collapseInfo(err));\n\n/*\nRunning the above code would log the following:\n{\n\tfoo: 'bar',\n\tbaz: 'qux'\n}\n*/\n```\n\nIf the same info property name is encountered more than once in the chain, the\nvalue *earlier* in the chain is prioritized.\n\n\n## Shorthand Constructors\nMuch of the time the `shortMessage` and `cause` options are the only ones you\nneed when creating `NaniError` instances, so the constructor also supports\nshorthand signatures like so:\n\n```js\n// shortMessage only.\nthrow new NaniError('Omg bad error!');\n\n// cause only.\nthrow new NaniError(new Error('Cause of the error'));\n\n// shortMessage and cause.\nthrow new NaniError('Omg bad error!', new Error('Cause of the error'));\n\n// shortMessage, cause, and additional options.\nthrow new NaniError('Omg bad error!', new Error('Cause of the error'), {\n\t// Additional options can be included here...\n\thideCauseMessage: true,\n\tinfo: { foo: 'bar' }\n});\n\n// default everything\nthrow new NaniError();\n```\n\n\n## Iterating Through the Cause Chain\nFor convenience, Nani provides a\n[generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)\ncalled `iterate`, which makes it easy to step through an error and it's cause\nchain:\n\n```js\nconst { NaniError, iterate } = require('nani');\n\nconst err = new NaniError({\n\tshortMessage: 'foo',\n\tcause: new NaniError({\n\t\tshortMessage: 'bar',\n\t\tcause: new Error('baz')\n\t})\n});\n\nfor (const e of iterate(err)) {\n\tconsole.log(e.message);\n}\n\n/*\nRunning the above code logs the following:\n\nfoo : bar : baz\nbar : baz\nbaz\n*/\n```\n\nAs you can see, the error itself appears first, followed by each of its causes\nin sequence.\n\n`iterate` works even if the error is just a plan old JS error with no cause, so\nyou can safely use it even when you're not sure the cause chain will be there:\n\n```js\nconst err = new Error('Omg bad error!');\n\nfor (const e of iterate(err)) {\n\tconsole.log(e.message);\n}\n/*\nRunning the above code logs the following:\n\nOmg bad error!\n*/\n```\n\n### A Note On Circular References\nGenerally, you want to avoid having any references on your errors that point to\nerrors earlier in the cause chain, as doing so can lead to infinite loops and\nother critical errors, especially if you need to serialize your errors.\n\nIn the event that you *do* cause such a circular reference, the `iterate`\nfunction will ignore it. This is really more to make Nani's functions more\nrobust, but you should probably never do this on purpose:\n\n```js\nconst { NaniError, iterate } = require('nani');\n\nconst cause = new NaniError('Cause of error');\nconst err = new NaniError('Omg bad error!', cause);\n\n// Circular reference created here.\n// Again, *you should never actually do this!*\ncause.cause = err;\n\nfor (const e of iterate(err)) {\n\tconsole.log(e.message);\n}\n\n/*\nRunning the above code logs the following:\n\nOmg bad error! : Cause of error\nCause of error\n*/\n```\n\n\n### Iteration Utilities\nIn addition to the `iterate` function itself, Nani includes utility functions\nfor operations you're commonly going to want to do while iterating:\n\n- `find`: Returns the first error in the chain matching a predicate function.\n- `filter`: Returns all errors in the chain that match a predicate function.\n\n```js\nconst { NaniError, find, filter } = require('nani');\n\nconst err = new NaniError({\n\tshortMessage: 'foo',\n\tcause: new NaniError({\n\t\tshortMessage: 'bar',\n\t\tinfo: { isCool: true },\n\t\tcause: new NaniError({\n\t\t\tshortMessage: 'baz',\n\t\t\tinfo: { isCool: false },\n\t\t\tcause: new NaniError({\n\t\t\t\tshortMessage: 'qux',\n\t\t\t\tinfo: { isCool: true }\n\t\t\t})\n\t\t})\n\t})\n});\n\nconsole.log(find((e) => e.info && e.info.isCool));\n// { NaniError: bar : baz : qux }\n\nconsole.log(filter((e) => e.info && e.info.isCool));\n// [ { NaniError: bar : baz : qux }, { NaniError: qux } ]\n```\n\n\n## MultiErrors\nSometimes you run into situations where you need to collect multiple errors\ntogether and present them as one, instead of simply failing at the first.\nCommon use cases for this include validation-- where you may want to display\nto the user all the problems, instead of just the first one your validation code\nencountered-- or collections of async operations where some operations may fail\nindependently of the others.\n\nLike `VError`, Nani provides a `MultiError` class for handling these\nsituations:\n\n```js\nconst { MultiError } = require('nani');\n\nconst err = new MultiError([\n\tnew Error('foo'),\n\tnew Error('bar')\n]);\n\n// Message only shows the first error, but notes that there are more.\nconsole.log(err.message);\n// First of 2 errors: foo\n\n// The first error in the list is treated as the primary cause:\nconsole.log(err.cause);\n// { Error: foo }\n\n// Full error list is available as the `errors` property:\nconsole.log(err.errors);\n// [ { Error: foo }, { Error: bar } ]\n```\n\nFor convenience, you can also provide the error list directly as arguments to\nthe constructor, instead of wrapping them in an array. The following is\nequivalent to the constructor call above:\n\n```js\nconst err = new MultiError(new Error('foo'), new Error('bar'));\n```\n\n### Creating MultiErrors\nYou can use the `MultiError` constructor directly as shown above, or you can use\nNani's `fromArray` utility function. This function is similar to VError's\n`errorFromList` method, in that it will wrap an array of errors in a\n`MultiError` if and only if it is necessary to do so:\n\n- If the provided array is empty, it returns `null`.\n- If the provided array has only one element, it returns that element.\n- If the provided array has more than one element, it returns a `MultiError`\n  with the array as its `errors` property.\n\n```js\nconst { NaniError, fromArray } = require('nani');\n\n// Assume this returns an array with some unknown number of errors...\nconst causes = getSomeErrors();\n\n// This will either have null or a single error as its cause.\nthrow new NaniError('Some bad things maybe happened', fromArray(causes));\n```\n\n\n### Iterating MultiErrors\nUnlike VError, Nani makes it easy to iterate not just through primary causes,\nbut through the entire cause chain of every error in your `MultiError`s, as\nwell. Simply use the `iterate` function:\n\n```js\nconst { NaniError, MultiError, iterate } = require('nani');\n\nconst err = new NaniError({\n\tshortMessage: 'outermost error',\n\tcause: new MultiError(\n\t\tnew NaniError('inner error', new Error('innermost error')),\n\t\tnew NaniError('another inner error')\n\t)\n});\n\nfor (const e of iterate(err)) {\n\tconsole.log(e.message);\n}\n\n/*\nRunning the above code will log the following:\n\noutermost error : First of 2 errors : inner error : innermost error\nFirst of 2 errors : inner error : innermost error\ninner error : innermost error\ninnermost error\nanother inner error\n*/\n```\n\nAs you can see, `iterate` steps through the entire cause chain of each error\nin a `MultiError` before proceeding to the next. As long as you build your error\nstructures well, you can be certain that `iterate` will touch every Error\ninstance in the entire structure.\n\nThe behavior demonstrated above holds true for the previously-described\niteration utilities-- `find` and `filter`-- in addition to the `iterate`\nfunction itself. It is also reflected in `collapseInfo`, which processes each\nerror in the chain in the same order.\n\n\n### A Note On Duplicate References\nMultiErrors allow you to potentially duplicate references to the exact same\nobject in your error structures. This should generally be avoided for reasons\nsimilar to the circular references described above.\n\nIn the event that you *do* duplicate an error in the structure, `iterate` will\nyield it only once, and ignore it from that point forward:\n\n```js\nconst { NaniError, iterate } = require('nani');\n\nconst nestedErr = new NaniError('Nested error');\nconst err = new MultiError(nestedErr, nestedErr);\n\nfor (const e of iterate(err)) {\n\tconsole.log(e.message);\n}\n\n/*\nRunning the above code logs the following:\n\nNested error\n*/\n```\n\n\n## Customizing the Default Message\nIf you have an error message that you find yourself using a lot, you can easily\nreplace the usual generic default error message by simply inheriting from\n`NaniError` and overriding the static `getDefaultMessage` method:\n\n```js\nconst { NaniError } = require('nani');\n\nclass MyError extends NaniError {\n\tstatic getDefaultMessage() {\n\t\treturn 'Holy crap, bad stuff happened!';\n\t}\n}\n\nthrow new MyError();\n\n/*\nRunning the above code produces something like the following:\n\nMyError: Holy crap, bad stuff happened!\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:9:7)\n    at Module._compile (module.js:635:30)\n    at Object.Module._extensions..js (module.js:646:10)\n    at Module.load (module.js:554:32)\n    at tryModuleLoad (module.js:497:12)\n    at Function.Module._load (module.js:489:3)\n    at Function.Module.runMain (module.js:676:10)\n    at startup (bootstrap_node.js:187:16)\n    at bootstrap_node.js:608:3\n*/\n```\n\n\n### Putting Info in the Default Message\nThe `getDefaultMessage` method receives a single argument, which will be a\nreference to the `options.info` object, if any, or a empty object otherwise.\nThis makes it easy to include some of that info in your error messages:\n\n```js\nconst { NaniError } = require('nani');\n\nclass MyError extends NaniError {\n\tstatic getDefaultMessage(info) {\n\t\treturn `Holy crap, ${info.what || 'bad stuff'} happened!`;\n\t}\n}\n\nthrow new MyError({ info: { what: 'terrible things' } });\n\n/*\nRunning the above code produces something like the following:\n\nMyError: Holy crap, terrible things happened!\n    at Object.<anonymous> (/home/sripberger/projects/personal/nani/omg.js:9:7)\n    at Module._compile (module.js:635:30)\n    at Object.Module._extensions..js (module.js:646:10)\n    at Module.load (module.js:554:32)\n    at tryModuleLoad (module.js:497:12)\n    at Function.Module._load (module.js:489:3)\n    at Function.Module.runMain (module.js:676:10)\n    at startup (bootstrap_node.js:187:16)\n    at bootstrap_node.js:608:3\n\n*/\n```\n\n\n## The Dilemma: Identifying Standard JS Errors\nThough it is generally favored by most JS developers, the practice of\n[duck typing](https://en.wikipedia.org/wiki/Duck_typing) tends to fall flat\nwhen it comes to error handling. `Error` instances are all fairly similar to\neach other and don't really have any behavior-- i.e. methods-- to use as your\n'does it walk' or 'does it quack' tests.\n\nTo identify what kind of error you're looking at, you need some other mechanism.\nOne way is to look at the properties of the error itself. An `Error` instance\nhas only two standard properties-- `message` and `name`.\n\n`message` doesn't work because error messages are meant to be human-readable and\nare frequently subject to change. Identifying errors based on their message can\nthus be messy and quite unreliable.\n\n`name` potentially works, and is the preferred method of many developers. Every\nkind of error can have a unique `name` which is machine-readable unlikely to\nchange. Unfortunately, this approach can be rather limiting compared to\ntraditional type systems, as it does not support hierarchies.\n\nFor example, if you wanted a set of possible password validation errors--\none that indicates that the password is too short, one that indicates that\nthe password doesn't have at least one uppercase character, and another\nthat indicates the password doesn't have at least one number, you might\nconstruct and throw them like so:\n\n```js\nconst err = new Error('Too short');\nerr.name = 'TooShortError';\nthrow err;\n```\n```js\nconst err = new Error('Needs at least one uppercase letter');\nerr.name = 'NoUppercaseError';\nthrow err;\n```\n```js\nconst err = new Error('Needs at least one number');\nerrr.name = 'NoNumberError';\nthrow err;\n```\n\nNow you can easily tell these errors apart in consuming code by checking their\nnames:\n\n```js\ntry {\n\tvalidatePassword(password);\n} catch (err) {\n\tif (error.name === 'TooShortError') {\n\t\t// Handle TooShortError.\n\t} else if (error.name === 'NoUppercaseError') {\n\t\t// Handle NoUppercaseError\n\t} else if (error.name === 'NoNumberError') {\n\t\t// Handle NoNumberError\n\t} else {\n\t\t// Rethrow an unknown error.\n\t\tthrow err;\n\t}\n}\n```\n\nNow, what if you decide you want to specify some more general code, to handle\nany kind of password validation error without necessarily caring about which\nspecific *kind* of password validation error it is?\n\nWithout changing the error names, all we really can do is check for each\npossible name, which as you can imagine gets out of hand rather quickly as you\nadd more kinds of errors:\n\n```js\ntry {\n\tvalidatePassword(password);\n} catch (err) {\n\tif (\n\t\terror.name === 'TooShortError' ||\n\t\terror.name === 'NoUppercaseError' ||\n\t\terror.name === 'NoNumberError'\n\t) {\n\t\t// Handle any kind of password validation error.\n\t} else {\n\t\t// Rethrow an unknown error.\n\t\tthrow err;\n\t}\n}\n```\n\nThis approach is also a huge pain for anybody consuming your code. You might\nadd a new kind of password validation error, and they'll potentially have to\nupdate all of their handling code to check for it.\n\nAnother possible approach is to start prefixing our error names in some way,\nand check for the prefix instead of checking the entire name:\n\n```js\nconst err = new Error('Too short');\nerr.name = 'PasswordTooShortError';\nthrow err;\n```\n```js\nconst err = new Error('Needs at least one uppercase letter');\nerr.name = 'PasswordNoUppercaseError';\nthrow err;\n```\n```js\nconst err = new Error('Needs at least one number');\nerrr.name = 'PasswordNoNumberError';\nthrow err;\n```\n\n\n```js\ntry {\n\tvalidatePassword(password);\n} catch (err) {\n\tif (err.name.startsWith('Password')) {\n\t\t// Handle any kind of password validation error.\n\t} else {\n\t\t// Rethrow an unknown error.\n\t\tthrow err;\n\t}\n}\n```\n\nThis last approach isn't terrible, but figuring out the proper prefix can be\ndifficult and prone to mistakes as there's no standard to follow. Collisions\nwith prefixes and names from elsewhere are likely, and again... if you change\nthe names of any of your errors, all of the handling code has to change.\n\nWhile we've discussed `message` and `name`, there are also plenty of\nnon-standard properties out there that you'll find for accomplishing something\nlike this. Node itself tends to use `code`, which is a machine-readable string\nthat is unlikely to change. Others might have numeric `code` or `errno`\nproperties. Aside from their separation from the standard `name` property that\neffects the stack trace of the error, these are generally subject to the same\nlimitations that `name` is subject to. There's no standard, and there is no way\nof easily supporting error type hierarchies. Numeric identifiers in particular\ncan be a pain, because they force you to look them up in documentation instead\nof just knowing what they are by reading them.\n\nLong story short, identifying errors in JS kind of sucks. :\\\n\n\n### What About `typeof` and `instanceof`?\nThose who are unfamiliar with the quirks Node development and JS as a language\nmay be tempted to look into JS's standard\n[typeof](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)\nand\n[instanceof](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof)\noperators to accomplish something similar to the static-type-based error\nhandling of languages like Java and C#.\n\nThe problem you'll run into *immediately* with `typeof` is that it generally\ntells you next to nothing about non-primitives (which includes Error instances):\n\n```js\nconsole.log(typeof 42);\n// number\n\nconsole.log(typeof 'asdf');\n// string\n\nconsole.log(typeof true);\n// boolean\n\n// Ok, so far so good, now let's try some error instances.\n\nconsole.log(typeof new Error('omg'));\n// object\n\nconsole.log(typeof new TypeError('wow'));\n// object\n```\n\nRight, so that isn't useful. How about `instanceof`? After all, we can easily\nmake our error types into subclasses using ES6 class syntax:\n\n```js\nclass PasswordValidationError extends Error {}\nclass TooShortError extends PasswordValidationError {}\nclass NoUppercaseError extends PasswordValidationError {}\nclass NoNumberError extends PasswordValidationError {}\n```\n\nYou could also use its approximate equivalent in ES5:\n\n```js\nfunction PasswordValidationError(message) {\n\tError.call(this, message)\n}\nPasswordValidationError.prototype = Object.create(Error.prototype);\n\nfunction TooShortError(message) {\n\tPasswordValidationError.call(this, message)\n}\nTooShortError.prototype = Object.create(PasswordValidationError.prototype);\n\nfunction NoUppercaseError(message) {\n\tPasswordValidationError.call(this, message)\n}\nNoUppercaseError.prototype = Object.create(PasswordValidationError.prototype);\n\n\nfunction NoNumberError(message) {\n\tPasswordValidationError.call(this, message)\n}\nNoNumberError.prototype = Object.create(NoNumberError.prototype);\n```\n\nWith either of these, you can then create and throw your errors like this:\n\n```js\nthrow new TooShortError('Password is too short');\n```\n```js\nthrow new NoUppercaseError('Password must have an uppercase letter');\n```\n```js\nthrow new NoNumberError('Password must have a number');\n```\n\nThen, ideally, you can handle your errors like this:\n\n```js\ntry {\n\tvalidatePassword(password);\n} catch (err) {\n\tif (err instanceof TooShortError) {\n\t\t// Handle the too short error.\n\t} else if (err instanceof PasswordValidationError) {\n\t\t// Handle any other kind of password validation error.\n\t} else {\n\t\t// Rethrow an unknown error.\n\t\tthrow err;\n\t}\n}\n```\n\nIf you try this approach, the results might seem promising at first, but there\nis a relatively subtle limitation of `instanceof` that can and will cause you\nsome major headaches.\n\nWhile it may seem similar at a glance `instanceof` is *not* an equivalent to\ntrue static type checking, which is not possible in vanilla JS. `instanceof`\nmerely approximates, by searching the first operand's prototype chain to see\nif it ever contains the exact same object as the `prototype` property of its\nsecond operand.\n\nThis will never give you a false positive, but it *can* give you false negatives\nif you're ever in a situation where an object was created with a *copy* of the\nsecond operand. Yes, the prototype objects might be similar, but they are not\nliterally the exact same object, which causes the check to fail.\n\nThe classic example of this from web browsers is when dealing with instances\npassed across frames and/or iframes. In Node, this same issue might happen when\nyou have multiple versions of the same constructor in your dependency tree,\na not-uncommon situation that can arise when:\n\n- Conflicting dependency semver expressions require two different versions of\n  the same module.\n- Some installed modules can share the same version, but not yet been deduped.\n- `npm link` is used for anything whatsoever.\n\nAdditionally, when you're transferring errors between various services and\ninstances of services-- as is common in Node architectures-- you may need to\nserialize them and then rebuild them elsewhere. In order for `instanceof` to\nkeep working, you would need to re-instantiate every error, and every error in\nits cause chain, using the same constructors. This can be complicated and\nfairly prone to mistakes.\n\nIn any of the above scenarios, the above `catch` block could rethrow a\n`PasswordValidationError`. If that error is not caught somewhere further up the\ncall stack, it could of course crash your entire app.\n\nObviously this is a huge problem, so long story short: `instanceof`, while it\nhas its uses, is not really robust enough for this purpose.\n\n\n### A Solution: Full Names\nTo solve this dilemma-- allowing you to do something like traditional error\ntype-checking without relying on `instanceof`-- Nani uses a property called\n`fullName`. It's similar to the prefixing solution discussed above, except that\nfull names follow a simple, predictable format and are easy to generate based on\nsyntax you may already be using.\n\nThe basic idea is this: An error class's name is simply the name of its\nconstructor function. It's fullName, however, is a dot-separated list of all of\nthe constructor names in its inheritance chain. Both of these properties are\navailable on all instances of error constructors, as well.\n\nThe `NaniError` class implements these properties, so as long as you include it\nat the base of your hierarchies, generating fullNames requires no effort on\nyour part.\n\nFor example, to make the password validation hierarchy discussed above, it's\njust this simple:\n\n```js\nconst { NaniError } = require('nani');\n\nclass PasswordValidationError extends NaniError {}\nclass TooShortError extends PasswordValidationError {}\nclass NoUppercaseError extends PasswordValidationError {}\nclass NoNumberError extends PasswordValidationError {}\n\nconsole.log(PasswordValidationError.fullName);\n// Error.NaniError.PasswordValidationError\n\nconsole.log(TooShortError.fullName);\n// Error.NaniError.PasswordValidationError.TooShortError\n\nconsole.log(NoUppercaseError.fullName);\n// Error.NaniError.PasswordValidationError.NoUppercaseError\n\nconsole.log(NoNumberError.fullName);\n// Error.NaniError.PasswordValidationError.NoNumberError\n\n// Name and fullName are automatically available on instances as well.\nconst err = new NoUppercaseError();\n\nconsole.log(err.name);\n// NoUppercaseError\n\nconsole.log(err.fullName)\n// Error.NaniError.PasswordValidationError.NoUppercaseError\n```\n\nOf course, not every error instance or error class you're going to be dealing\nwith will inherit from `NaniError`, so Nani provides the function `getFullName`,\nwhich, for convenience, attempts to support these through a simple mechanism:\n\n1. If a fullName property exists, use that.\n2. If if the name property is 'Error', the fullName is also assumed to be\n   'Error'.\n3. If the name property *ends with* 'Error', the fullName is assumed to be the\n   name property appended to 'Error', separated by a dot.\n4. In all other cases, the fullName is assumed to be `null`, indicating that it\n   can't be identified.\n\nFor example:\n```js\nconst { NaniError, getFullName } = require('nani');\n\nclass PasswordValidationError extends NaniError {}\nclass TooShortError extends PasswordValidationError {}\nclass MyCustomError extends Error {}\n\nconsole.log(getFullName(PasswordValidationError));\n// Error.NaniError.PasswordValidationError\n\nconsole.log(getFullName(TooShortError));\n// Error.NaniError.PasswordValidationError.TooShortError\n\nconsole.log(getFullName(Error));\n// Error\n\nconsole.log(getFullName(TypeError));\n// Error.TypeError\n\nconsole.log(getFullName(MyCustomError));\n// Error.MyCustomError\n```\n\nSince all standard Error subclass names end in 'Error'-- as do most custom\nones-- you can reliably use `getFullName` much of the time. Of course, if you\nalready have your own error name hierarchies that aren't based on the `fullName`\nproperty, these will not be supported.\n\n\n### Using Full Names to Identify Errors\nTo make easy use of full names for identification, Nani provides the `is`\nfunction. `is` will get the full name of both of its arguments, and will return\ntrue if and only if both full names can be identified and the first argument's\nfull name *starts with* the second argument's full name. This makes checks\nagainst your hierarchies read quite naturally.\n\nGoing back to our password validation example, you can declare your error\nclasses like so:\n```js\nclass PasswordValidationError extends NaniError {}\nclass TooShortError extends PasswordValidationError {}\nclass NoUppercaseError extends PasswordValidationError {}\nclass NoNumberError extends PasswordValidationError {}\n```\n\nThrow your errors like so:\n```js\nthrow new TooShortError('Password is too short');\n```\n```js\nthrow new NoUppercaseError('Password must have an uppercase letter');\n```\n```js\nthrow new NoNumberError('Password must have a number');\n```\n\nAnd handle your errors like so:\n```js\nconst { is } = require('nani');\n\ntry {\n\tvalidatePassword(password);\n} catch (err) {\n\tif (is(err, TooShortError)) {\n\t\t// Handle the too short error.\n\t} else if (is(err, PasswordValidationError)) {\n\t\t// Handle any other kind of password validation error.\n\t} else {\n\t\t// Rethrow an unknown error.\n\t\tthrow err;\n\t}\n}\n```\n\nThis mechanism therefore gives you the advantages of `instanceof`, without\nactually relying on `instanceof`.\n\n\n### Shorthand Forms for Iteration Utilities\nSince the `is` function is likely to be used quite a bit with them, the `find`\nand `filter` iteration utilities support a shorthand form. If the predicate is\nan Error constructor-- i.e. it has a fullName that starts with `Error`-- the\npredicate will return true for any iterated item that `is` that constructor.\n\nFor example:\n\n```js\nconst { find, filter, is } = require('nani');\n\nconst err = new NaniError();\n\nlet result;\n\n// These two statements are effectively equivalent:\nresult = find(err, (e) => is(e, NaniError));\nresult = find(err, NaniError);\n\n// As are these two:\nresult = filter(err, (e) => is(e, NaniError));\nresult = filter(err, NaniError);\n```\n\n\n### Namespacing Your Errors\nConsidering the way full names work, it *is* possible to have collisions,\nespecially if you use fairly general error names that others are likely to use\nin their own projects, like `ValidationError` or `InternalError`. To deal with\nthis, I recommend that you make a single base error for all of your hierarchies,\npreferably named based on your organization, or the name of your project.\n\nIf you're writing a validation library called `foobar`, for example, instead of\njust doing this:\n\n```js\nconst { NaniError } = require('NaniError')\n\nclass ValidationError extends NaniError {}\n```\n\nTry doing something like this:\n\n```js\nconst { NaniError } = require('NaniError')\n\nclass FoobarError extends NaniError {}\nclass ValidationError extends FoobarError {}\n```\n\n\n## Full Iteration\nAs discussed before, the `iterate` generator function simply yields all of the\nerrors in an error structure in sequence, skipping any duplicates. This is\nusually what you want, but sometimes you need more information about the\nstructure itself-- if you're writing a serializer, for example.\n\nFor this purpose, nani provides `iterateFull`. It is similar to `iterate`,\nexcept that it does not skip duplicate references, and yields objects with some\ninformation about each error's context within the structure. It *does* check for\ncircular references that would create an infinite loop, however, and ignores\nthose just to be safe.\n\nError info is yielded in the form of objects with three properties:\n- `err` - The Error instance.\n- `parent` - The parent of `err`, if any. `null` otherwise.\n- `inArray` - `true` if `err` is in an `errors` array on its parent,\n  `false` otherwise.\n\n ```js\nconst { NaniError, MultiError, iterateFull } = require('nani');\n\nconst outerErr = new NaniError({\n\tshortMessage: 'outermost error',\n\tcause: new MultiError(\n\t\tnew NaniError('inner error', new Error('innermost error')),\n\t\tnew NaniError('another inner error')\n\t)\n});\n\nfor (const { err, parent, inArray } of iterateFull(outerErr)) {\n\tconsole.log(`Message: ${err.message}`);\n\tconsole.log(`Parent Message: ${parent ? parent.message : null}`);\n\tconsole.log(`In Array: ${inArray}\\n`);\n}\n\n /*\n Running the above code will log the following:\n\n Message: outermost error : First of 2 errors : inner error : innermost error\n Parent Message: null\n In Array: false\n\n Message: First of 2 errors : inner error : innermost error\n Parent Message: outermost error : First of 2 errors : inner error : innermost error\n In Array: false\n\n Message: inner error : innermost error\n Parent Message: First of 2 errors : inner error : innermost error\n In Array: true\n\n Message: innermost error\n Parent Message: inner error : innermost error\n In Array: false\n\n Message: another inner error\n Parent Message: First of 2 errors : inner error : innermost error\n In Array: true\n\n */\n ```\n","maintainers":[{"name":"sripberger","email":"steve.ripberger@gmail.com"}],"time":{"modified":"2022-06-20T19:51:46.399Z","created":"2016-01-04T03:15:28.800Z","1.0.0":"2016-01-04T03:15:28.800Z","1.0.1":"2016-01-05T23:25:07.926Z","1.0.2":"2016-01-07T02:36:57.136Z","1.0.3":"2016-01-07T07:49:42.190Z","1.0.4":"2016-01-07T19:08:46.254Z","1.1.0":"2016-01-07T19:23:30.721Z","1.2.0":"2016-01-11T18:53:04.463Z","2.0.0":"2019-02-19T22:54:57.719Z","2.1.0":"2019-02-22T22:26:04.226Z","2.2.0":"2019-02-23T21:41:30.861Z","2.2.1":"2019-03-01T20:08:24.020Z","2.3.0":"2019-03-10T01:41:38.318Z","2.3.1":"2019-03-15T16:10:23.768Z","2.4.0":"2019-07-16T16:48:49.832Z","3.0.0":"2019-12-23T17:39:40.176Z","3.1.0":"2020-01-18T22:08:05.943Z","3.2.0":"2020-01-20T22:39:45.824Z","3.2.1":"2020-02-25T16:23:01.843Z","3.2.2":"2022-05-02T16:00:11.012Z","3.2.3":"2022-05-02T17:28:35.230Z"},"homepage":"https://github.com/sripberger/nani#readme","keywords":["error","verror"],"repository":{"type":"git","url":"git+https://github.com/sripberger/nani.git"},"author":{"name":"Steve Ripberger"},"bugs":{"url":"https://github.com/sripberger/nani/issues"},"license":"MIT","readmeFilename":"README.md"}