From b19a1193f79f20bf0e439539e88f51587f9ffb44 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Thu, 7 Mar 2024 19:12:48 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20FoxxMD/l?= =?UTF-8?q?ogging@8dedb772ae1c39d3c242758cc0728c1fc9463e6a=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/highlight.css | 18 +- assets/navigation.js | 2 +- assets/search.js | 2 +- classes/index._internal_.AsyncResource.html | 48 ++++ classes/index._internal_.ErrorWithCause.html | 12 + ...ntEmitter-1.EventEmitterAsyncResource.html | 239 ++++++++++++++++++ classes/index._internal_.EventEmitter.html | 227 +++++++++++++++++ functions/factory.buildDestinationFile.html | 2 +- .../factory.buildDestinationRollingFile.html | 2 +- functions/factory.buildDestinationStderr.html | 2 +- functions/factory.buildDestinationStdout.html | 2 +- functions/factory.buildDestinationStream.html | 2 +- functions/factory.buildLogger.html | 2 +- functions/factory.prettyOptsFactory.html | 2 +- functions/index.childLogger.html | 2 +- functions/index.isLogOptions.html | 2 +- functions/index.loggerApp.html | 2 +- functions/index.loggerAppRolling.html | 2 +- functions/index.parseLogOptions.html | 2 +- hierarchy.html | 1 + index.html | 6 +- interfaces/factory._internal_.Colorette.html | 42 +++ .../factory._internal_.DestinationStream.html | 2 + .../factory._internal_.PrettyOptions_.html | 120 +++++++++ .../factory._internal_.WritableStream.html | 133 ++++++++++ interfaces/index.LogOptions.html | 12 +- ...ndex._internal_.AsyncIterableIterator.html | 5 + .../index._internal_.AsyncIterator.html | 4 + ...index._internal_.AsyncResourceOptions.html | 12 + interfaces/index._internal_.BaseLogger.html | 58 +++++ interfaces/index._internal_.CallSite.html | 34 +++ ...index._internal_.ChildLoggerOptions-1.html | 7 + .../index._internal_.ChildLoggerOptions.html | 7 + .../index._internal_.DestinationStream.html | 2 + ...x._internal_.EventEmitter-1.Abortable.html | 3 + ...er-1.EventEmitterAsyncResourceOptions.html | 19 ++ ....EventEmitterReferencingAsyncResource.html | 34 +++ .../index._internal_.EventEmitterOptions.html | 3 + ...index._internal_.IteratorReturnResult.html | 3 + .../index._internal_.IteratorYieldResult.html | 3 + interfaces/index._internal_.LevelMapping.html | 5 + interfaces/index._internal_.LogFn-1.html | 1 + interfaces/index._internal_.LogFn.html | 1 + interfaces/index._internal_.LoggerExtras.html | 155 ++++++++++++ interfaces/index._internal_.PromiseLike.html | 6 + ...._internal_.StaticEventEmitterOptions.html | 2 + .../index._internal_.StreamEntry-1.html | 3 + interfaces/index._internal_.StreamEntry.html | 3 + .../index._internal_._DOMEventTarget.html | 2 + .../index._internal_._NodeEventTarget.html | 2 + .../index._internal_.redactOptions.html | 4 + media/example.png | Bin 0 -> 141304 bytes modules/factory._internal_.html | 15 ++ modules/factory.html | 5 +- modules/index._internal_.EventEmitter-1.html | 6 + modules/index._internal_.html | 49 ++++ modules/index.html | 3 +- types/factory.FileDestination.html | 1 + types/factory.StreamDestination.html | 1 + types/factory._internal_.BufferEncoding.html | 1 + types/factory._internal_.Color.html | 1 + types/factory._internal_.Exclude.html | 2 + ...tory._internal_.LevelPrettifierExtras.html | 1 + types/factory._internal_.LogDescriptor.html | 1 + .../factory._internal_.MessageFormatFunc.html | 1 + types/factory._internal_.Omit.html | 2 + types/factory._internal_.Pick.html | 2 + types/factory._internal_.Prettifier.html | 1 + .../factory._internal_.PrettifierExtras.html | 1 + types/index.LogData.html | 2 +- types/index.LogLevel.html | 2 +- types/index.LogLevelStreamEntry.html | 2 +- types/index.Logger.html | 2 +- types/index._internal_.AnyRest.html | 1 + types/index._internal_.Args.html | 1 + types/index._internal_.Bindings.html | 1 + types/index._internal_.CustomLevelLogger.html | 1 + types/index._internal_.DefaultEventMap.html | 1 + types/index._internal_.EventMap.html | 1 + types/index._internal_.IteratorResult.html | 1 + types/index._internal_.Key.html | 1 + types/index._internal_.Key2.html | 1 + types/index._internal_.Level-1.html | 1 + types/index._internal_.Level.html | 1 + ...x._internal_.LevelChangeEventListener.html | 1 + types/index._internal_.LevelOrString.html | 1 + types/index._internal_.LevelWithSilent.html | 1 + ...ex._internal_.LevelWithSilentOrString.html | 1 + types/index._internal_.Listener.html | 1 + types/index._internal_.Logger-1.html | 1 + types/index._internal_.Logger.html | 1 + types/index._internal_.OnChildCallback.html | 2 + types/index._internal_.Record.html | 2 + types/index._internal_.Required.html | 2 + types/index._internal_.SerializerFn.html | 1 + variables/factory.prettyConsole.html | 2 +- variables/factory.prettyFile.html | 2 +- variables/index.LOG_LEVELS.html | 2 +- variables/index.loggerDebug.html | 2 +- variables/index.loggerTest.html | 2 +- 100 files changed, 1367 insertions(+), 35 deletions(-) create mode 100644 classes/index._internal_.AsyncResource.html create mode 100644 classes/index._internal_.ErrorWithCause.html create mode 100644 classes/index._internal_.EventEmitter-1.EventEmitterAsyncResource.html create mode 100644 classes/index._internal_.EventEmitter.html create mode 100644 hierarchy.html create mode 100644 interfaces/factory._internal_.Colorette.html create mode 100644 interfaces/factory._internal_.DestinationStream.html create mode 100644 interfaces/factory._internal_.PrettyOptions_.html create mode 100644 interfaces/factory._internal_.WritableStream.html create mode 100644 interfaces/index._internal_.AsyncIterableIterator.html create mode 100644 interfaces/index._internal_.AsyncIterator.html create mode 100644 interfaces/index._internal_.AsyncResourceOptions.html create mode 100644 interfaces/index._internal_.BaseLogger.html create mode 100644 interfaces/index._internal_.CallSite.html create mode 100644 interfaces/index._internal_.ChildLoggerOptions-1.html create mode 100644 interfaces/index._internal_.ChildLoggerOptions.html create mode 100644 interfaces/index._internal_.DestinationStream.html create mode 100644 interfaces/index._internal_.EventEmitter-1.Abortable.html create mode 100644 interfaces/index._internal_.EventEmitter-1.EventEmitterAsyncResourceOptions.html create mode 100644 interfaces/index._internal_.EventEmitter-1.EventEmitterReferencingAsyncResource.html create mode 100644 interfaces/index._internal_.EventEmitterOptions.html create mode 100644 interfaces/index._internal_.IteratorReturnResult.html create mode 100644 interfaces/index._internal_.IteratorYieldResult.html create mode 100644 interfaces/index._internal_.LevelMapping.html create mode 100644 interfaces/index._internal_.LogFn-1.html create mode 100644 interfaces/index._internal_.LogFn.html create mode 100644 interfaces/index._internal_.LoggerExtras.html create mode 100644 interfaces/index._internal_.PromiseLike.html create mode 100644 interfaces/index._internal_.StaticEventEmitterOptions.html create mode 100644 interfaces/index._internal_.StreamEntry-1.html create mode 100644 interfaces/index._internal_.StreamEntry.html create mode 100644 interfaces/index._internal_._DOMEventTarget.html create mode 100644 interfaces/index._internal_._NodeEventTarget.html create mode 100644 interfaces/index._internal_.redactOptions.html create mode 100644 media/example.png create mode 100644 modules/factory._internal_.html create mode 100644 modules/index._internal_.EventEmitter-1.html create mode 100644 modules/index._internal_.html create mode 100644 types/factory.FileDestination.html create mode 100644 types/factory.StreamDestination.html create mode 100644 types/factory._internal_.BufferEncoding.html create mode 100644 types/factory._internal_.Color.html create mode 100644 types/factory._internal_.Exclude.html create mode 100644 types/factory._internal_.LevelPrettifierExtras.html create mode 100644 types/factory._internal_.LogDescriptor.html create mode 100644 types/factory._internal_.MessageFormatFunc.html create mode 100644 types/factory._internal_.Omit.html create mode 100644 types/factory._internal_.Pick.html create mode 100644 types/factory._internal_.Prettifier.html create mode 100644 types/factory._internal_.PrettifierExtras.html create mode 100644 types/index._internal_.AnyRest.html create mode 100644 types/index._internal_.Args.html create mode 100644 types/index._internal_.Bindings.html create mode 100644 types/index._internal_.CustomLevelLogger.html create mode 100644 types/index._internal_.DefaultEventMap.html create mode 100644 types/index._internal_.EventMap.html create mode 100644 types/index._internal_.IteratorResult.html create mode 100644 types/index._internal_.Key.html create mode 100644 types/index._internal_.Key2.html create mode 100644 types/index._internal_.Level-1.html create mode 100644 types/index._internal_.Level.html create mode 100644 types/index._internal_.LevelChangeEventListener.html create mode 100644 types/index._internal_.LevelOrString.html create mode 100644 types/index._internal_.LevelWithSilent.html create mode 100644 types/index._internal_.LevelWithSilentOrString.html create mode 100644 types/index._internal_.Listener.html create mode 100644 types/index._internal_.Logger-1.html create mode 100644 types/index._internal_.Logger.html create mode 100644 types/index._internal_.OnChildCallback.html create mode 100644 types/index._internal_.Record.html create mode 100644 types/index._internal_.Required.html create mode 100644 types/index._internal_.SerializerFn.html diff --git a/assets/highlight.css b/assets/highlight.css index 9010506..12a0168 100644 --- a/assets/highlight.css +++ b/assets/highlight.css @@ -17,8 +17,12 @@ --dark-hl-7: #6A9955; --light-hl-8: #267F99; --dark-hl-8: #4EC9B0; - --light-hl-9: #CD3131; - --dark-hl-9: #F44747; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; + --light-hl-10: #000000; + --dark-hl-10: #C8C8C8; + --light-hl-11: #000000FF; + --dark-hl-11: #D4D4D4; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -34,6 +38,8 @@ --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } } @@ -48,6 +54,8 @@ --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } } @@ -62,6 +70,8 @@ --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); --code-background: var(--light-code-background); } @@ -76,6 +86,8 @@ --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); --code-background: var(--dark-code-background); } @@ -89,4 +101,6 @@ .hl-7 { color: var(--hl-7); } .hl-8 { color: var(--hl-8); } .hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } pre, code { background: var(--code-background); } diff --git a/assets/navigation.js b/assets/navigation.js index 5c5b3fa..f49c184 100644 --- a/assets/navigation.js +++ b/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5WUS2+DMBCE/4vPqA/SpCq3KI9ekCI1VS9RVDmwIVYd2zJLlKjKf68CNJiXgSs7/oYdBm9+CcIZiUf2NECpL8QhiuKBeOQow4RD/JgPHg545MQhP0yExHMdEhwYDzUI4m3ukF3CeDiHGJmgyKT4kJwzES0ZhwK8T0RwGxZoy7Gy7eTl6rSaDXUZiF+jBnocYpCdGGQRygSHWdxODLMArQdagNZdFr6MIujmZjILTGlAvKwUxstqIevImrgTPJMilmZNTlQzujN7XhKWgSO3BiyXro1Wr9rIvW4NGBMhnOv/Xvq415+nqI7Bl9FKpRE1pZbBKkJLYqlN+3fNcIbIguKp4BNibMoqIxUaS+iZaA67JOoipaJO1FSp9uXuks7Vpkrll1YPWq60QH0Z+XACXsDwou77/U8rxXh6e30emxv6q/dvf/G18NftWRUaS1RNvWICQe9pYL5VY6fc8cQsetynpKbKHlOpnJWQap1siCiPMruqFwLNC6cpc0PYgz2nSFt5t2EzY3vd/gGrUA2rmQcAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA7VZbW/bNhD+L9pXp6vdJFuDoUDql2GoPQ92saIoAoOWzjIRmtRIKrA39L8PkiybEkWJItOv1nPPc0cej8fzt/8CCUcZPAQ7FErGT8EgSJDcBw/BgUUpAfHz+cObvTyQYBA8YxoFD6NBEO4xiTjQ4OHbhWSbYhJNQEhMkcSMrhghmMYzTOBKvEtpmH28UreYVWXvb78PjGJ9VXrSryUHdOgjUFj0kohYKvtJZBb9JIDznhLAeZfEnMUxdPMWsBayhIOUp2UixayekDqlBu4kHjMqmJomL4hjtFXzvAKsEr4baYTVpDOx6alWoco+Kyt+5ZOnROGqwWon8u37X4Z3KmuRfha8GrCL+TdMJXCKyAdzudiUmI1V5fiY7nbApzRkEaaxyVOFtGrQ6PEgCAkSImMR0Q0WN3AsrAMlli8cy2zL6sc7V9qhsFm9alVTv7u3Uh4zwrhFpDnOPcDcHKQE29guBm5hzVk8ARFynEir8Cp49zD/KmtBViE2trFWrdwCzjnwDoNNtFewZ6g5x/QoORK9ZAsTd/E5vABx8KDRzt2NBQiBYpgxfkByltLQwgXNxl2+pS9oT7iO9sA653D4bLPtOHx2D3J6DEkagYXOGekutTxgaaGTwfqKPH1/UoQwjeCo31r5z1YXVYK4gDmLzzWjqT0pyGrAltYklzE3UAWdAmqhIjngMwjZ1JQUTFdMS0tSgCawTeMuphzUSfWYJObgLpDO0B6T5Pw6sGA7I1tI5yzOC1M99wqi8mtXPzRf/r6ZT/+eztfmtbpiWpaqKa+UenLxqjGnRnf3aqILmyRVUe3LFOvX28UdLScblui8lEXRm1KpdvZNa64ALbgnSCIjX/bRp6UtiHo2tI/iRMMVCJbyELo3VWFvsnS7JSpMV/HcslO5Kjkc/Wp3Z7wAldMDlhJ4r6gbDN2C3vzJIsjZPiMeg7STr1s5ak+Wi/7SVSM35bVEEofOq280d/NGJbLIOxXun3YWB1iF3wyrkrdmweaT7q/9U43i7Mjw/e27ty3uqCd9y3j+IO1/2G6Gby7W/ru9gh1woCGmsaH69PDLhtjfZfdK3eLu6xVxI2vPg9XmYJ9D91T3bYGS5qu37sgCJe4vhAnsUEqktWIN7y78SE+rSj9tEDzjPIR4rD2kdRUee7yaP4Gh61IUPkFzw2UrMLJRGHkMILCQQE3dqDpxOAM9RmeIkDU2TM40vRLtOA1MhWSHvPVt67ZVvbqFx/ObjrOLLYtgi/TJgiZdw7sLc4hQKHsV3YqJ84gy1kdXbaKqhZvmR5RPAyob26Z4xTvqYZoNxrsrSgn0HAl2H0fjS9peZMnXkjf8P9AsVqI9Rb9guV9jArT7DqjhX024X9y6nbsja+AYEfwv8Jn2/5H+ilDAnrGP94jGxYPMvuAbDD1csavEvuXXbprc0OK8yiy5cSTT/lg0jWZs62+2UQuUJJWUbq2/ioVzzVczuKPYa/lre4tfp7S9LjXdzmNl7Q5K/d37w86Fj9DrrafmxQ/KG1cdn1PoqjnlnPHsthijVFi9JysGbqOaPyRwJBn/ioFEKxApsZyTNRi6hV0SrUCmnLq4oFr6+lBVN5ykKtzjjZm9+kuyHuPo0sRjDp1TbAm4qiumrv/TswMWMMfPlg86xcBNcQX/pJhD1Lm9JdB9Y1cQMm4jlMFc/kJ9+h+WiSSeKygAAA==" \ No newline at end of file diff --git a/assets/search.js b/assets/search.js index 281af25..1cc1cdf 100644 --- a/assets/search.js +++ b/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA61Y246jOBD9l5pXK5NyyI231XbPaqSWerUzmhcUtejgpNESQOD0bivKv4+MCZSJTULSjwnnYuq4CswBiuy/EvzgAP/GaQQ+Z5CGOwE+xGkk/gcG+yIBH3ZZtE9E+bX6d/QmdwkwWCdhWYoSfIAjO1fYhGuZFR9nGvX//Srj5RynrdZTtt2KopGSH3mzGH3JosYgDwuRyuZmeuWfxLtIfshChLvHVJJld7y6uIHG0xk1fc5lnKVl4xWnUhSbcE0Na8wwHxxzrzFK1JKv9vhygvc4EY7LdBMn4nrPGn2/5d+hfBtmWzPus15naZkNueGWMNjYsnkfQhm6Nqy69jnd0dsSwywmRP35r5enx1+PTz8a/fewiMPXdt60kGEuM9ID1ZT4I88bk80+XVelrU0axP0e/2RJEqfby1Y18ObaaaEH8brfOotHMHf6/BSlvGCjIDfXb/0WJ1Fn0ndLRzA3++RhUQrL9O16dXA3+8XlFWYUdHNOeSGk/PizM4zaqE6PXgPX73Z6ivf4fYuvMFOgoU40s0rkOZflt85rRVtI05Bg7/B93cdJ9CBKGaehctFP/h5zO+FTVxBlezloBYrwuSsQha1Fe1Ygigv9OmgFxo677H/n3uvK1VN74CII6961OGek4X3NlGy8VqyeK/4B3kVRxlkKPvDRZLQEBptYJJE6J+hlMFhnu51SWNXXfgmloxAa8nUMLBgzvhzNcLFaseDEqC5Uf1QwBBagDYYGjAMLuA3GDdgEWDCxwSYGzAMWeDaYZ8CmwIKpDTY1YDNgwcwGmxmwObBgboPNDdgCWLCwwRYGbAksWNpgS7O8qtpozQE7QVRJ2KMws0BVc+TM80Yen5tIMw5UZceJFWkmgqryaM0EzVBQFR+tsaCZC6r648zqbkaDKgKcW5FmOqhSwIUVaQaEKgi0RoRmRlwFwa0ZcTMjroLgaHPnnX6pGsaaETcz4ioIbs2ImxlxFQT3rEgzI66C4FMr0syIqyC4NSNuZsRVENyaEdcZVRPsXRRSRN/1JAsCPS6jdgjrc+YBXuphx6enyXoAPgX/cDy2w039UkZdkUJP8jOtGdGaXalV1s9SIuMRGe96meqlgMhMiMzkahn9dkNkOJHhfTJJ/VAi3Dnhzh3c6oX+nIukmOgqZnOIbnmLlrZwsJrvUsSNmLlYnbTJ+lzLU5S8+rrQ0khJXBWpv7y1nHHLGbs4ZZJts9MRg9wYqQe6ClJ/8GlZpClcPZFk25eKZ9rRQroqmWTbqPpe0fKWLW3pZnW3F9ldvaRQnfrJIgkRLzKL01meCJDWQldraYFIH80Jl3Q3urpbc2V13CZUEgv25HIWJ5INhK4ddCLqESD0J9BWg9xyzx1bdiC5X9ftVudsx/4l/YKuhtHnPcswQLKv0LWxNPtsmJOacVfNNDXLZWmZKZz0Arf2wopBHuciiVMBfrA6Hn8DcIkTRI8XAAA="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA61YXY+rNhD9L+6rlZsZEvKhqtLV3b1VpZW26q3uC4oiNjhZVAIIyLaraP97ZczHmNgEkn0MOWfOeI5nMD6zLPk3Z2vvzP4J44CtkbPYPwq2ZmEciP8YZ6csYmt2TIJTJPIv5dPJa3GMGGe7yM9zkbM1Yx/8MsLe3xVJ9n4Ro3reH2W6WsC8jfWUHA4ia0IV72mTjPrLEI2z1M9EXDSL6Q3/JN5E9KPIhH98jAuSdkerixspPHep6HNahEmcN1phXIhs7++oYIUZpwNTnDVCkUx5sMYvNbxHiXBsovswEsM1K/T9kn/6xes42Ypxn/QuifNkzIJbwmhhw+Z98AvftmHlf5/THb0tMU7CIdGff98+Pf58fPrRxH/zs9B/aedNCxmn4pIeKKfE1zRtRPaneFeWthJpEPdr/JVEURgfrktVwJtrpwI9iJfTwVo8grlT52+RF1dkJOTm+u1ewyjoTPpu6QjmZp3Uz3JhmL5drQ7uZr0wHyBGQTf7lGaiKN6/dYZRa1X96tVw/Wr1W7xH73s4QEyCxipRz8ogz2mRf+8cK9pC6oIEe4fuyymMggeRF2HsSxX15u8RNxM+NYMgORWjMpCEz81AZKYW7clAZFf6dVQG2o67rn/n3uuGq6b2yCQI695crDNS0x4yJS+1ui9/mS9ZRecMUAt2UPeKqqa5LnuBGy3cSP5aHtliP/rN8tGzrQHbkaepIRL1goaKNCvZ8EpwfWZvIstlrdYMJ85kxTjbhyIK5PedSoGzXXI8ygib6r+fQsaRCAX5MmXcm3JnOlnBZsO9mlA+Lx+UKGDcAwMKNBQy7qEBhRrKYdxzDChHQ80Y92YG1ExDzRn35gbUXEO5jHuuAeVqqAXj3sKAWmioJePe0oBaaqgV497KgFrpVZVFBlP1oVP+sv5GA3QHQJYakM/cieO6OlJ3AWS5wTEidSdAlhxMXoBuBsiqg8kO0P0AWXhwjdq6JyCLDwsjUvcFpAGwNCJ1b0CaACZ3QLcHpQlosgd1e1CagGDSxk6HlC1i9Ad1f1CagEZ/UPcHpQs4MyJ1g1DagHMjUncIpQ1odAh1h1DagEaHUHcIpQ1o6h3UDUJpA5oMQt0gR9rgTDnOJ8sp6sNEd8gBO1I5VM7VN5EVIvhDzVfPUy/foH3bqFuLM9tWIxjn9aw/M5yz9fnjox258pcU6gbJ1LngIpZLYrkDY+XVyYyEmZEws+FhyiMmCeOQMM7gMOqsTMIgCYN9YaLqiEO4C8JdWLjl5+ElF0gxwVbM5kqm5S1b2tLCam45iRoRs7E6bpP8bOlJSkBPRKQ0JE+0JhpGIi3vuloiKamtotU9cMuZtpyplaMOMZTmEJ5TEjlzbOUJ8yg5JPUXM6ksWSjYFlrdX7Ys0pW2poySw7bk6XLUSVuuUXIIyuu3lrdqaSs7q7u/iYe9JF9eYpEkCRGuMrP6aooEIL0Ntt5WAQJ100S4ZLyAbbwoblHeHhEqsQV6fLmwE8hOAtsWrIlqBgl1o092I9mM9giGHUjWa1tueW1k2b+k4cDWcer6wjCNgOwrsG0sxb54m5Caoa1mipqkRW4Yakh6AW29oKptm1IkfTSmv+EsDVMRhbFga2/z8fE/Mzpg3KAaAAA="; \ No newline at end of file diff --git a/classes/index._internal_.AsyncResource.html b/classes/index._internal_.AsyncResource.html new file mode 100644 index 0000000..6a78fd9 --- /dev/null +++ b/classes/index._internal_.AsyncResource.html @@ -0,0 +1,48 @@ +AsyncResource | @foxxmd/logging Docs

The class AsyncResource is designed to be extended by the embedder's async +resources. Using this, users can easily trigger the lifetime events of their +own resources.

+

The init hook will trigger when an AsyncResource is instantiated.

+

The following is an overview of the AsyncResource API.

+
import { AsyncResource, executionAsyncId } from 'async_hooks';

// AsyncResource() is meant to be extended. Instantiating a
// new AsyncResource() also triggers init. If triggerAsyncId is omitted then
// async_hook.executionAsyncId() is used.
const asyncResource = new AsyncResource(
type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }
);

// Run a function in the execution context of the resource. This will
// * establish the context of the resource
// * trigger the AsyncHooks before callbacks
// * call the provided function `fn` with the supplied arguments
// * trigger the AsyncHooks after callbacks
// * restore the original execution context
asyncResource.runInAsyncScope(fn, thisArg, ...args);

// Call AsyncHooks destroy callbacks.
asyncResource.emitDestroy();

// Return the unique ID assigned to the AsyncResource instance.
asyncResource.asyncId();

// Return the trigger ID for the AsyncResource instance.
asyncResource.triggerAsyncId(); +
+

Hierarchy (view full)

Constructors

  • AsyncResource() is meant to be extended. Instantiating a +new AsyncResource() also triggers init. If triggerAsyncId is omitted then +async_hook.executionAsyncId() is used.

    +

    Parameters

    • type: string

      The type of async event.

      +
    • Optional triggerAsyncId: number | AsyncResourceOptions

      The ID of the execution context that created + this async event (default: executionAsyncId()), or an + AsyncResourceOptions object (since v9.3.0)

      +

    Returns AsyncResource

Methods

  • Binds the given function to the current execution context.

    +

    The returned function will have an asyncResource property referencing +the AsyncResource to which the function is bound.

    +

    Type Parameters

    • Func extends ((this, ...args) => any)
    • ThisArg

    Parameters

    • fn: Func

      The function to bind to the current execution context.

      +
    • Optional type: string

      An optional name to associate with the underlying AsyncResource.

      +
    • Optional thisArg: ThisArg

    Returns Func & {
        asyncResource: AsyncResource;
    }

    Since

    v14.8.0, v12.19.0

    +
  • Binds the given function to execute to this AsyncResource's scope.

    +

    The returned function will have an asyncResource property referencing +the AsyncResource to which the function is bound.

    +

    Type Parameters

    • Func extends ((...args) => any)

    Parameters

    • fn: Func

      The function to bind to the current AsyncResource.

      +

    Returns Func & {
        asyncResource: AsyncResource;
    }

    Since

    v14.8.0, v12.19.0

    +
  • Call the provided function with the provided arguments in the execution context +of the async resource. This will establish the context, trigger the AsyncHooks +before callbacks, call the function, trigger the AsyncHooks after callbacks, and +then restore the original execution context.

    +

    Type Parameters

    • This
    • Result

    Parameters

    • fn: ((this, ...args) => Result)

      The function to call in the execution context of this async resource.

      +
    • Optional thisArg: This

      The receiver to be used for the function call.

      +
    • Rest ...args: any[]

      Optional arguments to pass to the function.

      +

    Returns Result

    Since

    v9.6.0

    +
  • Call all destroy hooks. This should only ever be called once. An error will +be thrown if it is called more than once. This must be manually called. If +the resource is left to be collected by the GC then the destroy hooks will +never be called.

    +

    Returns this

    A reference to asyncResource.

    +
  • Returns number

    The unique asyncId assigned to the resource.

    +
  • Returns number

    The same triggerAsyncId that is passed to the AsyncResource constructor.

    +

Generated using TypeDoc

\ No newline at end of file diff --git a/classes/index._internal_.ErrorWithCause.html b/classes/index._internal_.ErrorWithCause.html new file mode 100644 index 0000000..4a8691f --- /dev/null +++ b/classes/index._internal_.ErrorWithCause.html @@ -0,0 +1,12 @@ +ErrorWithCause | @foxxmd/logging Docs

Type Parameters

  • T = undefined

Hierarchy

  • Error
    • ErrorWithCause

Constructors

  • Type Parameters

    • T = undefined

    Parameters

    • message: string
    • Optional __namedParameters: {
          cause?: T;
      }
      • Optional cause?: T

    Returns ErrorWithCause<T>

Properties

prepareStackTrace?: ((err, stackTraces) => any)

Optional override for formatting stack traces

+

Type declaration

    • (err, stackTraces): any
    • Parameters

      Returns any

stackTraceLimit: number
cause: T
name: string
message: string
stack?: string

Methods

  • Create .stack property on a target object

    +

    Parameters

    • targetObject: object
    • Optional constructorOpt: Function

    Returns void

Generated using TypeDoc

\ No newline at end of file diff --git a/classes/index._internal_.EventEmitter-1.EventEmitterAsyncResource.html b/classes/index._internal_.EventEmitter-1.EventEmitterAsyncResource.html new file mode 100644 index 0000000..de05d2a --- /dev/null +++ b/classes/index._internal_.EventEmitter-1.EventEmitterAsyncResource.html @@ -0,0 +1,239 @@ +EventEmitterAsyncResource | @foxxmd/logging Docs

Integrates EventEmitter with AsyncResource for EventEmitters that require +manual async tracking. Specifically, all events emitted by instances of +EventEmitterAsyncResource will run within its async context.

+

The EventEmitterAsyncResource class has the same methods and takes the +same options as EventEmitter and AsyncResource themselves.

+

Throws

if options.name is not provided when instantiated directly.

+

Since

v17.4.0, v16.14.0

+

Hierarchy (view full)

Constructors

Properties

errorMonitor: typeof errorMonitor

This symbol shall be used to install a listener for only monitoring 'error' +events. Listeners installed using this symbol are called before the regular +'error' listeners are called.

+

Installing a listener using this symbol does not change the behavior once an +'error' event is emitted, therefore the process will still crash if no +regular 'error' listener is installed.

+
captureRejectionSymbol: typeof captureRejectionSymbol
captureRejections: boolean

Sets or gets the default captureRejection value for all emitters.

+
defaultMaxListeners: number
asyncId: number

The unique asyncId assigned to the resource.

+
triggerAsyncId: number

The same triggerAsyncId that is passed to the AsyncResource constructor.

+

The underlying AsyncResource

+

Methods

  • Type Parameters

    • K

    Parameters

    • error: Error
    • event: string | symbol
    • Rest ...args: AnyRest

    Returns void

  • Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. +The Promise will resolve with an array of all the arguments emitted to the +given event.

    +

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

    +
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); +
    +

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without +special handling:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom +
    +

    An AbortSignal can be used to cancel waiting for the event:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! +
    +

    Parameters

    Returns Promise<any[]>

    Since

    v11.13.0, v10.16.0

    +
  • Parameters

    Returns Promise<any[]>

  • const { on, EventEmitter } = require('events');

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })(); +
    +

    Returns an AsyncIterator that iterates eventName events. It will throw +if the EventEmitter emits 'error'. It removes all listeners when +exiting the loop. The value returned by each iteration is an array +composed of the emitted event arguments.

    +

    An AbortSignal can be used to cancel waiting on events:

    +
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); +
    +

    Parameters

    Returns AsyncIterableIterator<any>

    that iterates eventName events emitted by the emitter

    +

    Since

    v13.6.0, v12.16.0

    +
  • A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    +
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    +

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

      +
    • eventName: string | symbol

      The event name

      +

    Returns number

    Since

    v0.9.12

    +

    Deprecated

    Since v3.2.0 - Use listenerCount instead.

    +
  • Returns a copy of the array of listeners for the event named eventName.

    +

    For EventEmitters this behaves exactly the same as calling .listeners on +the emitter.

    +

    For EventTargets this is the only way to get the event listeners for the +event target. This is useful for debugging and diagnostic purposes.

    +
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } +
    +

    Parameters

    Returns Function[]

    Since

    v15.2.0, v14.17.0

    +
  • Returns the currently set max amount of listeners.

    +

    For EventEmitters this behaves exactly the same as calling .getMaxListeners on +the emitter.

    +

    For EventTargets this is the only way to get the max event listeners for the +event target. If the number of event handlers on a single EventTarget exceeds +the max set, the EventTarget will print a warning.

    +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    +

    Parameters

    Returns number

    Since

    v18.17.0

    +
  • const {
    setMaxListeners,
    EventEmitter
    } = require('events');

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
    +

    Parameters

    • Optional n: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      +
    • Rest ...eventTargets: (EventEmitter<DefaultEventMap> | _DOMEventTarget)[]

    Returns void

    Since

    v15.4.0

    +
  • Experimental

    Listens once to the abort event on the provided signal.

    +

    Listening to the abort event on abort signals is unsafe and may +lead to resource leaks since another third party with the signal can +call e.stopImmediatePropagation(). Unfortunately Node.js cannot change +this since it would violate the web standard. Additionally, the original +API makes it easy to forget to remove listeners.

    +

    This API allows safely using AbortSignals in Node.js APIs by solving these +two issues by listening to the event such that stopImmediatePropagation does +not prevent the listener from running.

    +

    Returns a disposable so that it may be unsubscribed from more easily.

    +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    +

    Parameters

    • signal: AbortSignal
    • resource: ((event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    +

    Since

    v18.18.0

    +
  • Call all destroy hooks. This should only ever be called once. An +error will be thrown if it is called more than once. This must be +manually called. If the resource is left to be collected by the GC then +the destroy hooks will never be called.

    +

    Returns void

  • Alias for emitter.on(eventName, listener).

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v0.1.26

    +
  • Adds the listener function to the end of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v0.1.101

    +
  • Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

    +
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v0.3.0

    +
  • Removes the specified listener from the listener array for the event namedeventName.

    +
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    +

    removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

    +

    Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and before the last listener finishes execution +will not remove them fromemit() in progress. Subsequent events behave as expected.

    +
    const myEmitter = new MyEmitter();

    const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
    };

    const callbackB = () => {
    console.log('B');
    };

    myEmitter.on('event', callbackA);

    myEmitter.on('event', callbackB);

    // callbackA removes listener callbackB but it will still be called.
    // Internal listener array at time of emit [callbackA, callbackB]
    myEmitter.emit('event');
    // Prints:
    // A
    // B

    // callbackB is now removed.
    // Internal listener array [callbackA]
    myEmitter.emit('event');
    // Prints:
    // A +
    +

    Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

    +

    When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

    +
    const ee = new EventEmitter();

    function pong() {
    console.log('pong');
    }

    ee.on('ping', pong);
    ee.once('ping', pong);
    ee.removeListener('ping', pong);

    ee.emit('ping');
    ee.emit('ping'); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v0.1.26

    +
  • Alias for emitter.removeListener().

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v10.0.0

    +
  • Removes all listeners, or those of the specified eventName.

    +

    It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • Optional event: string | symbol

    Returns this

    Since

    v0.1.26

    +
  • By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • n: number

    Returns this

    Since

    v0.3.5

    +
  • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    +

    Returns number

    Since

    v1.0.0

    +
  • Returns a copy of the array of listeners for the event named eventName.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    Since

    v0.1.26

    +
  • Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

    +
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); +
    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

    Since

    v9.4.0

    +
  • Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

    +

    Returns true if the event had listeners, false otherwise.

    +
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener +
    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • Rest ...args: AnyRest

    Returns boolean

    Since

    v0.1.26

    +
  • Returns the number of listeners listening to the event named eventName.

    +

    If listener is provided, it will return how many times the listener +is found in the list of the listeners of the event.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event being listened for

      +
    • Optional listener: Function

      The event handler function

      +

    Returns number

    Since

    v3.2.0

    +
  • Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v6.0.0

    +
  • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

    +
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

      The name of the event.

      +
    • listener: ((...args) => void)

      The callback function

      +
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns this

    Since

    v6.0.0

    +
  • Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

    +
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
    +

    Returns (string | symbol)[]

    Since

    v6.0.0

    +

Generated using TypeDoc

\ No newline at end of file diff --git a/classes/index._internal_.EventEmitter.html b/classes/index._internal_.EventEmitter.html new file mode 100644 index 0000000..013ecf4 --- /dev/null +++ b/classes/index._internal_.EventEmitter.html @@ -0,0 +1,227 @@ +EventEmitter | @foxxmd/logging Docs

The EventEmitter class is defined and exposed by the events module:

+
const EventEmitter = require('events');
+
+

All EventEmitters emit the event 'newListener' when new listeners are +added and 'removeListener' when existing listeners are removed.

+

It supports the following option:

+

Since

v0.1.26

+

Type Parameters

Hierarchy (view full)

Constructors

Properties

errorMonitor: typeof errorMonitor

This symbol shall be used to install a listener for only monitoring 'error' +events. Listeners installed using this symbol are called before the regular +'error' listeners are called.

+

Installing a listener using this symbol does not change the behavior once an +'error' event is emitted, therefore the process will still crash if no +regular 'error' listener is installed.

+
captureRejectionSymbol: typeof captureRejectionSymbol
captureRejections: boolean

Sets or gets the default captureRejection value for all emitters.

+
defaultMaxListeners: number

Methods

  • Type Parameters

    • K

    Parameters

    Returns void

  • Creates a Promise that is fulfilled when the EventEmitter emits the given +event or that is rejected if the EventEmitter emits 'error' while waiting. +The Promise will resolve with an array of all the arguments emitted to the +given event.

    +

    This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event +semantics and does not listen to the 'error' event.

    +
    const { once, EventEmitter } = require('events');

    async function run() {
    const ee = new EventEmitter();

    process.nextTick(() => {
    ee.emit('myevent', 42);
    });

    const [value] = await once(ee, 'myevent');
    console.log(value);

    const err = new Error('kaboom');
    process.nextTick(() => {
    ee.emit('error', err);
    });

    try {
    await once(ee, 'myevent');
    } catch (err) {
    console.log('error happened', err);
    }
    }

    run(); +
    +

    The special handling of the 'error' event is only used when events.once()is used to wait for another event. If events.once() is used to wait for the +'error' event itself, then it is treated as any other kind of event without +special handling:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();

    once(ee, 'error')
    .then(([err]) => console.log('ok', err.message))
    .catch((err) => console.log('error', err.message));

    ee.emit('error', new Error('boom'));

    // Prints: ok boom +
    +

    An AbortSignal can be used to cancel waiting for the event:

    +
    const { EventEmitter, once } = require('events');

    const ee = new EventEmitter();
    const ac = new AbortController();

    async function foo(emitter, event, signal) {
    try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
    } catch (error) {
    if (error.name === 'AbortError') {
    console.error('Waiting for the event was canceled!');
    } else {
    console.error('There was an error', error.message);
    }
    }
    }

    foo(ee, 'foo', ac.signal);
    ac.abort(); // Abort waiting for the event
    ee.emit('foo'); // Prints: Waiting for the event was canceled! +
    +

    Parameters

    Returns Promise<any[]>

    Since

    v11.13.0, v10.16.0

    +
  • Parameters

    Returns Promise<any[]>

  • const { on, EventEmitter } = require('events');

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo')) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })(); +
    +

    Returns an AsyncIterator that iterates eventName events. It will throw +if the EventEmitter emits 'error'. It removes all listeners when +exiting the loop. The value returned by each iteration is an array +composed of the emitted event arguments.

    +

    An AbortSignal can be used to cancel waiting on events:

    +
    const { on, EventEmitter } = require('events');
    const ac = new AbortController();

    (async () => {
    const ee = new EventEmitter();

    // Emit later on
    process.nextTick(() => {
    ee.emit('foo', 'bar');
    ee.emit('foo', 42);
    });

    for await (const event of on(ee, 'foo', { signal: ac.signal })) {
    // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.
    console.log(event); // prints ['bar'] [42]
    }
    // Unreachable here
    })();

    process.nextTick(() => ac.abort()); +
    +

    Parameters

    Returns AsyncIterableIterator<any>

    that iterates eventName events emitted by the emitter

    +

    Since

    v13.6.0, v12.16.0

    +
  • A class method that returns the number of listeners for the given eventNameregistered on the given emitter.

    +
    const { EventEmitter, listenerCount } = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', () => {});
    myEmitter.on('event', () => {});
    console.log(listenerCount(myEmitter, 'event'));
    // Prints: 2 +
    +

    Parameters

    • emitter: EventEmitter<DefaultEventMap>

      The emitter to query

      +
    • eventName: string | symbol

      The event name

      +

    Returns number

    Since

    v0.9.12

    +

    Deprecated

    Since v3.2.0 - Use listenerCount instead.

    +
  • Returns a copy of the array of listeners for the event named eventName.

    +

    For EventEmitters this behaves exactly the same as calling .listeners on +the emitter.

    +

    For EventTargets this is the only way to get the event listeners for the +event target. This is useful for debugging and diagnostic purposes.

    +
    const { getEventListeners, EventEmitter } = require('events');

    {
    const ee = new EventEmitter();
    const listener = () => console.log('Events are fun');
    ee.on('foo', listener);
    getEventListeners(ee, 'foo'); // [listener]
    }
    {
    const et = new EventTarget();
    const listener = () => console.log('Events are fun');
    et.addEventListener('foo', listener);
    getEventListeners(et, 'foo'); // [listener]
    } +
    +

    Parameters

    Returns Function[]

    Since

    v15.2.0, v14.17.0

    +
  • Returns the currently set max amount of listeners.

    +

    For EventEmitters this behaves exactly the same as calling .getMaxListeners on +the emitter.

    +

    For EventTargets this is the only way to get the max event listeners for the +event target. If the number of event handlers on a single EventTarget exceeds +the max set, the EventTarget will print a warning.

    +
    import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';

    {
    const ee = new EventEmitter();
    console.log(getMaxListeners(ee)); // 10
    setMaxListeners(11, ee);
    console.log(getMaxListeners(ee)); // 11
    }
    {
    const et = new EventTarget();
    console.log(getMaxListeners(et)); // 10
    setMaxListeners(11, et);
    console.log(getMaxListeners(et)); // 11
    } +
    +

    Parameters

    Returns number

    Since

    v18.17.0

    +
  • const {
    setMaxListeners,
    EventEmitter
    } = require('events');

    const target = new EventTarget();
    const emitter = new EventEmitter();

    setMaxListeners(5, target, emitter); +
    +

    Parameters

    • Optional n: number

      A non-negative number. The maximum number of listeners per EventTarget event.

      +
    • Rest ...eventTargets: (EventEmitter<DefaultEventMap> | _DOMEventTarget)[]

    Returns void

    Since

    v15.4.0

    +
  • Experimental

    Listens once to the abort event on the provided signal.

    +

    Listening to the abort event on abort signals is unsafe and may +lead to resource leaks since another third party with the signal can +call e.stopImmediatePropagation(). Unfortunately Node.js cannot change +this since it would violate the web standard. Additionally, the original +API makes it easy to forget to remove listeners.

    +

    This API allows safely using AbortSignals in Node.js APIs by solving these +two issues by listening to the event such that stopImmediatePropagation does +not prevent the listener from running.

    +

    Returns a disposable so that it may be unsubscribed from more easily.

    +
    import { addAbortListener } from 'node:events';

    function example(signal) {
    let disposable;
    try {
    signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
    disposable = addAbortListener(signal, (e) => {
    // Do something when signal is aborted.
    });
    } finally {
    disposable?.[Symbol.dispose]();
    }
    } +
    +

    Parameters

    • signal: AbortSignal
    • resource: ((event) => void)
        • (event): void
        • Parameters

          • event: Event

          Returns void

    Returns Disposable

    Disposable that removes the abort listener.

    +

    Since

    v18.18.0

    +
  • Alias for emitter.on(eventName, listener).

    +

    Type Parameters

    • K

    Parameters

    Returns this

    Since

    v0.1.26

    +
  • Adds the listener function to the end of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    +

    Type Parameters

    • K

    Parameters

    • eventName: Key<K, T>

      The name of the event.

      +
    • listener: Listener<K, T, ((...args) => void)>

      The callback function

      +

    Returns this

    Since

    v0.1.101

    +
  • Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

    +
    server.once('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

    +
    const myEE = new EventEmitter();
    myEE.once('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // Prints:
    // b
    // a +
    +

    Type Parameters

    • K

    Parameters

    • eventName: Key<K, T>

      The name of the event.

      +
    • listener: Listener<K, T, ((...args) => void)>

      The callback function

      +

    Returns this

    Since

    v0.3.0

    +
  • Removes the specified listener from the listener array for the event namedeventName.

    +
    const callback = (stream) => {
    console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback); +
    +

    removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

    +

    Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and before the last listener finishes execution +will not remove them fromemit() in progress. Subsequent events behave as expected.

    +
    const myEmitter = new MyEmitter();

    const callbackA = () => {
    console.log('A');
    myEmitter.removeListener('event', callbackB);
    };

    const callbackB = () => {
    console.log('B');
    };

    myEmitter.on('event', callbackA);

    myEmitter.on('event', callbackB);

    // callbackA removes listener callbackB but it will still be called.
    // Internal listener array at time of emit [callbackA, callbackB]
    myEmitter.emit('event');
    // Prints:
    // A
    // B

    // callbackB is now removed.
    // Internal listener array [callbackA]
    myEmitter.emit('event');
    // Prints:
    // A +
    +

    Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

    +

    When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

    +
    const ee = new EventEmitter();

    function pong() {
    console.log('pong');
    }

    ee.on('ping', pong);
    ee.once('ping', pong);
    ee.removeListener('ping', pong);

    ee.emit('ping');
    ee.emit('ping'); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    Returns this

    Since

    v0.1.26

    +
  • Alias for emitter.removeListener().

    +

    Type Parameters

    • K

    Parameters

    Returns this

    Since

    v10.0.0

    +
  • Removes all listeners, or those of the specified eventName.

    +

    It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • Optional event: Key<unknown, T>

    Returns this

    Since

    v0.1.26

    +
  • By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Parameters

    • n: number

    Returns this

    Since

    v0.3.5

    +
  • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

    +

    Returns number

    Since

    v1.0.0

    +
  • Returns a copy of the array of listeners for the event named eventName.

    +
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] +
    +

    Type Parameters

    • K

    Parameters

    Returns Listener<K, T, Function>[]

    Since

    v0.1.26

    +
  • Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

    +
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); +
    +

    Type Parameters

    • K

    Parameters

    Returns Listener<K, T, Function>[]

    Since

    v9.4.0

    +
  • Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

    +

    Returns true if the event had listeners, false otherwise.

    +
    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();

    // First listener
    myEmitter.on('event', function firstListener() {
    console.log('Helloooo! first listener');
    });
    // Second listener
    myEmitter.on('event', function secondListener(arg1, arg2) {
    console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
    });
    // Third listener
    myEmitter.on('event', function thirdListener(...args) {
    const parameters = args.join(', ');
    console.log(`event with parameters ${parameters} in third listener`);
    });

    console.log(myEmitter.listeners('event'));

    myEmitter.emit('event', 1, 2, 3, 4, 5);

    // Prints:
    // [
    // [Function: firstListener],
    // [Function: secondListener],
    // [Function: thirdListener]
    // ]
    // Helloooo! first listener
    // event with parameters 1, 2 in second listener
    // event with parameters 1, 2, 3, 4, 5 in third listener +
    +

    Type Parameters

    • K

    Parameters

    Returns boolean

    Since

    v0.1.26

    +
  • Returns the number of listeners listening to the event named eventName.

    +

    If listener is provided, it will return how many times the listener +is found in the list of the listeners of the event.

    +

    Type Parameters

    • K

    Parameters

    • eventName: Key<K, T>

      The name of the event being listened for

      +
    • Optional listener: Listener<K, T, Function>

      The event handler function

      +

    Returns number

    Since

    v3.2.0

    +
  • Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

    +
    server.prependListener('connection', (stream) => {
    console.log('someone connected!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: Key<K, T>

      The name of the event.

      +
    • listener: Listener<K, T, ((...args) => void)>

      The callback function

      +

    Returns this

    Since

    v6.0.0

    +
  • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

    +
    server.prependOnceListener('connection', (stream) => {
    console.log('Ah, we have our first user!');
    }); +
    +

    Returns a reference to the EventEmitter, so that calls can be chained.

    +

    Type Parameters

    • K

    Parameters

    • eventName: Key<K, T>

      The name of the event.

      +
    • listener: Listener<K, T, ((...args) => void)>

      The callback function

      +

    Returns this

    Since

    v6.0.0

    +
  • Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

    +
    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
    +

    Returns ((string | symbol) & Key2<unknown, T>)[]

    Since

    v6.0.0

    +

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildDestinationFile.html b/functions/factory.buildDestinationFile.html index 404e1d0..f0c1bc8 100644 --- a/functions/factory.buildDestinationFile.html +++ b/functions/factory.buildDestinationFile.html @@ -1 +1 @@ -buildDestinationFile | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file +buildDestinationFile | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildDestinationRollingFile.html b/functions/factory.buildDestinationRollingFile.html index a528363..c2e3841 100644 --- a/functions/factory.buildDestinationRollingFile.html +++ b/functions/factory.buildDestinationRollingFile.html @@ -1 +1 @@ -buildDestinationRollingFile | @foxxmd/logging Docs

Function buildDestinationRollingFile

Generated using TypeDoc

\ No newline at end of file +buildDestinationRollingFile | @foxxmd/logging Docs

Function buildDestinationRollingFile

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildDestinationStderr.html b/functions/factory.buildDestinationStderr.html index e1e44e1..75d707b 100644 --- a/functions/factory.buildDestinationStderr.html +++ b/functions/factory.buildDestinationStderr.html @@ -1 +1 @@ -buildDestinationStderr | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file +buildDestinationStderr | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildDestinationStdout.html b/functions/factory.buildDestinationStdout.html index 235c7af..24f594b 100644 --- a/functions/factory.buildDestinationStdout.html +++ b/functions/factory.buildDestinationStdout.html @@ -1 +1 @@ -buildDestinationStdout | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file +buildDestinationStdout | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildDestinationStream.html b/functions/factory.buildDestinationStream.html index 9743f20..6f0e984 100644 --- a/functions/factory.buildDestinationStream.html +++ b/functions/factory.buildDestinationStream.html @@ -1 +1 @@ -buildDestinationStream | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file +buildDestinationStream | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.buildLogger.html b/functions/factory.buildLogger.html index 1dd9334..fc9d2e5 100644 --- a/functions/factory.buildLogger.html +++ b/functions/factory.buildLogger.html @@ -1 +1 @@ -buildLogger | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file +buildLogger | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/factory.prettyOptsFactory.html b/functions/factory.prettyOptsFactory.html index 2093747..e7d6fc9 100644 --- a/functions/factory.prettyOptsFactory.html +++ b/functions/factory.prettyOptsFactory.html @@ -1 +1 @@ -prettyOptsFactory | @foxxmd/logging Docs
  • Parameters

    • opts: PrettyOptions_ = {}

    Returns PrettyOptions_

Generated using TypeDoc

\ No newline at end of file +prettyOptsFactory | @foxxmd/logging Docs

Generated using TypeDoc

\ No newline at end of file diff --git a/functions/index.childLogger.html b/functions/index.childLogger.html index e7f72d7..cafee51 100644 --- a/functions/index.childLogger.html +++ b/functions/index.childLogger.html @@ -1 +1 @@ -childLogger | @foxxmd/logging Docs
  • Parameters

    • parent: Logger
    • labelsVal: any = []
    • context: object = {}
    • options: {} = {}

      Returns Logger

    Generated using TypeDoc

    \ No newline at end of file +childLogger | @foxxmd/logging Docs
    • Parameters

      • parent: Logger
      • labelsVal: any = []
      • context: object = {}
      • options: {} = {}

        Returns Logger

      Generated using TypeDoc

      \ No newline at end of file diff --git a/functions/index.isLogOptions.html b/functions/index.isLogOptions.html index 7c4fe35..b27cb30 100644 --- a/functions/index.isLogOptions.html +++ b/functions/index.isLogOptions.html @@ -1 +1 @@ -isLogOptions | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file +isLogOptions | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/functions/index.loggerApp.html b/functions/index.loggerApp.html index afad120..381fbe5 100644 --- a/functions/index.loggerApp.html +++ b/functions/index.loggerApp.html @@ -1 +1 @@ -loggerApp | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file +loggerApp | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/functions/index.loggerAppRolling.html b/functions/index.loggerAppRolling.html index 80b3ec1..8db80e4 100644 --- a/functions/index.loggerAppRolling.html +++ b/functions/index.loggerAppRolling.html @@ -1 +1 @@ -loggerAppRolling | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file +loggerAppRolling | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/functions/index.parseLogOptions.html b/functions/index.parseLogOptions.html index a30941d..54e8986 100644 --- a/functions/index.parseLogOptions.html +++ b/functions/index.parseLogOptions.html @@ -1 +1 @@ -parseLogOptions | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file +parseLogOptions | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 0000000..1db7f53 --- /dev/null +++ b/hierarchy.html @@ -0,0 +1 @@ +@foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/index.html b/index.html index f49c996..bc28fde 100644 --- a/index.html +++ b/index.html @@ -20,8 +20,10 @@ -

      +

      +

      Install

      npm install @foxxmd/logging
       

      Quick Start

      import { loggerAppRolling, loggerApp } from "@foxxmd/logging";

      const logger = loggerApp();
      logger.info('Test');
      /*
      * Logs to -> console, colorized
      * Logs to -> CWD/logs/app.log
      *
      * [2024-03-07 10:31:34.963 -0500] DEBUG: Test
      * */


      // or for rolling log files we need to scan logs dir before opening a file
      // and need to await initial logger
      const rollingLogger = await loggerAppRolling();
      rollingLogger.info('Test');
      /*
      * Logs to -> console, colorized
      * Logs to daily log file, max 10MB size -> CWD/logs/app.1.log
      *
      * [2024-03-07 10:31:34.963 -0500] DEBUG: Test
      * */ diff --git a/interfaces/factory._internal_.Colorette.html b/interfaces/factory._internal_.Colorette.html new file mode 100644 index 0000000..f9f7925 --- /dev/null +++ b/interfaces/factory._internal_.Colorette.html @@ -0,0 +1,42 @@ +Colorette | @foxxmd/logging Docs
      interface Colorette {
          reset: Color;
          bold: Color;
          dim: Color;
          italic: Color;
          underline: Color;
          inverse: Color;
          hidden: Color;
          strikethrough: Color;
          black: Color;
          red: Color;
          green: Color;
          yellow: Color;
          blue: Color;
          magenta: Color;
          cyan: Color;
          white: Color;
          gray: Color;
          bgBlack: Color;
          bgRed: Color;
          bgGreen: Color;
          bgYellow: Color;
          bgBlue: Color;
          bgMagenta: Color;
          bgCyan: Color;
          bgWhite: Color;
          blackBright: Color;
          redBright: Color;
          greenBright: Color;
          yellowBright: Color;
          blueBright: Color;
          magentaBright: Color;
          cyanBright: Color;
          whiteBright: Color;
          bgBlackBright: Color;
          bgRedBright: Color;
          bgGreenBright: Color;
          bgYellowBright: Color;
          bgBlueBright: Color;
          bgMagentaBright: Color;
          bgCyanBright: Color;
          bgWhiteBright: Color;
      }

      Properties

      reset: Color
      bold: Color
      dim: Color
      italic: Color
      underline: Color
      inverse: Color
      hidden: Color
      strikethrough: Color
      black: Color
      red: Color
      green: Color
      yellow: Color
      blue: Color
      magenta: Color
      cyan: Color
      white: Color
      gray: Color
      bgBlack: Color
      bgRed: Color
      bgGreen: Color
      bgYellow: Color
      bgBlue: Color
      bgMagenta: Color
      bgCyan: Color
      bgWhite: Color
      blackBright: Color
      redBright: Color
      greenBright: Color
      yellowBright: Color
      blueBright: Color
      magentaBright: Color
      cyanBright: Color
      whiteBright: Color
      bgBlackBright: Color
      bgRedBright: Color
      bgGreenBright: Color
      bgYellowBright: Color
      bgBlueBright: Color
      bgMagentaBright: Color
      bgCyanBright: Color
      bgWhiteBright: Color

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/factory._internal_.DestinationStream.html b/interfaces/factory._internal_.DestinationStream.html new file mode 100644 index 0000000..3d96c7b --- /dev/null +++ b/interfaces/factory._internal_.DestinationStream.html @@ -0,0 +1,2 @@ +DestinationStream | @foxxmd/logging Docs
      interface DestinationStream {
          write(msg): void;
      }

      Hierarchy (view full)

      Methods

      Methods

      • Parameters

        • msg: string

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/factory._internal_.PrettyOptions_.html b/interfaces/factory._internal_.PrettyOptions_.html new file mode 100644 index 0000000..23503c4 --- /dev/null +++ b/interfaces/factory._internal_.PrettyOptions_.html @@ -0,0 +1,120 @@ +PrettyOptions_ | @foxxmd/logging Docs
      interface PrettyOptions_ {
          hideObject?: boolean;
          translateTime?: string | boolean;
          levelFirst?: boolean;
          levelKey?: string;
          levelLabel?: string;
          messageKey?: string;
          singleLine?: boolean;
          timestampKey?: string;
          minimumLevel?: Level;
          messageFormat?: string | false | MessageFormatFunc;
          colorize?: boolean;
          colorizeObjects?: boolean;
          crlf?: boolean;
          errorLikeObjectKeys?: string[];
          errorProps?: string;
          ignore?: string;
          include?: string;
          sync?: boolean;
          destination?: string | number | DestinationStream | WritableStream;
          append?: boolean;
          mkdir?: boolean;
          customPrettifiers?: Record<string, Prettifier<object>> & {
              level?: Prettifier<LevelPrettifierExtras>;
          };
          customLevels?: string | object;
          customColors?: string | object;
      }

      Properties

      hideObject?: boolean

      Hide objects from output (but not error object).

      +

      Default

      false
      +
      +
      translateTime?: string | boolean

      Translate the epoch time value into a human readable date and time string. This flag also can set the format +string to apply when translating the date to human readable format. For a list of available pattern letters +see the documentation.

      +
        +
      • The default format is yyyy-mm-dd HH:MM:ss.l o in UTC.
      • +
      • Requires a SYS: prefix to translate time to the local system's timezone. Use the shortcut SYS:standard +to translate time to yyyy-mm-dd HH:MM:ss.l o in system timezone.
      • +
      +

      Default

      false
      +
      +
      levelFirst?: boolean

      If set to true, it will print the name of the log level as the first field in the log line.

      +

      Default

      false
      +
      +
      levelKey?: string

      Define the key that contains the level of the log.

      +

      Default

      "level"
      +
      +
      levelLabel?: string

      Output the log level using the specified label.

      +

      Default

      "levelLabel"
      +
      +
      messageKey?: string

      The key in the JSON object to use as the highlighted message.

      +

      Default

      "msg"
      +
      +
      singleLine?: boolean

      Print each log message on a single line (errors will still be multi-line).

      +

      Default

      false
      +
      +
      timestampKey?: string

      The key in the JSON object to use for timestamp display.

      +

      Default

      "time"
      +
      +
      minimumLevel?: Level

      The minimum log level to include in the output.

      +

      Default

      "trace"
      +
      +
      messageFormat?: string | false | MessageFormatFunc

      Format output of message, e.g. {level} - {pid} will output message: INFO - 1123

      +

      Default

      false
      +
      +

      Example

      {
      messageFormat: (log, messageKey) => {
      const message = log[messageKey];
      if (log.requestId) return `[${log.requestId}] ${message}`;
      return message;
      }
      } +
      +
      colorize?: boolean

      If set to true, will add color information to the formatted output message.

      +

      Default

      false
      +
      +
      colorizeObjects?: boolean

      If set to false while colorize is true, will output JSON objects without color.

      +

      Default

      true
      +
      +
      crlf?: boolean

      Appends carriage return and line feed, instead of just a line feed, to the formatted log line.

      +

      Default

      false
      +
      +
      errorLikeObjectKeys?: string[]

      Define the log keys that are associated with error like objects.

      +

      Default

      ["err", "error"]
      +
      +
      errorProps?: string

      When formatting an error object, display this list of properties. + The list should be a comma separated list of properties.

      +

      Default

      ""
      +
      +
      ignore?: string

      Ignore one or several keys. +Will be overridden by the option include if include is presented.

      +

      Example

      "time,hostname"
      +
      +
      include?: string

      Include one or several keys.

      +

      Example

      "time,level"
      +
      +
      sync?: boolean

      Makes messaging synchronous.

      +

      Default

      false
      +
      +
      destination?: string | number | DestinationStream | WritableStream

      The file, file descriptor, or stream to write to. Defaults to 1 (stdout).

      +

      Default

      1
      +
      +
      append?: boolean

      Opens the file with the 'a' flag.

      +

      Default

      true
      +
      +
      mkdir?: boolean

      Ensure directory for destination file exists.

      +

      Default

      false
      +
      +
      customPrettifiers?: Record<string, Prettifier<object>> & {
          level?: Prettifier<LevelPrettifierExtras>;
      }

      Provides the ability to add a custom prettify function for specific log properties. +customPrettifiers is an object, where keys are log properties that will be prettified +and value is the prettify function itself. +For example, if a log line contains a query property, you can specify a prettifier for it:

      +

      Type declaration

      Default

      {}
      +
      +

      Example

      {
      customPrettifiers: {
      query: prettifyQuery
      }
      }
      //...
      const prettifyQuery = value => {
      // do some prettify magic
      } +
      +
      customLevels?: string | object

      Change the level names and values to an user custom preset.

      +

      Can be a CSV string in 'level_name:level_value' format or an object.

      +

      Example

      ( CSV ) customLevels: 'info:10,some_level:40'
      +
      +

      Example

      ( Object ) customLevels: { info: 10, some_level: 40 }
      +
      +
      customColors?: string | object

      Change the level colors to an user custom preset.

      +

      Can be a CSV string in 'level_name:color_value' format or an object. +Also supports 'default' as level_name for fallback color.

      +

      Example

      ( CSV ) customColors: 'info:white,some_level:red'
      +
      +

      Example

      ( Object ) customColors: { info: 'white', some_level: 'red' }
      +
      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/factory._internal_.WritableStream.html b/interfaces/factory._internal_.WritableStream.html new file mode 100644 index 0000000..6c2261a --- /dev/null +++ b/interfaces/factory._internal_.WritableStream.html @@ -0,0 +1,133 @@ +WritableStream | @foxxmd/logging Docs
      interface WritableStream {
          [captureRejectionSymbol]?<K>(error, event, ...args): void;
          addListener<K>(eventName, listener): this;
          on<K>(eventName, listener): this;
          once<K>(eventName, listener): this;
          removeListener<K>(eventName, listener): this;
          off<K>(eventName, listener): this;
          removeAllListeners(event?): this;
          setMaxListeners(n): this;
          getMaxListeners(): number;
          listeners<K>(eventName): Function[];
          rawListeners<K>(eventName): Function[];
          emit<K>(eventName, ...args): boolean;
          listenerCount<K>(eventName, listener?): number;
          prependListener<K>(eventName, listener): this;
          prependOnceListener<K>(eventName, listener): this;
          eventNames(): (string | symbol)[];
          writable: boolean;
          write(buffer, cb?): boolean;
          write(str, encoding?, cb?): boolean;
          end(cb?): this;
          end(data, cb?): this;
          end(str, encoding?, cb?): this;
      }

      Hierarchy

      • EventEmitter
        • WritableStream

      Properties

      writable: boolean

      Methods

      • Type Parameters

        • K

        Parameters

        • error: Error
        • event: string | symbol
        • Rest ...args: AnyRest

        Returns void

      • Alias for emitter.on(eventName, listener).

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v0.1.26

        +
      • Adds the listener function to the end of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

        +
        server.on('connection', (stream) => {
        console.log('someone connected!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        By default, event listeners are invoked in the order they are added. Theemitter.prependListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

        +
        const myEE = new EventEmitter();
        myEE.on('foo', () => console.log('a'));
        myEE.prependListener('foo', () => console.log('b'));
        myEE.emit('foo');
        // Prints:
        // b
        // a +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event.

          +
        • listener: ((...args) => void)

          The callback function

          +
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v0.1.101

        +
      • Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

        +
        server.once('connection', (stream) => {
        console.log('Ah, we have our first user!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

        +
        const myEE = new EventEmitter();
        myEE.once('foo', () => console.log('a'));
        myEE.prependOnceListener('foo', () => console.log('b'));
        myEE.emit('foo');
        // Prints:
        // b
        // a +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event.

          +
        • listener: ((...args) => void)

          The callback function

          +
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v0.3.0

        +
      • Removes the specified listener from the listener array for the event namedeventName.

        +
        const callback = (stream) => {
        console.log('someone connected!');
        };
        server.on('connection', callback);
        // ...
        server.removeListener('connection', callback); +
        +

        removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

        +

        Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and before the last listener finishes execution +will not remove them fromemit() in progress. Subsequent events behave as expected.

        +
        const myEmitter = new MyEmitter();

        const callbackA = () => {
        console.log('A');
        myEmitter.removeListener('event', callbackB);
        };

        const callbackB = () => {
        console.log('B');
        };

        myEmitter.on('event', callbackA);

        myEmitter.on('event', callbackB);

        // callbackA removes listener callbackB but it will still be called.
        // Internal listener array at time of emit [callbackA, callbackB]
        myEmitter.emit('event');
        // Prints:
        // A
        // B

        // callbackB is now removed.
        // Internal listener array [callbackA]
        myEmitter.emit('event');
        // Prints:
        // A +
        +

        Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

        +

        When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

        +
        const ee = new EventEmitter();

        function pong() {
        console.log('pong');
        }

        ee.on('ping', pong);
        ee.once('ping', pong);
        ee.removeListener('ping', pong);

        ee.emit('ping');
        ee.emit('ping'); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v0.1.26

        +
      • Alias for emitter.removeListener().

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v10.0.0

        +
      • Removes all listeners, or those of the specified eventName.

        +

        It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        • Optional event: string | symbol

        Returns this

        Since

        v0.1.26

        +
      • By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        • n: number

        Returns this

        Since

        v0.3.5

        +
      • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

        +

        Returns number

        Since

        v1.0.0

        +
      • Returns a copy of the array of listeners for the event named eventName.

        +
        server.on('connection', (stream) => {
        console.log('someone connected!');
        });
        console.log(util.inspect(server.listeners('connection')));
        // Prints: [ [Function] ] +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

        Returns Function[]

        Since

        v0.1.26

        +
      • Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

        +
        const emitter = new EventEmitter();
        emitter.once('log', () => console.log('log once'));

        // Returns a new Array with a function `onceWrapper` which has a property
        // `listener` which contains the original listener bound above
        const listeners = emitter.rawListeners('log');
        const logFnWrapper = listeners[0];

        // Logs "log once" to the console and does not unbind the `once` event
        logFnWrapper.listener();

        // Logs "log once" to the console and removes the listener
        logFnWrapper();

        emitter.on('log', () => console.log('log persistently'));
        // Will return a new Array with a single function bound by `.on()` above
        const newListeners = emitter.rawListeners('log');

        // Logs "log persistently" twice
        newListeners[0]();
        emitter.emit('log'); +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

        Returns Function[]

        Since

        v9.4.0

        +
      • Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

        +

        Returns true if the event had listeners, false otherwise.

        +
        const EventEmitter = require('events');
        const myEmitter = new EventEmitter();

        // First listener
        myEmitter.on('event', function firstListener() {
        console.log('Helloooo! first listener');
        });
        // Second listener
        myEmitter.on('event', function secondListener(arg1, arg2) {
        console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
        });
        // Third listener
        myEmitter.on('event', function thirdListener(...args) {
        const parameters = args.join(', ');
        console.log(`event with parameters ${parameters} in third listener`);
        });

        console.log(myEmitter.listeners('event'));

        myEmitter.emit('event', 1, 2, 3, 4, 5);

        // Prints:
        // [
        // [Function: firstListener],
        // [Function: secondListener],
        // [Function: thirdListener]
        // ]
        // Helloooo! first listener
        // event with parameters 1, 2 in second listener
        // event with parameters 1, 2, 3, 4, 5 in third listener +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • Rest ...args: AnyRest

        Returns boolean

        Since

        v0.1.26

        +
      • Returns the number of listeners listening to the event named eventName.

        +

        If listener is provided, it will return how many times the listener +is found in the list of the listeners of the event.

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event being listened for

          +
        • Optional listener: Function

          The event handler function

          +

        Returns number

        Since

        v3.2.0

        +
      • Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

        +
        server.prependListener('connection', (stream) => {
        console.log('someone connected!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event.

          +
        • listener: ((...args) => void)

          The callback function

          +
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v6.0.0

        +
      • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

        +
        server.prependOnceListener('connection', (stream) => {
        console.log('Ah, we have our first user!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event.

          +
        • listener: ((...args) => void)

          The callback function

          +
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v6.0.0

        +
      • Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

        +
        const EventEmitter = require('events');
        const myEE = new EventEmitter();
        myEE.on('foo', () => {});
        myEE.on('bar', () => {});

        const sym = Symbol('symbol');
        myEE.on(sym, () => {});

        console.log(myEE.eventNames());
        // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
        +

        Returns (string | symbol)[]

        Since

        v6.0.0

        +
      • Parameters

        • buffer: string | Uint8Array
        • Optional cb: ((err?) => void)
            • (err?): void
            • Parameters

              • Optional err: Error

              Returns void

        Returns boolean

      • Parameters

        • str: string
        • Optional encoding: BufferEncoding
        • Optional cb: ((err?) => void)
            • (err?): void
            • Parameters

              • Optional err: Error

              Returns void

        Returns boolean

      • Parameters

        • Optional cb: (() => void)
            • (): void
            • Returns void

        Returns this

      • Parameters

        • data: string | Uint8Array
        • Optional cb: (() => void)
            • (): void
            • Returns void

        Returns this

      • Parameters

        • str: string
        • Optional encoding: BufferEncoding
        • Optional cb: (() => void)
            • (): void
            • Returns void

        Returns this

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index.LogOptions.html b/interfaces/index.LogOptions.html index 9ec9a71..2d02231 100644 --- a/interfaces/index.LogOptions.html +++ b/interfaces/index.LogOptions.html @@ -1,4 +1,4 @@ -LogOptions | @foxxmd/logging Docs
      interface LogOptions {
          level?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
          file?: false | "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
          filePath?: string | (() => string);
          console?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
      }

      Properties

      level? +LogOptions | @foxxmd/logging Docs
      interface LogOptions {
          level?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
          file?: false | "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
          filePath?: string | (() => string);
          console?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug";
      }

      Properties

      level? file? filePath? console? @@ -6,11 +6,11 @@

      Defaults to env LOG_LEVEL or info if not specified.

      Default

      'info'
       
      -
      file?: false | "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug"

      Specify the minimum log level to output to rotating files. If false no log files will be created.

      -
      filePath?: string | (() => string)

      The full path and filename to use for log files

      +
      file?: false | "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug"

      Specify the minimum log level to output to rotating files. If false no log files will be created.

      +
      filePath?: string | (() => string)

      The full path and filename to use for log files

      If using rolling files the filename will be appended with .N (a number) BEFORE the extension based on rolling status

      May also be specified using env LOG_PATH or a function that returns a string

      -

      Type declaration

        • (): string
        • Returns string

      Default

      'CWD/logs/app.log
      +

      Type declaration

        • (): string
        • Returns string

      Default

      'CWD/logs/app.log'
       
      -
      console?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug"

      Specify the minimum log level streamed to the console (or docker container)

      -

      Generated using TypeDoc

      \ No newline at end of file +
      console?: "silent" | "fatal" | "error" | "warn" | "info" | "log" | "verbose" | "debug"

      Specify the minimum log level streamed to the console (or docker container)

      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.AsyncIterableIterator.html b/interfaces/index._internal_.AsyncIterableIterator.html new file mode 100644 index 0000000..892bd38 --- /dev/null +++ b/interfaces/index._internal_.AsyncIterableIterator.html @@ -0,0 +1,5 @@ +AsyncIterableIterator | @foxxmd/logging Docs
      interface AsyncIterableIterator<T> {
          next(...args): Promise<IteratorResult<T, any>>;
          return?(value?): Promise<IteratorResult<T, any>>;
          throw?(e?): Promise<IteratorResult<T, any>>;
          [asyncIterator](): AsyncIterableIterator<T>;
      }

      Type Parameters

      • T

      Hierarchy (view full)

      Methods

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.AsyncIterator.html b/interfaces/index._internal_.AsyncIterator.html new file mode 100644 index 0000000..127670d --- /dev/null +++ b/interfaces/index._internal_.AsyncIterator.html @@ -0,0 +1,4 @@ +AsyncIterator | @foxxmd/logging Docs

      Interface AsyncIterator<T, TReturn, TNext>

      interface AsyncIterator<T, TReturn, TNext> {
          next(...args): Promise<IteratorResult<T, TReturn>>;
          return?(value?): Promise<IteratorResult<T, TReturn>>;
          throw?(e?): Promise<IteratorResult<T, TReturn>>;
      }

      Type Parameters

      • T
      • TReturn = any
      • TNext = undefined

      Hierarchy (view full)

      Methods

      Methods

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.AsyncResourceOptions.html b/interfaces/index._internal_.AsyncResourceOptions.html new file mode 100644 index 0000000..30f985d --- /dev/null +++ b/interfaces/index._internal_.AsyncResourceOptions.html @@ -0,0 +1,12 @@ +AsyncResourceOptions | @foxxmd/logging Docs
      interface AsyncResourceOptions {
          triggerAsyncId?: number;
          requireManualDestroy?: boolean;
      }

      Hierarchy (view full)

      Properties

      triggerAsyncId?: number

      The ID of the execution context that created this async event.

      +

      Default

      executionAsyncId()
      +
      +
      requireManualDestroy?: boolean

      Disables automatic emitDestroy when the object is garbage collected. +This usually does not need to be set (even if emitDestroy is called +manually), unless the resource's asyncId is retrieved and the +sensitive API's emitDestroy is called with it.

      +

      Default

      false
      +
      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.BaseLogger.html b/interfaces/index._internal_.BaseLogger.html new file mode 100644 index 0000000..6698a03 --- /dev/null +++ b/interfaces/index._internal_.BaseLogger.html @@ -0,0 +1,58 @@ +BaseLogger | @foxxmd/logging Docs
      interface BaseLogger {
          level: LevelWithSilentOrString;
          fatal: LogFn;
          error: LogFn;
          warn: LogFn;
          info: LogFn;
          debug: LogFn;
          trace: LogFn;
          silent: LogFn;
      }

      Properties

      Properties

      Set this property to the desired logging level. In order of priority, available levels are:

      +
        +
      • 'fatal'
      • +
      • 'error'
      • +
      • 'warn'
      • +
      • 'info'
      • +
      • 'debug'
      • +
      • 'trace'
      • +
      +

      The logging level is a minimum level. For instance if logger.level is 'info' then all 'fatal', 'error', 'warn', +and 'info' logs will be enabled.

      +

      You can pass 'silent' to disable logging.

      +
      fatal: LogFn

      Log at 'fatal' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      error: LogFn

      Log at 'error' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      warn: LogFn

      Log at 'warn' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      info: LogFn

      Log at 'info' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      debug: LogFn

      Log at 'debug' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      trace: LogFn

      Log at 'trace' level the given msg. If the first argument is an object, all its properties will be included in the JSON line. +If more args follows msg, these will be used to format msg using util.format.

      +

      Type Param: T:

      the interface of the object being serialized. Default is object.

      +

      Param: obj:

      object to be serialized

      +

      Param: msg:

      the log message to write

      +

      Param: ...args:

      format string values when msg is a format string

      +
      silent: LogFn

      Noop function.

      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.CallSite.html b/interfaces/index._internal_.CallSite.html new file mode 100644 index 0000000..cad8b1a --- /dev/null +++ b/interfaces/index._internal_.CallSite.html @@ -0,0 +1,34 @@ +CallSite | @foxxmd/logging Docs
      interface CallSite {
          getThis(): unknown;
          getTypeName(): string;
          getFunction(): Function;
          getFunctionName(): string;
          getMethodName(): string;
          getFileName(): string;
          getLineNumber(): number;
          getColumnNumber(): number;
          getEvalOrigin(): string;
          isToplevel(): boolean;
          isEval(): boolean;
          isNative(): boolean;
          isConstructor(): boolean;
      }

      Methods

      • Value of "this"

        +

        Returns unknown

      • Type of "this" as a string. +This is the name of the function stored in the constructor field of +"this", if available. Otherwise the object's [[Class]] internal +property.

        +

        Returns string

      • Current function

        +

        Returns Function

      • Name of the current function, typically its name property. +If a name property is not available an attempt will be made to try +to infer a name from the function's context.

        +

        Returns string

      • Name of the property [of "this" or one of its prototypes] that holds +the current function

        +

        Returns string

      • Name of the script [if this function was defined in a script]

        +

        Returns string

      • Current line number [if this function was defined in a script]

        +

        Returns number

      • Current column number [if this function was defined in a script]

        +

        Returns number

      • A call site object representing the location where eval was called +[if this function was created using a call to eval]

        +

        Returns string

      • Is this a toplevel invocation, that is, is "this" the global object?

        +

        Returns boolean

      • Does this call take place in code defined by a call to eval?

        +

        Returns boolean

      • Is this call in native V8 code?

        +

        Returns boolean

      • Is this a constructor call?

        +

        Returns boolean

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.ChildLoggerOptions-1.html b/interfaces/index._internal_.ChildLoggerOptions-1.html new file mode 100644 index 0000000..3e06947 --- /dev/null +++ b/interfaces/index._internal_.ChildLoggerOptions-1.html @@ -0,0 +1,7 @@ +ChildLoggerOptions | @foxxmd/logging Docs

      Interface ChildLoggerOptions<CustomLevels>

      interface ChildLoggerOptions<CustomLevels> {
          level?: LevelOrString;
          serializers?: {
              [key: string]: SerializerFn;
          };
          customLevels?: {
              [level in string]: number
          };
          formatters?: {
              level?: ((label, number) => object);
              bindings?: ((bindings) => object);
              log?: ((object) => object);
          };
          redact?: string[] | redactOptions;
          msgPrefix?: string;
      }

      Type Parameters

      • CustomLevels extends string = never

      Hierarchy (view full)

      Properties

      serializers?: {
          [key: string]: SerializerFn;
      }

      Type declaration

      customLevels?: {
          [level in string]: number
      }
      formatters?: {
          level?: ((label, number) => object);
          bindings?: ((bindings) => object);
          log?: ((object) => object);
      }

      Type declaration

      • Optional level?: ((label, number) => object)
          • (label, number): object
          • Parameters

            • label: string
            • number: number

            Returns object

      • Optional bindings?: ((bindings) => object)
          • (bindings): object
          • Parameters

            Returns object

      • Optional log?: ((object) => object)
          • (object): object
          • Parameters

            • object: object

            Returns object

      redact?: string[] | redactOptions
      msgPrefix?: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.ChildLoggerOptions.html b/interfaces/index._internal_.ChildLoggerOptions.html new file mode 100644 index 0000000..b01bc33 --- /dev/null +++ b/interfaces/index._internal_.ChildLoggerOptions.html @@ -0,0 +1,7 @@ +ChildLoggerOptions | @foxxmd/logging Docs

      Interface ChildLoggerOptions<CustomLevels>

      interface ChildLoggerOptions<CustomLevels> {
          level?: LevelOrString;
          serializers?: {
              [key: string]: SerializerFn;
          };
          customLevels?: {
              [level in string]: number
          };
          formatters?: {
              level?: ((label, number) => object);
              bindings?: ((bindings) => object);
              log?: ((object) => object);
          };
          redact?: string[] | redactOptions;
          msgPrefix?: string;
      }

      Type Parameters

      • CustomLevels extends string = never

      Hierarchy (view full)

      Properties

      serializers?: {
          [key: string]: SerializerFn;
      }

      Type declaration

      customLevels?: {
          [level in string]: number
      }
      formatters?: {
          level?: ((label, number) => object);
          bindings?: ((bindings) => object);
          log?: ((object) => object);
      }

      Type declaration

      • Optional level?: ((label, number) => object)
          • (label, number): object
          • Parameters

            • label: string
            • number: number

            Returns object

      • Optional bindings?: ((bindings) => object)
          • (bindings): object
          • Parameters

            Returns object

      • Optional log?: ((object) => object)
          • (object): object
          • Parameters

            • object: object

            Returns object

      redact?: string[] | redactOptions
      msgPrefix?: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.DestinationStream.html b/interfaces/index._internal_.DestinationStream.html new file mode 100644 index 0000000..c2e27c8 --- /dev/null +++ b/interfaces/index._internal_.DestinationStream.html @@ -0,0 +1,2 @@ +DestinationStream | @foxxmd/logging Docs
      interface DestinationStream {
          write(msg): void;
      }

      Hierarchy (view full)

      Methods

      Methods

      • Parameters

        • msg: string

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.EventEmitter-1.Abortable.html b/interfaces/index._internal_.EventEmitter-1.Abortable.html new file mode 100644 index 0000000..33265b0 --- /dev/null +++ b/interfaces/index._internal_.EventEmitter-1.Abortable.html @@ -0,0 +1,3 @@ +Abortable | @foxxmd/logging Docs
      interface Abortable {
          signal?: AbortSignal;
      }

      Properties

      Properties

      signal?: AbortSignal

      When provided the corresponding AbortController can be used to cancel an asynchronous action.

      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.EventEmitter-1.EventEmitterAsyncResourceOptions.html b/interfaces/index._internal_.EventEmitter-1.EventEmitterAsyncResourceOptions.html new file mode 100644 index 0000000..247a4c3 --- /dev/null +++ b/interfaces/index._internal_.EventEmitter-1.EventEmitterAsyncResourceOptions.html @@ -0,0 +1,19 @@ +EventEmitterAsyncResourceOptions | @foxxmd/logging Docs
      interface EventEmitterAsyncResourceOptions {
          triggerAsyncId?: number;
          requireManualDestroy?: boolean;
          captureRejections?: boolean;
          name?: string;
      }

      Hierarchy (view full)

      Properties

      triggerAsyncId?: number

      The ID of the execution context that created this async event.

      +

      Default

      executionAsyncId()
      +
      +
      requireManualDestroy?: boolean

      Disables automatic emitDestroy when the object is garbage collected. +This usually does not need to be set (even if emitDestroy is called +manually), unless the resource's asyncId is retrieved and the +sensitive API's emitDestroy is called with it.

      +

      Default

      false
      +
      +
      captureRejections?: boolean

      Enables automatic capturing of promise rejection.

      +
      name?: string

      The type of async event, this is required when instantiating EventEmitterAsyncResource +directly rather than as a child class.

      +

      Default

      new.target.name if instantiated as a child class.
      +
      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.EventEmitter-1.EventEmitterReferencingAsyncResource.html b/interfaces/index._internal_.EventEmitter-1.EventEmitterReferencingAsyncResource.html new file mode 100644 index 0000000..7f9d6d0 --- /dev/null +++ b/interfaces/index._internal_.EventEmitter-1.EventEmitterReferencingAsyncResource.html @@ -0,0 +1,34 @@ +EventEmitterReferencingAsyncResource | @foxxmd/logging Docs

      The class AsyncResource is designed to be extended by the embedder's async +resources. Using this, users can easily trigger the lifetime events of their +own resources.

      +

      The init hook will trigger when an AsyncResource is instantiated.

      +

      The following is an overview of the AsyncResource API.

      +
      import { AsyncResource, executionAsyncId } from 'async_hooks';

      // AsyncResource() is meant to be extended. Instantiating a
      // new AsyncResource() also triggers init. If triggerAsyncId is omitted then
      // async_hook.executionAsyncId() is used.
      const asyncResource = new AsyncResource(
      type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }
      );

      // Run a function in the execution context of the resource. This will
      // * establish the context of the resource
      // * trigger the AsyncHooks before callbacks
      // * call the provided function `fn` with the supplied arguments
      // * trigger the AsyncHooks after callbacks
      // * restore the original execution context
      asyncResource.runInAsyncScope(fn, thisArg, ...args);

      // Call AsyncHooks destroy callbacks.
      asyncResource.emitDestroy();

      // Return the unique ID assigned to the AsyncResource instance.
      asyncResource.asyncId();

      // Return the trigger ID for the AsyncResource instance.
      asyncResource.triggerAsyncId(); +
      +
      interface EventEmitterReferencingAsyncResource {
          bind<Func>(fn): Func & {
              asyncResource: AsyncResource;
          };
          runInAsyncScope<This, Result>(fn, thisArg?, ...args): Result;
          emitDestroy(): this;
          asyncId(): number;
          triggerAsyncId(): number;
          eventEmitter: EventEmitterAsyncResource;
      }

      Hierarchy (view full)

      Properties

      Methods

      • Binds the given function to execute to this AsyncResource's scope.

        +

        The returned function will have an asyncResource property referencing +the AsyncResource to which the function is bound.

        +

        Type Parameters

        • Func extends ((...args) => any)

        Parameters

        • fn: Func

          The function to bind to the current AsyncResource.

          +

        Returns Func & {
            asyncResource: AsyncResource;
        }

        Since

        v14.8.0, v12.19.0

        +
      • Call the provided function with the provided arguments in the execution context +of the async resource. This will establish the context, trigger the AsyncHooks +before callbacks, call the function, trigger the AsyncHooks after callbacks, and +then restore the original execution context.

        +

        Type Parameters

        • This
        • Result

        Parameters

        • fn: ((this, ...args) => Result)

          The function to call in the execution context of this async resource.

          +
        • Optional thisArg: This

          The receiver to be used for the function call.

          +
        • Rest ...args: any[]

          Optional arguments to pass to the function.

          +

        Returns Result

        Since

        v9.6.0

        +
      • Call all destroy hooks. This should only ever be called once. An error will +be thrown if it is called more than once. This must be manually called. If +the resource is left to be collected by the GC then the destroy hooks will +never be called.

        +

        Returns this

        A reference to asyncResource.

        +
      • Returns number

        The unique asyncId assigned to the resource.

        +
      • Returns number

        The same triggerAsyncId that is passed to the AsyncResource constructor.

        +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.EventEmitterOptions.html b/interfaces/index._internal_.EventEmitterOptions.html new file mode 100644 index 0000000..b207c49 --- /dev/null +++ b/interfaces/index._internal_.EventEmitterOptions.html @@ -0,0 +1,3 @@ +EventEmitterOptions | @foxxmd/logging Docs
      interface EventEmitterOptions {
          captureRejections?: boolean;
      }

      Hierarchy (view full)

      Properties

      Properties

      captureRejections?: boolean

      Enables automatic capturing of promise rejection.

      +

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.IteratorReturnResult.html b/interfaces/index._internal_.IteratorReturnResult.html new file mode 100644 index 0000000..70b34f7 --- /dev/null +++ b/interfaces/index._internal_.IteratorReturnResult.html @@ -0,0 +1,3 @@ +IteratorReturnResult | @foxxmd/logging Docs

      Interface IteratorReturnResult<TReturn>

      interface IteratorReturnResult<TReturn> {
          done: true;
          value: TReturn;
      }

      Type Parameters

      • TReturn

      Properties

      Properties

      done: true
      value: TReturn

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.IteratorYieldResult.html b/interfaces/index._internal_.IteratorYieldResult.html new file mode 100644 index 0000000..24cc1da --- /dev/null +++ b/interfaces/index._internal_.IteratorYieldResult.html @@ -0,0 +1,3 @@ +IteratorYieldResult | @foxxmd/logging Docs

      Interface IteratorYieldResult<TYield>

      interface IteratorYieldResult<TYield> {
          done?: false;
          value: TYield;
      }

      Type Parameters

      • TYield

      Properties

      Properties

      done?: false
      value: TYield

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.LevelMapping.html b/interfaces/index._internal_.LevelMapping.html new file mode 100644 index 0000000..837127e --- /dev/null +++ b/interfaces/index._internal_.LevelMapping.html @@ -0,0 +1,5 @@ +LevelMapping | @foxxmd/logging Docs
      interface LevelMapping {
          values: {
              [level: string]: number;
          };
          labels: {
              [level: number]: string;
          };
      }

      Properties

      Properties

      values: {
          [level: string]: number;
      }

      Returns the mappings of level names to their respective internal number representation.

      +

      Type declaration

      • [level: string]: number
      labels: {
          [level: number]: string;
      }

      Returns the mappings of level internal level numbers to their string representations.

      +

      Type declaration

      • [level: number]: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.LogFn-1.html b/interfaces/index._internal_.LogFn-1.html new file mode 100644 index 0000000..cec7c34 --- /dev/null +++ b/interfaces/index._internal_.LogFn-1.html @@ -0,0 +1 @@ +LogFn | @foxxmd/logging Docs
      interface LogFn {
          <T>(obj, msg?, ...args): void;
          (obj, msg?, ...args): void;
          (msg, ...args): void;
      }

      Hierarchy (view full)

      • Type Parameters

        • T extends object

        Parameters

        • obj: T
        • Optional msg: string
        • Rest ...args: any[]

        Returns void

      • Parameters

        • obj: unknown
        • Optional msg: string
        • Rest ...args: any[]

        Returns void

      • Parameters

        • msg: string
        • Rest ...args: any[]

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.LogFn.html b/interfaces/index._internal_.LogFn.html new file mode 100644 index 0000000..8786494 --- /dev/null +++ b/interfaces/index._internal_.LogFn.html @@ -0,0 +1 @@ +LogFn | @foxxmd/logging Docs
      interface LogFn {
          <T>(obj, msg?, ...args): void;
          (obj, msg?, ...args): void;
          (msg, ...args): void;
      }

      Hierarchy (view full)

      • Type Parameters

        • T extends object

        Parameters

        • obj: T
        • Optional msg: string
        • Rest ...args: any[]

        Returns void

      • Parameters

        • obj: unknown
        • Optional msg: string
        • Rest ...args: any[]

        Returns void

      • Parameters

        • msg: string
        • Rest ...args: any[]

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.LoggerExtras.html b/interfaces/index._internal_.LoggerExtras.html new file mode 100644 index 0000000..02b2717 --- /dev/null +++ b/interfaces/index._internal_.LoggerExtras.html @@ -0,0 +1,155 @@ +LoggerExtras | @foxxmd/logging Docs

      Interface LoggerExtras<CustomLevels>

      The EventEmitter class is defined and exposed by the events module:

      +
      const EventEmitter = require('events');
      +
      +

      All EventEmitters emit the event 'newListener' when new listeners are +added and 'removeListener' when existing listeners are removed.

      +

      It supports the following option:

      +

      Since

      v0.1.26

      +
      interface LoggerExtras<CustomLevels> {
          [captureRejectionSymbol]?<K>(error, event, ...args): void;
          off<K>(eventName, listener): this;
          removeAllListeners(event?): this;
          setMaxListeners(n): this;
          getMaxListeners(): number;
          listeners<K>(eventName): Function[];
          rawListeners<K>(eventName): Function[];
          emit<K>(eventName, ...args): boolean;
          listenerCount<K>(eventName, listener?): number;
          eventNames(): (string | symbol)[];
          version: string;
          levels: LevelMapping;
          useLevelLabels: boolean;
          customLevels: {
              [level in string]: number
          };
          useOnlyCustomLevels: boolean;
          levelVal: number;
          child<ChildCustomLevels>(bindings, options?): Logger<CustomLevels | ChildCustomLevels>;
          onChild: OnChildCallback<CustomLevels>;
          on(event, listener): this;
          addListener(event, listener): this;
          once(event, listener): this;
          prependListener(event, listener): this;
          prependOnceListener(event, listener): this;
          removeListener(event, listener): this;
          isLevelEnabled(level): boolean;
          bindings(): Bindings;
          setBindings(bindings): void;
          flush(cb?): void;
      }

      Type Parameters

      • CustomLevels extends string = never

      Hierarchy (view full)

      Properties

      version: string

      Exposes the Pino package version. Also available on the exported pino function.

      +
      levels: LevelMapping
      useLevelLabels: boolean

      Outputs the level as a string instead of integer.

      +
      customLevels: {
          [level in string]: number
      }

      Define additional logging levels.

      +
      useOnlyCustomLevels: boolean

      Use only defined customLevels and omit Pino's levels.

      +
      levelVal: number

      Returns the integer value for the logger instance's logging level.

      +

      This can be used to modify the callback function on creation of a new child.

      +

      Methods

      • Type Parameters

        • K

        Parameters

        • error: Error
        • event: string | symbol
        • Rest ...args: AnyRest

        Returns void

      • Alias for emitter.removeListener().

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

        Since

        v10.0.0

        +
      • Removes all listeners, or those of the specified eventName.

        +

        It is bad practice to remove listeners added elsewhere in the code, +particularly when the EventEmitter instance was created by some other +component or module (e.g. sockets or file streams).

        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        • Optional event: string | symbol

        Returns this

        Since

        v0.1.26

        +
      • By default EventEmitters will print a warning if more than 10 listeners are +added for a particular event. This is a useful default that helps finding +memory leaks. The emitter.setMaxListeners() method allows the limit to be +modified for this specific EventEmitter instance. The value can be set toInfinity (or 0) to indicate an unlimited number of listeners.

        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        • n: number

        Returns this

        Since

        v0.3.5

        +
      • Returns the current max listener value for the EventEmitter which is either +set by emitter.setMaxListeners(n) or defaults to defaultMaxListeners.

        +

        Returns number

        Since

        v1.0.0

        +
      • Returns a copy of the array of listeners for the event named eventName.

        +
        server.on('connection', (stream) => {
        console.log('someone connected!');
        });
        console.log(util.inspect(server.listeners('connection')));
        // Prints: [ [Function] ] +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

        Returns Function[]

        Since

        v0.1.26

        +
      • Returns a copy of the array of listeners for the event named eventName, +including any wrappers (such as those created by .once()).

        +
        const emitter = new EventEmitter();
        emitter.once('log', () => console.log('log once'));

        // Returns a new Array with a function `onceWrapper` which has a property
        // `listener` which contains the original listener bound above
        const listeners = emitter.rawListeners('log');
        const logFnWrapper = listeners[0];

        // Logs "log once" to the console and does not unbind the `once` event
        logFnWrapper.listener();

        // Logs "log once" to the console and removes the listener
        logFnWrapper();

        emitter.on('log', () => console.log('log persistently'));
        // Will return a new Array with a single function bound by `.on()` above
        const newListeners = emitter.rawListeners('log');

        // Logs "log persistently" twice
        newListeners[0]();
        emitter.emit('log'); +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

        Returns Function[]

        Since

        v9.4.0

        +
      • Synchronously calls each of the listeners registered for the event namedeventName, in the order they were registered, passing the supplied arguments +to each.

        +

        Returns true if the event had listeners, false otherwise.

        +
        const EventEmitter = require('events');
        const myEmitter = new EventEmitter();

        // First listener
        myEmitter.on('event', function firstListener() {
        console.log('Helloooo! first listener');
        });
        // Second listener
        myEmitter.on('event', function secondListener(arg1, arg2) {
        console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
        });
        // Third listener
        myEmitter.on('event', function thirdListener(...args) {
        const parameters = args.join(', ');
        console.log(`event with parameters ${parameters} in third listener`);
        });

        console.log(myEmitter.listeners('event'));

        myEmitter.emit('event', 1, 2, 3, 4, 5);

        // Prints:
        // [
        // [Function: firstListener],
        // [Function: secondListener],
        // [Function: thirdListener]
        // ]
        // Helloooo! first listener
        // event with parameters 1, 2 in second listener
        // event with parameters 1, 2, 3, 4, 5 in third listener +
        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol
        • Rest ...args: AnyRest

        Returns boolean

        Since

        v0.1.26

        +
      • Returns the number of listeners listening to the event named eventName.

        +

        If listener is provided, it will return how many times the listener +is found in the list of the listeners of the event.

        +

        Type Parameters

        • K

        Parameters

        • eventName: string | symbol

          The name of the event being listened for

          +
        • Optional listener: Function

          The event handler function

          +

        Returns number

        Since

        v3.2.0

        +
      • Returns an array listing the events for which the emitter has registered +listeners. The values in the array are strings or Symbols.

        +
        const EventEmitter = require('events');
        const myEE = new EventEmitter();
        myEE.on('foo', () => {});
        myEE.on('bar', () => {});

        const sym = Symbol('symbol');
        myEE.on(sym, () => {});

        console.log(myEE.eventNames());
        // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
        +

        Returns (string | symbol)[]

        Since

        v6.0.0

        +
      • Creates a child logger, setting all key-value pairs in bindings as properties in the log lines. All serializers will be applied to the given pair. +Child loggers use the same output stream as the parent and inherit the current log level of the parent at the time they are spawned. +From v2.x.x the log level of a child is mutable (whereas in v1.x.x it was immutable), and can be set independently of the parent. +If a level property is present in the object passed to child it will override the child logger level.

        +

        Type Parameters

        • ChildCustomLevels extends string = never

        Parameters

        Returns Logger<CustomLevels | ChildCustomLevels>

        a child logger instance.

        +
      • Registers a listener function that is triggered when the level is changed. +Note: When browserified, this functionality will only be available if the events module has been required elsewhere +(e.g. if you're using streams in the browser). This allows for a trade-off between bundle size and functionality.

        +

        Parameters

        Returns this

      • Adds a one-timelistener function for the event named eventName. The +next time eventName is triggered, this listener is removed and then invoked.

        +
        server.once('connection', (stream) => {
        console.log('Ah, we have our first user!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        By default, event listeners are invoked in the order they are added. Theemitter.prependOnceListener() method can be used as an alternative to add the +event listener to the beginning of the listeners array.

        +
        const myEE = new EventEmitter();
        myEE.once('foo', () => console.log('a'));
        myEE.prependOnceListener('foo', () => console.log('b'));
        myEE.emit('foo');
        // Prints:
        // b
        // a +
        +

        Parameters

        Returns this

        Since

        v0.3.0

        +
      • Adds the listener function to the beginning of the listeners array for the +event named eventName. No checks are made to see if the listener has +already been added. Multiple calls passing the same combination of eventNameand listener will result in the listener being added, and called, multiple +times.

        +
        server.prependListener('connection', (stream) => {
        console.log('someone connected!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        Returns this

        Since

        v6.0.0

        +
      • Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this +listener is removed, and then invoked.

        +
        server.prependOnceListener('connection', (stream) => {
        console.log('Ah, we have our first user!');
        }); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        Returns this

        Since

        v6.0.0

        +
      • Removes the specified listener from the listener array for the event namedeventName.

        +
        const callback = (stream) => {
        console.log('someone connected!');
        };
        server.on('connection', callback);
        // ...
        server.removeListener('connection', callback); +
        +

        removeListener() will remove, at most, one instance of a listener from the +listener array. If any single listener has been added multiple times to the +listener array for the specified eventName, then removeListener() must be +called multiple times to remove each instance.

        +

        Once an event is emitted, all listeners attached to it at the +time of emitting are called in order. This implies that anyremoveListener() or removeAllListeners() calls after emitting and before the last listener finishes execution +will not remove them fromemit() in progress. Subsequent events behave as expected.

        +
        const myEmitter = new MyEmitter();

        const callbackA = () => {
        console.log('A');
        myEmitter.removeListener('event', callbackB);
        };

        const callbackB = () => {
        console.log('B');
        };

        myEmitter.on('event', callbackA);

        myEmitter.on('event', callbackB);

        // callbackA removes listener callbackB but it will still be called.
        // Internal listener array at time of emit [callbackA, callbackB]
        myEmitter.emit('event');
        // Prints:
        // A
        // B

        // callbackB is now removed.
        // Internal listener array [callbackA]
        myEmitter.emit('event');
        // Prints:
        // A +
        +

        Because listeners are managed using an internal array, calling this will +change the position indices of any listener registered after the listener +being removed. This will not impact the order in which listeners are called, +but it means that any copies of the listener array as returned by +the emitter.listeners() method will need to be recreated.

        +

        When a single function has been added as a handler multiple times for a single +event (as in the example below), removeListener() will remove the most +recently added instance. In the example the once('ping')listener is removed:

        +
        const ee = new EventEmitter();

        function pong() {
        console.log('pong');
        }

        ee.on('ping', pong);
        ee.once('ping', pong);
        ee.removeListener('ping', pong);

        ee.emit('ping');
        ee.emit('ping'); +
        +

        Returns a reference to the EventEmitter, so that calls can be chained.

        +

        Parameters

        Returns this

        Since

        v0.1.26

        +
      • A utility method for determining if a given log level will write to the destination.

        +

        Parameters

        Returns boolean

      • Returns an object containing all the current bindings, cloned from the ones passed in via logger.child().

        +

        Returns Bindings

      • Adds to the bindings of this logger instance. +Note: Does not overwrite bindings. Can potentially result in duplicate keys in log lines.

        +

        Parameters

        Returns void

      • Flushes the content of the buffer when using pino.destination({ sync: false }). +call the callback when finished

        +

        Parameters

        • Optional cb: ((err?) => void)
            • (err?): void
            • Parameters

              • Optional err: Error

              Returns void

        Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.PromiseLike.html b/interfaces/index._internal_.PromiseLike.html new file mode 100644 index 0000000..1f168f4 --- /dev/null +++ b/interfaces/index._internal_.PromiseLike.html @@ -0,0 +1,6 @@ +PromiseLike | @foxxmd/logging Docs
      interface PromiseLike<T> {
          then<TResult1, TResult2>(onfulfilled?, onrejected?): PromiseLike<TResult1 | TResult2>;
      }

      Type Parameters

      • T

      Methods

      Methods

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.StaticEventEmitterOptions.html b/interfaces/index._internal_.StaticEventEmitterOptions.html new file mode 100644 index 0000000..2a59a25 --- /dev/null +++ b/interfaces/index._internal_.StaticEventEmitterOptions.html @@ -0,0 +1,2 @@ +StaticEventEmitterOptions | @foxxmd/logging Docs
      interface StaticEventEmitterOptions {
          signal?: AbortSignal;
      }

      Properties

      Properties

      signal?: AbortSignal

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.StreamEntry-1.html b/interfaces/index._internal_.StreamEntry-1.html new file mode 100644 index 0000000..2da1b42 --- /dev/null +++ b/interfaces/index._internal_.StreamEntry-1.html @@ -0,0 +1,3 @@ +StreamEntry | @foxxmd/logging Docs
      interface StreamEntry<TLevel> {
          stream: DestinationStream;
          level?: TLevel;
      }

      Type Parameters

      Hierarchy (view full)

      Properties

      Properties

      level?: TLevel

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.StreamEntry.html b/interfaces/index._internal_.StreamEntry.html new file mode 100644 index 0000000..7d2e743 --- /dev/null +++ b/interfaces/index._internal_.StreamEntry.html @@ -0,0 +1,3 @@ +StreamEntry | @foxxmd/logging Docs
      interface StreamEntry<TLevel> {
          stream: DestinationStream;
          level?: TLevel;
      }

      Type Parameters

      Hierarchy (view full)

      Properties

      Properties

      level?: TLevel

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_._DOMEventTarget.html b/interfaces/index._internal_._DOMEventTarget.html new file mode 100644 index 0000000..41c4fdf --- /dev/null +++ b/interfaces/index._internal_._DOMEventTarget.html @@ -0,0 +1,2 @@ +_DOMEventTarget | @foxxmd/logging Docs
      interface _DOMEventTarget {
          addEventListener(eventName, listener, opts?): any;
      }

      Methods

      • Parameters

        • eventName: string
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        • Optional opts: {
              once: boolean;
          }
          • once: boolean

        Returns any

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_._NodeEventTarget.html b/interfaces/index._internal_._NodeEventTarget.html new file mode 100644 index 0000000..704d39e --- /dev/null +++ b/interfaces/index._internal_._NodeEventTarget.html @@ -0,0 +1,2 @@ +_NodeEventTarget | @foxxmd/logging Docs
      interface _NodeEventTarget {
          once(eventName, listener): this;
      }

      Methods

      Methods

      • Parameters

        • eventName: string | symbol
        • listener: ((...args) => void)
            • (...args): void
            • Parameters

              • Rest ...args: any[]

              Returns void

        Returns this

      Generated using TypeDoc

      \ No newline at end of file diff --git a/interfaces/index._internal_.redactOptions.html b/interfaces/index._internal_.redactOptions.html new file mode 100644 index 0000000..c0eaea1 --- /dev/null +++ b/interfaces/index._internal_.redactOptions.html @@ -0,0 +1,4 @@ +redactOptions | @foxxmd/logging Docs
      interface redactOptions {
          paths: string[];
          censor?: string | ((value, path) => any);
          remove?: boolean;
      }

      Properties

      Properties

      paths: string[]
      censor?: string | ((value, path) => any)

      Type declaration

        • (value, path): any
        • Parameters

          • value: any
          • path: string[]

          Returns any

      remove?: boolean

      Generated using TypeDoc

      \ No newline at end of file diff --git a/media/example.png b/media/example.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bbfd78af9757b5756294a9ed04b3c55744a75f GIT binary patch literal 141304 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%0AZbkV(NzT3PtVA$=3v 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 qO9wC4ci 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 z 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⪼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 bya!pjaTnY!l2c-!e-vfaWGdf&{`NlreS}D7 literal 0 HcmV?d00001 diff --git a/modules/factory._internal_.html b/modules/factory._internal_.html new file mode 100644 index 0000000..85647e4 --- /dev/null +++ b/modules/factory._internal_.html @@ -0,0 +1,15 @@ +<internal> | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/modules/factory.html b/modules/factory.html index 57da2c3..e9e14ae 100644 --- a/modules/factory.html +++ b/modules/factory.html @@ -1,4 +1,7 @@ -factory | @foxxmd/logging Docs

      Index

      Variables

      prettyConsole +factory | @foxxmd/logging Docs

      Index

      Modules

      Type Aliases

      Variables

      Functions

      buildDestinationRollingFile buildDestinationFile diff --git a/modules/index._internal_.EventEmitter-1.html b/modules/index._internal_.EventEmitter-1.html new file mode 100644 index 0000000..b124c08 --- /dev/null +++ b/modules/index._internal_.EventEmitter-1.html @@ -0,0 +1,6 @@ +EventEmitter | @foxxmd/logging Docs

      References

      Re-exports EventEmitter

      Generated using TypeDoc

      \ No newline at end of file diff --git a/modules/index._internal_.html b/modules/index._internal_.html new file mode 100644 index 0000000..76b5006 --- /dev/null +++ b/modules/index._internal_.html @@ -0,0 +1,49 @@ +<internal> | @foxxmd/logging Docs

      Generated using TypeDoc

      \ No newline at end of file diff --git a/modules/index.html b/modules/index.html index c1b05af..928f288 100644 --- a/modules/index.html +++ b/modules/index.html @@ -1,4 +1,5 @@ -index | @foxxmd/logging Docs

      Index

      Interfaces

      LogOptions +index | @foxxmd/logging Docs

      Index

      Modules

      Interfaces

      Type Aliases

      LogLevel Logger LogLevelStreamEntry diff --git a/types/factory.FileDestination.html b/types/factory.FileDestination.html new file mode 100644 index 0000000..c61b066 --- /dev/null +++ b/types/factory.FileDestination.html @@ -0,0 +1 @@ +FileDestination | @foxxmd/logging Docs
      FileDestination: Omit<PrettyOptions_, "destination" | "sync"> & {
          path: string | (() => string);
      }

      Type declaration

      • path: string | (() => string)

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory.StreamDestination.html b/types/factory.StreamDestination.html new file mode 100644 index 0000000..0d1791d --- /dev/null +++ b/types/factory.StreamDestination.html @@ -0,0 +1 @@ +StreamDestination | @foxxmd/logging Docs
      StreamDestination: Omit<PrettyOptions_, "destination"> & {
          destination: number | DestinationStream | WritableStream;
      }

      Type declaration

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.BufferEncoding.html b/types/factory._internal_.BufferEncoding.html new file mode 100644 index 0000000..14aff5a --- /dev/null +++ b/types/factory._internal_.BufferEncoding.html @@ -0,0 +1 @@ +BufferEncoding | @foxxmd/logging Docs
      BufferEncoding: "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "base64url" | "latin1" | "binary" | "hex"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.Color.html b/types/factory._internal_.Color.html new file mode 100644 index 0000000..542aa53 --- /dev/null +++ b/types/factory._internal_.Color.html @@ -0,0 +1 @@ +Color | @foxxmd/logging Docs
      Color: ((text) => string)

      Type declaration

        • (text): string
        • Parameters

          • text: string | number

          Returns string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.Exclude.html b/types/factory._internal_.Exclude.html new file mode 100644 index 0000000..f770e28 --- /dev/null +++ b/types/factory._internal_.Exclude.html @@ -0,0 +1,2 @@ +Exclude | @foxxmd/logging Docs
      Exclude<T, U>: T extends U
          ? never
          : T

      Exclude from T those types that are assignable to U

      +

      Type Parameters

      • T
      • U

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.LevelPrettifierExtras.html b/types/factory._internal_.LevelPrettifierExtras.html new file mode 100644 index 0000000..5d0b9a5 --- /dev/null +++ b/types/factory._internal_.LevelPrettifierExtras.html @@ -0,0 +1 @@ +LevelPrettifierExtras | @foxxmd/logging Docs
      LevelPrettifierExtras: {
          label: string;
          labelColorized: string;
      }

      Type declaration

      • label: string
      • labelColorized: string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.LogDescriptor.html b/types/factory._internal_.LogDescriptor.html new file mode 100644 index 0000000..15626d7 --- /dev/null +++ b/types/factory._internal_.LogDescriptor.html @@ -0,0 +1 @@ +LogDescriptor | @foxxmd/logging Docs
      LogDescriptor: Record<string, unknown>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.MessageFormatFunc.html b/types/factory._internal_.MessageFormatFunc.html new file mode 100644 index 0000000..328d2a0 --- /dev/null +++ b/types/factory._internal_.MessageFormatFunc.html @@ -0,0 +1 @@ +MessageFormatFunc | @foxxmd/logging Docs
      MessageFormatFunc: ((log, messageKey, levelLabel, extras) => string)

      Type declaration

        • (log, messageKey, levelLabel, extras): string
        • Parameters

          Returns string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.Omit.html b/types/factory._internal_.Omit.html new file mode 100644 index 0000000..772f724 --- /dev/null +++ b/types/factory._internal_.Omit.html @@ -0,0 +1,2 @@ +Omit | @foxxmd/logging Docs
      Omit<T, K>: Pick<T, Exclude<keyof T, K>>

      Construct a type with the properties of T except for those in type K.

      +

      Type Parameters

      • T
      • K extends keyof any

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.Pick.html b/types/factory._internal_.Pick.html new file mode 100644 index 0000000..6df148c --- /dev/null +++ b/types/factory._internal_.Pick.html @@ -0,0 +1,2 @@ +Pick | @foxxmd/logging Docs
      Pick<T, K>: {
          [P in K]: T[P]
      }

      From T, pick a set of properties whose keys are in the union K

      +

      Type Parameters

      • T
      • K extends keyof T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.Prettifier.html b/types/factory._internal_.Prettifier.html new file mode 100644 index 0000000..fac3fed --- /dev/null +++ b/types/factory._internal_.Prettifier.html @@ -0,0 +1 @@ +Prettifier | @foxxmd/logging Docs
      Prettifier<T>: ((inputData, key, log, extras) => string)

      Type Parameters

      • T = object

      Type declaration

        • (inputData, key, log, extras): string
        • Parameters

          Returns string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/factory._internal_.PrettifierExtras.html b/types/factory._internal_.PrettifierExtras.html new file mode 100644 index 0000000..999abea --- /dev/null +++ b/types/factory._internal_.PrettifierExtras.html @@ -0,0 +1 @@ +PrettifierExtras | @foxxmd/logging Docs
      PrettifierExtras<T>: {
          colors: Colorette;
      } & T

      Type Parameters

      • T = object

      Type declaration

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index.LogData.html b/types/index.LogData.html index 8f61c1d..c46b85c 100644 --- a/types/index.LogData.html +++ b/types/index.LogData.html @@ -1 +1 @@ -LogData | @foxxmd/logging Docs
      LogData: Record<string, any> & {
          level: number;
          time: number;
          pid: number;
          hostname: string;
          labels: any[];
          msg: string | Error | ErrorWithCause;
      }

      Type declaration

      • level: number
      • time: number
      • pid: number
      • hostname: string
      • labels: any[]
      • msg: string | Error | ErrorWithCause

      Generated using TypeDoc

      \ No newline at end of file +LogData | @foxxmd/logging Docs
      LogData: Record<string, any> & {
          level: number;
          time: number;
          pid: number;
          hostname: string;
          labels: any[];
          msg: string | Error | ErrorWithCause;
      }

      Type declaration

      • level: number
      • time: number
      • pid: number
      • hostname: string
      • labels: any[]
      • msg: string | Error | ErrorWithCause

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index.LogLevel.html b/types/index.LogLevel.html index 2fff266..ad999ba 100644 --- a/types/index.LogLevel.html +++ b/types/index.LogLevel.html @@ -1 +1 @@ -LogLevel | @foxxmd/logging Docs
      LogLevel: typeof LOG_LEVELS[number]

      Generated using TypeDoc

      \ No newline at end of file +LogLevel | @foxxmd/logging Docs
      LogLevel: typeof LOG_LEVELS[number]

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index.LogLevelStreamEntry.html b/types/index.LogLevelStreamEntry.html index a0f0bba..a378a4d 100644 --- a/types/index.LogLevelStreamEntry.html +++ b/types/index.LogLevelStreamEntry.html @@ -1 +1 @@ -LogLevelStreamEntry | @foxxmd/logging Docs

      Type alias LogLevelStreamEntry

      LogLevelStreamEntry: StreamEntry<LogLevel>

      Generated using TypeDoc

      \ No newline at end of file +LogLevelStreamEntry | @foxxmd/logging Docs

      Type alias LogLevelStreamEntry

      LogLevelStreamEntry: StreamEntry<LogLevel>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index.Logger.html b/types/index.Logger.html index 25687e7..44a38e6 100644 --- a/types/index.Logger.html +++ b/types/index.Logger.html @@ -1 +1 @@ -Logger | @foxxmd/logging Docs
      Logger: PinoLogger<LogLevel> & {
          labels: any[];
          addLabel: ((value) => void);
      }

      Type declaration

      • labels: any[]
      • addLabel: ((value) => void)
          • (value): void
          • Parameters

            • value: any

            Returns void

      Generated using TypeDoc

      \ No newline at end of file +Logger | @foxxmd/logging Docs
      Logger: Logger<LogLevel> & {
          labels: any[];
          addLabel: ((value) => void);
      }

      Type declaration

      • labels: any[]
      • addLabel: ((value) => void)
          • (value): void
          • Parameters

            • value: any

            Returns void

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.AnyRest.html b/types/index._internal_.AnyRest.html new file mode 100644 index 0000000..02bbdeb --- /dev/null +++ b/types/index._internal_.AnyRest.html @@ -0,0 +1 @@ +AnyRest | @foxxmd/logging Docs
      AnyRest: [args: any[]]

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Args.html b/types/index._internal_.Args.html new file mode 100644 index 0000000..5924b21 --- /dev/null +++ b/types/index._internal_.Args.html @@ -0,0 +1 @@ +Args | @foxxmd/logging Docs
      Args<K, T>: T extends DefaultEventMap
          ? AnyRest
          : K extends keyof T
              ? T[K]
              : never

      Type Parameters

      • K
      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Bindings.html b/types/index._internal_.Bindings.html new file mode 100644 index 0000000..f442563 --- /dev/null +++ b/types/index._internal_.Bindings.html @@ -0,0 +1 @@ +Bindings | @foxxmd/logging Docs
      Bindings: Record<string, any>

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.CustomLevelLogger.html b/types/index._internal_.CustomLevelLogger.html new file mode 100644 index 0000000..2d49f47 --- /dev/null +++ b/types/index._internal_.CustomLevelLogger.html @@ -0,0 +1 @@ +CustomLevelLogger | @foxxmd/logging Docs

      Type alias CustomLevelLogger<CustomLevels>

      CustomLevelLogger<CustomLevels>: {
          [level in CustomLevels]: LogFn
      }

      Type Parameters

      • CustomLevels extends string

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.DefaultEventMap.html b/types/index._internal_.DefaultEventMap.html new file mode 100644 index 0000000..82fa25f --- /dev/null +++ b/types/index._internal_.DefaultEventMap.html @@ -0,0 +1 @@ +DefaultEventMap | @foxxmd/logging Docs
      DefaultEventMap: [never]

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.EventMap.html b/types/index._internal_.EventMap.html new file mode 100644 index 0000000..1b3867a --- /dev/null +++ b/types/index._internal_.EventMap.html @@ -0,0 +1 @@ +EventMap | @foxxmd/logging Docs
      EventMap<T>: Record<keyof T, any[]> | DefaultEventMap

      Type Parameters

      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.IteratorResult.html b/types/index._internal_.IteratorResult.html new file mode 100644 index 0000000..0f4841e --- /dev/null +++ b/types/index._internal_.IteratorResult.html @@ -0,0 +1 @@ +IteratorResult | @foxxmd/logging Docs

      Type alias IteratorResult<T, TReturn>

      Type Parameters

      • T
      • TReturn = any

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Key.html b/types/index._internal_.Key.html new file mode 100644 index 0000000..1509d41 --- /dev/null +++ b/types/index._internal_.Key.html @@ -0,0 +1 @@ +Key | @foxxmd/logging Docs
      Key<K, T>: T extends DefaultEventMap
          ? string | symbol
          : K | keyof T

      Type Parameters

      • K
      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Key2.html b/types/index._internal_.Key2.html new file mode 100644 index 0000000..0cf00a7 --- /dev/null +++ b/types/index._internal_.Key2.html @@ -0,0 +1 @@ +Key2 | @foxxmd/logging Docs
      Key2<K, T>: T extends DefaultEventMap
          ? string | symbol
          : K & keyof T

      Type Parameters

      • K
      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Level-1.html b/types/index._internal_.Level-1.html new file mode 100644 index 0000000..40b9180 --- /dev/null +++ b/types/index._internal_.Level-1.html @@ -0,0 +1 @@ +Level | @foxxmd/logging Docs
      Level: Level

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Level.html b/types/index._internal_.Level.html new file mode 100644 index 0000000..1d30928 --- /dev/null +++ b/types/index._internal_.Level.html @@ -0,0 +1 @@ +Level | @foxxmd/logging Docs
      Level: "fatal" | "error" | "warn" | "info" | "debug" | "trace"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.LevelChangeEventListener.html b/types/index._internal_.LevelChangeEventListener.html new file mode 100644 index 0000000..4602871 --- /dev/null +++ b/types/index._internal_.LevelChangeEventListener.html @@ -0,0 +1 @@ +LevelChangeEventListener | @foxxmd/logging Docs

      Type alias LevelChangeEventListener<CustomLevels>

      LevelChangeEventListener<CustomLevels>: ((lvl, val, prevLvl, prevVal, logger) => void)

      Type Parameters

      • CustomLevels extends string = never

      Type declaration

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.LevelOrString.html b/types/index._internal_.LevelOrString.html new file mode 100644 index 0000000..733943c --- /dev/null +++ b/types/index._internal_.LevelOrString.html @@ -0,0 +1 @@ +LevelOrString | @foxxmd/logging Docs
      LevelOrString: Level | string & {}

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.LevelWithSilent.html b/types/index._internal_.LevelWithSilent.html new file mode 100644 index 0000000..0d70219 --- /dev/null +++ b/types/index._internal_.LevelWithSilent.html @@ -0,0 +1 @@ +LevelWithSilent | @foxxmd/logging Docs
      LevelWithSilent: Level | "silent"

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.LevelWithSilentOrString.html b/types/index._internal_.LevelWithSilentOrString.html new file mode 100644 index 0000000..8de8287 --- /dev/null +++ b/types/index._internal_.LevelWithSilentOrString.html @@ -0,0 +1 @@ +LevelWithSilentOrString | @foxxmd/logging Docs
      LevelWithSilentOrString: LevelWithSilent | string & {}

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Listener.html b/types/index._internal_.Listener.html new file mode 100644 index 0000000..79c581a --- /dev/null +++ b/types/index._internal_.Listener.html @@ -0,0 +1 @@ +Listener | @foxxmd/logging Docs
      Listener<K, T, F>: T extends DefaultEventMap
          ? F
          : K extends keyof T
              ? T[K] extends unknown[]
                  ? ((...args) => void)
                  : never
              : never

      Type Parameters

      • K
      • T
      • F

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Logger-1.html b/types/index._internal_.Logger-1.html new file mode 100644 index 0000000..1dc235d --- /dev/null +++ b/types/index._internal_.Logger-1.html @@ -0,0 +1 @@ +Logger | @foxxmd/logging Docs

      Type alias Logger<CustomLevels>

      Type Parameters

      • CustomLevels extends string = never

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Logger.html b/types/index._internal_.Logger.html new file mode 100644 index 0000000..85042fa --- /dev/null +++ b/types/index._internal_.Logger.html @@ -0,0 +1 @@ +Logger | @foxxmd/logging Docs

      Type alias Logger<CustomLevels>

      Type Parameters

      • CustomLevels extends string = never

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.OnChildCallback.html b/types/index._internal_.OnChildCallback.html new file mode 100644 index 0000000..d404d68 --- /dev/null +++ b/types/index._internal_.OnChildCallback.html @@ -0,0 +1,2 @@ +OnChildCallback | @foxxmd/logging Docs

      Type alias OnChildCallback<CustomLevels>

      OnChildCallback<CustomLevels>: ((child) => void)

      A synchronous callback that will run on each creation of a new child.

      +

      Type Parameters

      • CustomLevels extends string = never

      Type declaration

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Record.html b/types/index._internal_.Record.html new file mode 100644 index 0000000..0ff4ed8 --- /dev/null +++ b/types/index._internal_.Record.html @@ -0,0 +1,2 @@ +Record | @foxxmd/logging Docs
      Record<K, T>: {
          [P in K]: T
      }

      Construct a type with a set of properties K of type T

      +

      Type Parameters

      • K extends keyof any
      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.Required.html b/types/index._internal_.Required.html new file mode 100644 index 0000000..2bedf99 --- /dev/null +++ b/types/index._internal_.Required.html @@ -0,0 +1,2 @@ +Required | @foxxmd/logging Docs
      Required<T>: {
          [P in keyof T]-?: T[P]
      }

      Make all properties in T required

      +

      Type Parameters

      • T

      Generated using TypeDoc

      \ No newline at end of file diff --git a/types/index._internal_.SerializerFn.html b/types/index._internal_.SerializerFn.html new file mode 100644 index 0000000..af1fb3b --- /dev/null +++ b/types/index._internal_.SerializerFn.html @@ -0,0 +1 @@ +SerializerFn | @foxxmd/logging Docs
      SerializerFn: ((value) => any)

      Type declaration

        • (value): any
        • Parameters

          • value: any

          Returns any

      Generated using TypeDoc

      \ No newline at end of file diff --git a/variables/factory.prettyConsole.html b/variables/factory.prettyConsole.html index 70a8da6..6823cc9 100644 --- a/variables/factory.prettyConsole.html +++ b/variables/factory.prettyConsole.html @@ -1 +1 @@ -prettyConsole | @foxxmd/logging Docs

      Variable prettyConsoleConst

      prettyConsole: PrettyOptions = ...

      Generated using TypeDoc

      \ No newline at end of file +prettyConsole | @foxxmd/logging Docs

      Variable prettyConsoleConst

      prettyConsole: PrettyOptions_ = ...

      Generated using TypeDoc

      \ No newline at end of file diff --git a/variables/factory.prettyFile.html b/variables/factory.prettyFile.html index fe2551d..c03172a 100644 --- a/variables/factory.prettyFile.html +++ b/variables/factory.prettyFile.html @@ -1 +1 @@ -prettyFile | @foxxmd/logging Docs

      Variable prettyFileConst

      prettyFile: PrettyOptions = ...

      Generated using TypeDoc

      \ No newline at end of file +prettyFile | @foxxmd/logging Docs

      Variable prettyFileConst

      prettyFile: PrettyOptions_ = ...

      Generated using TypeDoc

      \ No newline at end of file diff --git a/variables/index.LOG_LEVELS.html b/variables/index.LOG_LEVELS.html index 35eb300..54be655 100644 --- a/variables/index.LOG_LEVELS.html +++ b/variables/index.LOG_LEVELS.html @@ -1 +1 @@ -LOG_LEVELS | @foxxmd/logging Docs

      Variable LOG_LEVELSConst

      LOG_LEVELS: readonly ["silent", "fatal", "error", "warn", "info", "log", "verbose", "debug"] = ...

      Generated using TypeDoc

      \ No newline at end of file +LOG_LEVELS | @foxxmd/logging Docs

      Variable LOG_LEVELSConst

      LOG_LEVELS: readonly ["silent", "fatal", "error", "warn", "info", "log", "verbose", "debug"] = ...

      Generated using TypeDoc

      \ No newline at end of file diff --git a/variables/index.loggerDebug.html b/variables/index.loggerDebug.html index bdafcb4..1659b12 100644 --- a/variables/index.loggerDebug.html +++ b/variables/index.loggerDebug.html @@ -1 +1 @@ -loggerDebug | @foxxmd/logging Docs

      Variable loggerDebugConst

      loggerDebug: Logger = ...

      Generated using TypeDoc

      \ No newline at end of file +loggerDebug | @foxxmd/logging Docs

      Variable loggerDebugConst

      loggerDebug: Logger = ...

      Generated using TypeDoc

      \ No newline at end of file diff --git a/variables/index.loggerTest.html b/variables/index.loggerTest.html index fece51a..54ead87 100644 --- a/variables/index.loggerTest.html +++ b/variables/index.loggerTest.html @@ -1 +1 @@ -loggerTest | @foxxmd/logging Docs

      Variable loggerTestConst

      loggerTest: Logger = ...

      Generated using TypeDoc

      \ No newline at end of file +loggerTest | @foxxmd/logging Docs

      Variable loggerTestConst

      loggerTest: Logger = ...

      Generated using TypeDoc

      \ No newline at end of file