@fgv/ts-utils 5.1.0-3 → 5.1.0-31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +21 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/packlets/base/brand.js.map +1 -0
  4. package/dist/packlets/base/index.js +2 -0
  5. package/dist/packlets/base/index.js.map +1 -0
  6. package/dist/packlets/base/mapResults.js.map +1 -0
  7. package/dist/packlets/base/messageAggregator.js.map +1 -0
  8. package/dist/packlets/base/normalize.js +54 -1
  9. package/dist/packlets/base/normalize.js.map +1 -0
  10. package/dist/packlets/base/result.js +299 -2
  11. package/dist/packlets/base/result.js.map +1 -0
  12. package/dist/packlets/base/shouldNotFail.js +123 -0
  13. package/dist/packlets/base/shouldNotFail.js.map +1 -0
  14. package/dist/packlets/base/utils.js.map +1 -0
  15. package/dist/packlets/base/uuid.js +55 -0
  16. package/dist/packlets/base/uuid.js.map +1 -0
  17. package/dist/packlets/collections/aggregatedResultMap.js.map +1 -0
  18. package/dist/packlets/collections/collectible.js.map +1 -0
  19. package/dist/packlets/collections/collector.js +23 -9
  20. package/dist/packlets/collections/collector.js.map +1 -0
  21. package/dist/packlets/collections/collectorValidator.js +6 -1
  22. package/dist/packlets/collections/collectorValidator.js.map +1 -0
  23. package/dist/packlets/collections/common.js.map +1 -0
  24. package/dist/packlets/collections/converters.js.map +1 -0
  25. package/dist/packlets/collections/convertingCollector.js.map +1 -0
  26. package/dist/packlets/collections/convertingCollectorValidator.js.map +1 -0
  27. package/dist/packlets/collections/convertingResultMap.js.map +1 -0
  28. package/dist/packlets/collections/index.js.map +1 -0
  29. package/dist/packlets/collections/keyValueConverters.js.map +1 -0
  30. package/dist/packlets/collections/readOnlyConvertingResultMap.js.map +1 -0
  31. package/dist/packlets/collections/readonlyResultMap.js.map +1 -0
  32. package/dist/packlets/collections/resultMap.js.map +1 -0
  33. package/dist/packlets/collections/resultMapValidator.js.map +1 -0
  34. package/dist/packlets/collections/utils.js.map +1 -0
  35. package/dist/packlets/collections/validatingCollector.js.map +1 -0
  36. package/dist/packlets/collections/validatingConvertingCollector.js.map +1 -0
  37. package/dist/packlets/collections/validatingConvertingResultMap.js.map +1 -0
  38. package/dist/packlets/collections/validatingResultMap.js.map +1 -0
  39. package/dist/packlets/conversion/advancedConverters.js.map +1 -0
  40. package/dist/packlets/conversion/baseConverter.js +102 -16
  41. package/dist/packlets/conversion/baseConverter.js.map +1 -0
  42. package/dist/packlets/conversion/basicConverters.js.map +1 -0
  43. package/dist/packlets/conversion/converter.js.map +1 -0
  44. package/dist/packlets/conversion/converters.js.map +1 -0
  45. package/dist/packlets/conversion/defaultingConverter.js.map +1 -0
  46. package/dist/packlets/conversion/index.js.map +1 -0
  47. package/dist/packlets/conversion/objectConverter.js.map +1 -0
  48. package/dist/packlets/conversion/stringConverter.js.map +1 -0
  49. package/dist/packlets/hash/crcNormalizer.js.map +1 -0
  50. package/dist/packlets/hash/hashingNormalizer.js.map +1 -0
  51. package/dist/packlets/hash/index.js.map +1 -0
  52. package/dist/packlets/logging/bootLogger.js.map +1 -0
  53. package/dist/packlets/logging/index.js +2 -0
  54. package/dist/packlets/logging/index.js.map +1 -0
  55. package/dist/packlets/logging/logReporter.js.map +1 -0
  56. package/dist/packlets/logging/logger.js +49 -8
  57. package/dist/packlets/logging/logger.js.map +1 -0
  58. package/dist/packlets/logging/multiLogger.js +104 -0
  59. package/dist/packlets/logging/multiLogger.js.map +1 -0
  60. package/dist/packlets/logging/retainingLogger.js +161 -0
  61. package/dist/packlets/logging/retainingLogger.js.map +1 -0
  62. package/dist/packlets/validation/array.js.map +1 -0
  63. package/dist/packlets/validation/boolean.js.map +1 -0
  64. package/dist/packlets/validation/classes.js.map +1 -0
  65. package/dist/packlets/validation/common.js.map +1 -0
  66. package/dist/packlets/validation/compositeId.js.map +1 -0
  67. package/dist/packlets/validation/field.js.map +1 -0
  68. package/dist/packlets/validation/genericValidator.js.map +1 -0
  69. package/dist/packlets/validation/index.js.map +1 -0
  70. package/dist/packlets/validation/number.js.map +1 -0
  71. package/dist/packlets/validation/object.js.map +1 -0
  72. package/dist/packlets/validation/oneOf.js.map +1 -0
  73. package/dist/packlets/validation/string.js.map +1 -0
  74. package/dist/packlets/validation/traits.js.map +1 -0
  75. package/dist/packlets/validation/typeGuard.js.map +1 -0
  76. package/dist/packlets/validation/validator.js.map +1 -0
  77. package/dist/packlets/validation/validatorBase.js.map +1 -0
  78. package/dist/packlets/validation/validators.js.map +1 -0
  79. package/dist/ts-utils.d.ts +861 -57
  80. package/dist/tsdoc-metadata.json +1 -1
  81. package/lib/index.d.ts.map +1 -0
  82. package/lib/index.js.map +1 -0
  83. package/lib/packlets/base/brand.d.ts.map +1 -0
  84. package/lib/packlets/base/brand.js.map +1 -0
  85. package/lib/packlets/base/index.d.ts +2 -0
  86. package/lib/packlets/base/index.d.ts.map +1 -0
  87. package/lib/packlets/base/index.js +2 -0
  88. package/lib/packlets/base/index.js.map +1 -0
  89. package/lib/packlets/base/mapResults.d.ts.map +1 -0
  90. package/lib/packlets/base/mapResults.js.map +1 -0
  91. package/lib/packlets/base/messageAggregator.d.ts.map +1 -0
  92. package/lib/packlets/base/messageAggregator.js.map +1 -0
  93. package/lib/packlets/base/normalize.d.ts +24 -0
  94. package/lib/packlets/base/normalize.d.ts.map +1 -0
  95. package/lib/packlets/base/normalize.js +53 -0
  96. package/lib/packlets/base/normalize.js.map +1 -0
  97. package/lib/packlets/base/result.d.ts +263 -1
  98. package/lib/packlets/base/result.d.ts.map +1 -0
  99. package/lib/packlets/base/result.js +303 -3
  100. package/lib/packlets/base/result.js.map +1 -0
  101. package/lib/packlets/base/shouldNotFail.d.ts +53 -0
  102. package/lib/packlets/base/shouldNotFail.d.ts.map +1 -0
  103. package/lib/packlets/base/shouldNotFail.js +129 -0
  104. package/lib/packlets/base/shouldNotFail.js.map +1 -0
  105. package/lib/packlets/base/utils.d.ts +12 -0
  106. package/lib/packlets/base/utils.d.ts.map +1 -0
  107. package/lib/packlets/base/utils.js.map +1 -0
  108. package/lib/packlets/base/uuid.d.ts +27 -0
  109. package/lib/packlets/base/uuid.d.ts.map +1 -0
  110. package/lib/packlets/base/uuid.js +59 -0
  111. package/lib/packlets/base/uuid.js.map +1 -0
  112. package/lib/packlets/collections/aggregatedResultMap.d.ts.map +1 -0
  113. package/lib/packlets/collections/aggregatedResultMap.js.map +1 -0
  114. package/lib/packlets/collections/collectible.d.ts.map +1 -0
  115. package/lib/packlets/collections/collectible.js.map +1 -0
  116. package/lib/packlets/collections/collector.d.ts +23 -9
  117. package/lib/packlets/collections/collector.d.ts.map +1 -0
  118. package/lib/packlets/collections/collector.js +23 -9
  119. package/lib/packlets/collections/collector.js.map +1 -0
  120. package/lib/packlets/collections/collectorValidator.d.ts +29 -5
  121. package/lib/packlets/collections/collectorValidator.d.ts.map +1 -0
  122. package/lib/packlets/collections/collectorValidator.js +6 -1
  123. package/lib/packlets/collections/collectorValidator.js.map +1 -0
  124. package/lib/packlets/collections/common.d.ts.map +1 -0
  125. package/lib/packlets/collections/common.js.map +1 -0
  126. package/lib/packlets/collections/converters.d.ts.map +1 -0
  127. package/lib/packlets/collections/converters.js.map +1 -0
  128. package/lib/packlets/collections/convertingCollector.d.ts +21 -3
  129. package/lib/packlets/collections/convertingCollector.d.ts.map +1 -0
  130. package/lib/packlets/collections/convertingCollector.js.map +1 -0
  131. package/lib/packlets/collections/convertingCollectorValidator.d.ts +22 -3
  132. package/lib/packlets/collections/convertingCollectorValidator.d.ts.map +1 -0
  133. package/lib/packlets/collections/convertingCollectorValidator.js.map +1 -0
  134. package/lib/packlets/collections/convertingResultMap.d.ts.map +1 -0
  135. package/lib/packlets/collections/convertingResultMap.js.map +1 -0
  136. package/lib/packlets/collections/index.d.ts.map +1 -0
  137. package/lib/packlets/collections/index.js.map +1 -0
  138. package/lib/packlets/collections/keyValueConverters.d.ts.map +1 -0
  139. package/lib/packlets/collections/keyValueConverters.js.map +1 -0
  140. package/lib/packlets/collections/readOnlyConvertingResultMap.d.ts.map +1 -0
  141. package/lib/packlets/collections/readOnlyConvertingResultMap.js.map +1 -0
  142. package/lib/packlets/collections/readonlyResultMap.d.ts +18 -7
  143. package/lib/packlets/collections/readonlyResultMap.d.ts.map +1 -0
  144. package/lib/packlets/collections/readonlyResultMap.js.map +1 -0
  145. package/lib/packlets/collections/resultMap.d.ts.map +1 -0
  146. package/lib/packlets/collections/resultMap.js.map +1 -0
  147. package/lib/packlets/collections/resultMapValidator.d.ts.map +1 -0
  148. package/lib/packlets/collections/resultMapValidator.js.map +1 -0
  149. package/lib/packlets/collections/utils.d.ts.map +1 -0
  150. package/lib/packlets/collections/utils.js.map +1 -0
  151. package/lib/packlets/collections/validatingCollector.d.ts +7 -3
  152. package/lib/packlets/collections/validatingCollector.d.ts.map +1 -0
  153. package/lib/packlets/collections/validatingCollector.js.map +1 -0
  154. package/lib/packlets/collections/validatingConvertingCollector.d.ts.map +1 -0
  155. package/lib/packlets/collections/validatingConvertingCollector.js.map +1 -0
  156. package/lib/packlets/collections/validatingConvertingResultMap.d.ts.map +1 -0
  157. package/lib/packlets/collections/validatingConvertingResultMap.js.map +1 -0
  158. package/lib/packlets/collections/validatingResultMap.d.ts +2 -1
  159. package/lib/packlets/collections/validatingResultMap.d.ts.map +1 -0
  160. package/lib/packlets/collections/validatingResultMap.js.map +1 -0
  161. package/lib/packlets/conversion/advancedConverters.d.ts.map +1 -0
  162. package/lib/packlets/conversion/advancedConverters.js.map +1 -0
  163. package/lib/packlets/conversion/baseConverter.d.ts +102 -16
  164. package/lib/packlets/conversion/baseConverter.d.ts.map +1 -0
  165. package/lib/packlets/conversion/baseConverter.js +102 -16
  166. package/lib/packlets/conversion/baseConverter.js.map +1 -0
  167. package/lib/packlets/conversion/basicConverters.d.ts.map +1 -0
  168. package/lib/packlets/conversion/basicConverters.js.map +1 -0
  169. package/lib/packlets/conversion/converter.d.ts.map +1 -0
  170. package/lib/packlets/conversion/converter.js.map +1 -0
  171. package/lib/packlets/conversion/converters.d.ts.map +1 -0
  172. package/lib/packlets/conversion/converters.js.map +1 -0
  173. package/lib/packlets/conversion/defaultingConverter.d.ts.map +1 -0
  174. package/lib/packlets/conversion/defaultingConverter.js.map +1 -0
  175. package/lib/packlets/conversion/index.d.ts.map +1 -0
  176. package/lib/packlets/conversion/index.js.map +1 -0
  177. package/lib/packlets/conversion/objectConverter.d.ts.map +1 -0
  178. package/lib/packlets/conversion/objectConverter.js.map +1 -0
  179. package/lib/packlets/conversion/stringConverter.d.ts.map +1 -0
  180. package/lib/packlets/conversion/stringConverter.js.map +1 -0
  181. package/lib/packlets/hash/crcNormalizer.d.ts.map +1 -0
  182. package/lib/packlets/hash/crcNormalizer.js.map +1 -0
  183. package/lib/packlets/hash/hashingNormalizer.d.ts.map +1 -0
  184. package/lib/packlets/hash/hashingNormalizer.js.map +1 -0
  185. package/lib/packlets/hash/index.d.ts.map +1 -0
  186. package/lib/packlets/hash/index.js.map +1 -0
  187. package/lib/packlets/logging/bootLogger.d.ts.map +1 -0
  188. package/lib/packlets/logging/bootLogger.js.map +1 -0
  189. package/lib/packlets/logging/index.d.ts +2 -0
  190. package/lib/packlets/logging/index.d.ts.map +1 -0
  191. package/lib/packlets/logging/index.js +2 -0
  192. package/lib/packlets/logging/index.js.map +1 -0
  193. package/lib/packlets/logging/logReporter.d.ts.map +1 -0
  194. package/lib/packlets/logging/logReporter.js.map +1 -0
  195. package/lib/packlets/logging/logger.d.ts +46 -8
  196. package/lib/packlets/logging/logger.d.ts.map +1 -0
  197. package/lib/packlets/logging/logger.js +49 -8
  198. package/lib/packlets/logging/logger.js.map +1 -0
  199. package/lib/packlets/logging/multiLogger.d.ts +54 -0
  200. package/lib/packlets/logging/multiLogger.d.ts.map +1 -0
  201. package/lib/packlets/logging/multiLogger.js +108 -0
  202. package/lib/packlets/logging/multiLogger.js.map +1 -0
  203. package/lib/packlets/logging/retainingLogger.d.ts +143 -0
  204. package/lib/packlets/logging/retainingLogger.d.ts.map +1 -0
  205. package/lib/packlets/logging/retainingLogger.js +165 -0
  206. package/lib/packlets/logging/retainingLogger.js.map +1 -0
  207. package/lib/packlets/validation/array.d.ts.map +1 -0
  208. package/lib/packlets/validation/array.js.map +1 -0
  209. package/lib/packlets/validation/boolean.d.ts.map +1 -0
  210. package/lib/packlets/validation/boolean.js.map +1 -0
  211. package/lib/packlets/validation/classes.d.ts.map +1 -0
  212. package/lib/packlets/validation/classes.js.map +1 -0
  213. package/lib/packlets/validation/common.d.ts.map +1 -0
  214. package/lib/packlets/validation/common.js.map +1 -0
  215. package/lib/packlets/validation/compositeId.d.ts.map +1 -0
  216. package/lib/packlets/validation/compositeId.js.map +1 -0
  217. package/lib/packlets/validation/field.d.ts.map +1 -0
  218. package/lib/packlets/validation/field.js.map +1 -0
  219. package/lib/packlets/validation/genericValidator.d.ts.map +1 -0
  220. package/lib/packlets/validation/genericValidator.js.map +1 -0
  221. package/lib/packlets/validation/index.d.ts.map +1 -0
  222. package/lib/packlets/validation/index.js.map +1 -0
  223. package/lib/packlets/validation/number.d.ts.map +1 -0
  224. package/lib/packlets/validation/number.js.map +1 -0
  225. package/lib/packlets/validation/object.d.ts.map +1 -0
  226. package/lib/packlets/validation/object.js.map +1 -0
  227. package/lib/packlets/validation/oneOf.d.ts.map +1 -0
  228. package/lib/packlets/validation/oneOf.js.map +1 -0
  229. package/lib/packlets/validation/string.d.ts.map +1 -0
  230. package/lib/packlets/validation/string.js.map +1 -0
  231. package/lib/packlets/validation/traits.d.ts.map +1 -0
  232. package/lib/packlets/validation/traits.js.map +1 -0
  233. package/lib/packlets/validation/typeGuard.d.ts.map +1 -0
  234. package/lib/packlets/validation/typeGuard.js.map +1 -0
  235. package/lib/packlets/validation/validator.d.ts.map +1 -0
  236. package/lib/packlets/validation/validator.js.map +1 -0
  237. package/lib/packlets/validation/validatorBase.d.ts +2 -1
  238. package/lib/packlets/validation/validatorBase.d.ts.map +1 -0
  239. package/lib/packlets/validation/validatorBase.js.map +1 -0
  240. package/lib/packlets/validation/validators.d.ts.map +1 -0
  241. package/lib/packlets/validation/validators.js.map +1 -0
  242. package/package.json +6 -4
  243. package/dist/test/helpers/jest/helpers/fsHelpers.js +0 -139
  244. package/dist/test/helpers/jest/helpers/index.js +0 -2
  245. package/dist/test/helpers/jest/index.js +0 -17
  246. package/dist/test/helpers/jest/matchers/index.js +0 -14
  247. package/dist/test/helpers/jest/matchers/toFail/index.js +0 -23
  248. package/dist/test/helpers/jest/matchers/toFail/predicate.js +0 -5
  249. package/dist/test/helpers/jest/matchers/toFailTest/index.js +0 -28
  250. package/dist/test/helpers/jest/matchers/toFailTest/predicate.js +0 -8
  251. package/dist/test/helpers/jest/matchers/toFailTestAndMatchSnapshot/index.js +0 -24
  252. package/dist/test/helpers/jest/matchers/toFailTestAndMatchSnapshot/predicate.js +0 -11
  253. package/dist/test/helpers/jest/matchers/toFailTestWith/index.js +0 -29
  254. package/dist/test/helpers/jest/matchers/toFailTestWith/predicate.js +0 -26
  255. package/dist/test/helpers/jest/matchers/toFailWith/index.js +0 -27
  256. package/dist/test/helpers/jest/matchers/toFailWith/predicate.js +0 -16
  257. package/dist/test/helpers/jest/matchers/toFailWithDetail/index.js +0 -27
  258. package/dist/test/helpers/jest/matchers/toFailWithDetail/predicate.js +0 -22
  259. package/dist/test/helpers/jest/matchers/toSucceed/index.js +0 -23
  260. package/dist/test/helpers/jest/matchers/toSucceed/predicate.js +0 -5
  261. package/dist/test/helpers/jest/matchers/toSucceedAndMatchInlineSnapshot/index.js +0 -24
  262. package/dist/test/helpers/jest/matchers/toSucceedAndMatchSnapshot/index.js +0 -24
  263. package/dist/test/helpers/jest/matchers/toSucceedAndSatisfy/index.js +0 -53
  264. package/dist/test/helpers/jest/matchers/toSucceedAndSatisfy/predicate.js +0 -17
  265. package/dist/test/helpers/jest/matchers/toSucceedWith/index.js +0 -27
  266. package/dist/test/helpers/jest/matchers/toSucceedWith/predicate.js +0 -12
  267. package/dist/test/helpers/jest/matchers/toSucceedWithDetail/index.js +0 -27
  268. package/dist/test/helpers/jest/matchers/toSucceedWithDetail/predicate.js +0 -17
  269. package/dist/test/helpers/jest/resolvers/cli.js +0 -10
  270. package/dist/test/helpers/jest/resolvers/ide.js +0 -10
  271. package/dist/test/helpers/jest/ts-utils.js +0 -2
  272. package/dist/test/helpers/jest/types/index.js +0 -3
  273. package/dist/test/helpers/jest/utils/matcherHelpers.js +0 -47
  274. package/dist/test/helpers/jest/utils/snapshotResolver.js +0 -11
  275. package/dist/test/unit/collections/helpers.js +0 -106
  276. package/dist/test/unit/hashTextEncodeCompat.js +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crcNormalizer.d.ts","sourceRoot":"","sources":["../../../src/packlets/hash/crcNormalizer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAgFxD;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;;WAKtC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;CAKjD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crcNormalizer.js","sourceRoot":"","sources":["../../../src/packlets/hash/crcNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2023 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { HashingNormalizer } from './hashingNormalizer';\n\nfunction encodeUtf8(input: string): Uint8Array {\n // Prefer built-in TextEncoder when available (browsers and modern Node)\n // @ts-ignore - global TextEncoder may be unavailable in some environments\n const GlobalTextEncoder = typeof TextEncoder !== 'undefined' ? TextEncoder : undefined;\n if (GlobalTextEncoder) {\n return new GlobalTextEncoder().encode(input);\n }\n // Very small manual UTF-8 encoder as a last resort\n /* eslint-disable no-bitwise */\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let codePoint = input.charCodeAt(i);\n if (codePoint >= 0xd800 && codePoint <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n codePoint = ((codePoint - 0xd800) << 10) + (next - 0xdc00) + 0x10000;\n i++;\n }\n }\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >> 6));\n bytes.push(0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(0xe0 | (codePoint >> 12));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3f));\n bytes.push(0x80 | (codePoint & 0x3f));\n } else {\n bytes.push(0xf0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3f));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3f));\n bytes.push(0x80 | (codePoint & 0x3f));\n }\n }\n /* eslint-enable no-bitwise */\n return new Uint8Array(bytes);\n}\n\nconst POLYNOMIAL: number = 0xedb88320;\n\nconst crc32Table: number[] = [];\n\nfunction crc32(bytes: Uint8Array, crc: number = 0xffffffff): number {\n if (crc32Table.length === 0) {\n buildCrc32Table();\n }\n for (let i = 0; i < bytes.length; ++i) {\n // eslint-disable-next-line no-bitwise\n crc = crc32Table[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ -1) >>> 0;\n}\n\nconst toUInt32 = (n: number): number => {\n if (n >= 0) {\n return n;\n }\n return 0xffffffff - n * -1 + 1;\n};\n\nfunction buildCrc32Table(): void {\n if (crc32Table.length === 0) {\n for (let n = 0; n < 256; n++) {\n let r = n;\n for (let i = 0; i < 8; i++) {\n // eslint-disable-next-line no-bitwise\n if (r & 1) {\n r = (r >>> 1) ^ POLYNOMIAL;\n } else {\n r = r >>> 1;\n }\n }\n crc32Table.push(toUInt32(r));\n }\n }\n}\n\n/**\n * A {@link Hash.HashingNormalizer | hashing normalizer} which computes object\n * hash using the CRC32 algorithm.\n * @public\n */\nexport class Crc32Normalizer extends HashingNormalizer {\n public constructor() {\n super(Crc32Normalizer.crc32Hash);\n }\n\n public static crc32Hash(parts: string[]): string {\n return crc32(encodeUtf8(parts.join('|')))\n .toString(16)\n .padStart(8, '0');\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashingNormalizer.d.ts","sourceRoot":"","sources":["../../../src/packlets/hash/hashingNormalizer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,MAAM,EAA4C,MAAM,SAAS,CAAC;AAEvF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAEvD;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAO,CAAC,KAAK,CAAe;gBAET,IAAI,EAAE,YAAY;IAK9B,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IA6BjD;;;;;OAKG;IACH,SAAS,CAAC,yBAAyB,CACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GACnF,MAAM,CAAC,MAAM,CAAC;CAuBlB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashingNormalizer.js","sourceRoot":"","sources":["../../../src/packlets/hash/hashingNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2021 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Normalizer, Result, captureResult, fail, mapResults, succeed } from '../base';\n\n/**\n * Function to compute a hash from a pre-normalized array of strings.\n * @public\n */\nexport type HashFunction = (parts: string[]) => string;\n\n/**\n * Normalizes an arbitrary JSON object\n * @public\n */\nexport class HashingNormalizer extends Normalizer {\n private _hash: HashFunction;\n\n public constructor(hash: HashFunction) {\n super();\n this._hash = hash;\n }\n\n public computeHash(from: unknown): Result<string> {\n switch (typeof from) {\n case 'string':\n case 'bigint':\n case 'boolean':\n case 'number':\n case 'symbol':\n case 'undefined':\n return this._normalizeLiteralToString(from).onSuccess((v) => {\n return captureResult(() => this._hash([v]));\n });\n case 'object':\n if (from === null || from instanceof Date || from instanceof RegExp) {\n return this._normalizeLiteralToString(from).onSuccess((v) => {\n return captureResult(() => this._hash([v]));\n });\n } else if (Array.isArray(from)) {\n return mapResults(from.map((e) => this.computeHash(e))).onSuccess((a) => {\n return captureResult(() => this._hash(['array', ...a]));\n });\n } else if (from instanceof Map || from instanceof Set) {\n const type = from instanceof Map ? 'map' : 'set';\n return this.computeHash([type, ...this.normalizeEntries(from.entries())]);\n }\n return this.computeHash(['object', ...this.normalizeEntries(Object.entries(from))]);\n }\n return fail(`computeHash: Unexpected type - cannot hash '${typeof from}'`);\n }\n\n /**\n * Constructs a normalized string representation of some literal value.\n * @param from - The literal value to be normalized.\n * @returns A normalized string representation of the literal.\n * @internal\n */\n protected _normalizeLiteralToString(\n from: string | number | bigint | boolean | symbol | undefined | Date | RegExp | null\n ): Result<string> {\n switch (typeof from) {\n case 'string':\n return succeed(from);\n case 'bigint':\n case 'boolean':\n case 'number':\n case 'symbol':\n case 'undefined':\n return succeed(`${typeof from}:[[[${String(from)}]]]`);\n }\n if (from === null) {\n return succeed('object:[[[null]]');\n }\n if (from instanceof Date) {\n return succeed(`Date:[[[${String(from.valueOf())}]]]`);\n }\n if (from instanceof RegExp) {\n return succeed(`RegExp:[[[${from.toString()}]]]`);\n }\n /* c8 ignore next 2 */\n return fail(`cannot normalize ${JSON.stringify(from)}`);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/hash/index.ts"],"names":[],"mappings":"AAsBA,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/hash/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;AAEH,kDAAgC;AAChC,sDAAoC","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nexport * from './crcNormalizer';\nexport * from './hashingNormalizer';\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootLogger.d.ts","sourceRoot":"","sources":["../../../src/packlets/logging/bootLogger.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAkC,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAYpG;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAElC;;;;OAIG;gBACgB,QAAQ,CAAC,EAAE,gBAAgB;IAI9C;;OAEG;IACH,IAAW,QAAQ,IAAI,gBAAgB,CAEtC;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAYnC;;OAEG;IACI,GAAG,CACR,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,OAAO,EACjB,GAAG,UAAU,EAAE,OAAO,EAAE,GACvB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAO9B;;OAEG;IACI,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIvF;;OAEG;IACI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIrF;;OAEG;IACI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIrF;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAItF;;OAEG;IACI,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQrF;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAOrF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootLogger.js","sourceRoot":"","sources":["../../../src/packlets/logging/bootLogger.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { MessageLogLevel, Success } from '../base';\nimport { IDetailLogger, ILogger, InMemoryLogger, isDetailLogger, ReporterLogLevel } from './logger';\n\n/**\n * A recorded log entry capturing the raw arguments before formatting.\n * @internal\n */\ninterface IBootLogEntry {\n readonly level: MessageLogLevel;\n readonly message: unknown;\n readonly parameters: unknown[];\n}\n\n/**\n * A logger that buffers log entries during startup, then replays them\n * to a real logger once it becomes available.\n *\n * @remarks\n * During application bootstrap, the real logger (e.g. one backed by\n * toast notifications) may not be available yet. `BootLogger` solves\n * this by:\n * 1. Buffering all log calls in memory during the boot phase.\n * 2. When {@link BootLogger.ready | ready()} is called with the real\n * logger, replaying all buffered entries and then forwarding all\n * subsequent calls directly.\n *\n * @example\n * ```typescript\n * // Create early, before the real logger exists\n * const bootLogger = new BootLogger('detail');\n * bootLogger.info('Starting up...');\n *\n * // Later, when the real logger is available\n * bootLogger.ready(realLogger);\n * // 'Starting up...' is replayed to realLogger\n * // All future calls go directly to realLogger\n * ```\n *\n * @public\n */\nexport class BootLogger implements IDetailLogger {\n private _buffer: IBootLogEntry[] = [];\n private _delegate: ILogger;\n private _isReady: boolean = false;\n\n /**\n * Creates a new boot logger.\n * @param logLevel - The log level for the initial in-memory buffer phase.\n * Defaults to 'detail' to capture everything during boot.\n */\n public constructor(logLevel?: ReporterLogLevel) {\n this._delegate = new InMemoryLogger(logLevel ?? 'detail');\n }\n\n /**\n * {@inheritDoc Logging.ILogger.logLevel}\n */\n public get logLevel(): ReporterLogLevel {\n return this._delegate.logLevel;\n }\n\n /**\n * Whether the boot logger has been connected to a real logger.\n */\n public get isReady(): boolean {\n return this._isReady;\n }\n\n /**\n * Connects this boot logger to a real logger.\n * All buffered entries are replayed to the new logger in order,\n * and all subsequent calls are forwarded directly.\n * @param logger - The real logger to forward to.\n */\n public ready(logger: ILogger): void {\n // Replay buffered entries\n for (const entry of this._buffer) {\n logger.log(entry.level, entry.message, ...entry.parameters);\n }\n\n // Switch to the real logger and discard the buffer\n this._delegate = logger;\n this._buffer = [];\n this._isReady = true;\n }\n\n /**\n * {@inheritDoc Logging.ILogger.log}\n */\n public log(\n level: MessageLogLevel,\n message?: unknown,\n ...parameters: unknown[]\n ): Success<string | undefined> {\n if (!this._isReady) {\n this._buffer.push({ level, message, parameters });\n }\n return this._delegate.log(level, message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.detail}\n */\n public detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('detail', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.info}\n */\n public info(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('info', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.warn}\n */\n public warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('warning', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.error}\n */\n public error(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('error', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.IDetailLogger.errorWithDetail}\n */\n public errorWithDetail(message: string, detail: unknown): Success<string | undefined> {\n if (isDetailLogger(this._delegate)) {\n return this._delegate.errorWithDetail(message, detail);\n }\n this.log('detail', detail);\n return this.log('error', message);\n }\n\n /**\n * {@inheritDoc Logging.IDetailLogger.warnWithDetail}\n */\n public warnWithDetail(message: string, detail: unknown): Success<string | undefined> {\n if (isDetailLogger(this._delegate)) {\n return this._delegate.warnWithDetail(message, detail);\n }\n this.log('detail', detail);\n return this.log('warning', message);\n }\n}\n"]}
@@ -1,4 +1,6 @@
1
1
  export * from './bootLogger';
2
2
  export * from './logger';
3
3
  export * from './logReporter';
4
+ export * from './multiLogger';
5
+ export * from './retainingLogger';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packlets/logging/index.ts"],"names":[],"mappings":"AAsBA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
@@ -38,4 +38,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
38
38
  __exportStar(require("./bootLogger"), exports);
39
39
  __exportStar(require("./logger"), exports);
40
40
  __exportStar(require("./logReporter"), exports);
41
+ __exportStar(require("./multiLogger"), exports);
42
+ __exportStar(require("./retainingLogger"), exports);
41
43
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/logging/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,2CAAyB;AACzB,gDAA8B;AAC9B,gDAA8B;AAC9B,oDAAkC","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nexport * from './bootLogger';\nexport * from './logger';\nexport * from './logReporter';\nexport * from './multiLogger';\nexport * from './retainingLogger';\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logReporter.d.ts","sourceRoot":"","sources":["../../../src/packlets/logging/logReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logReporter.js","sourceRoot":"","sources":["../../../src/packlets/logging/logReporter.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qCAOkB;AAClB,kCAA2G;AAwB3G;;;;GAIG;AACH,MAAa,WAAW;IAmBtB;;;OAGG;IACH,YAAmB,MAAwC;;QACzD,sBAAsB;QACtB,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAA,MAAM,CAAC,MAAM,mCAAI,IAAI,mBAAU,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,WAAW,CAAC,eAAe,CAAC;QAC5E,IAAI,CAAC,iBAAiB,GAAG,MAAA,MAAM,CAAC,gBAAgB,mCAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvF,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,MAAgB;QAC1C,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,mBAAU,EAAE,CAAC;QACpC,OAAO,IAAA,oBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACtD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,OAAe,EAAE,MAAe;QACrD,IAAI,IAAA,uBAAc,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,OAAe,EAAE,MAAe;QACpD,IAAI,IAAA,uBAAc,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,GAAG,CACR,KAAsB,EACtB,OAAiB,EACjB,GAAG,UAAqB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,KAAsB,EAAE,KAAQ,EAAE,MAAW,EAAE,OAA4B;QAC9F,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,KAAsB,EAAE,OAAe,EAAE,MAAW;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAK,cAAyC;QACrE,OAAO,IAAI,WAAW,CAAS;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc;YACd,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;SACzC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,eAAe,CAA4B,KAAQ,EAAE,MAAW;QAC5E,OAAO,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AArJD,kCAqJC","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport {\n IDetailLogger,\n ILogger,\n isDetailLogger,\n ReporterLogLevel,\n NoOpLogger,\n stringifyLogValue\n} from './logger';\nimport { captureResult, ErrorFormatter, IResultReporter, MessageLogLevel, Result, Success } from '../base';\n\n/**\n * A function that formats a value for logging.\n * @public\n */\nexport type LogValueFormatter<T, TD = unknown> = (value: T, detail?: TD) => string;\n\n/**\n * A function that formats a message for logging.\n * @public\n */\nexport type LogMessageFormatter<TD = unknown> = (message: string, detail?: TD) => string;\n\n/**\n * Parameters for creating a {@link Logging.LogReporter | LogReporter}.\n * @public\n */\nexport interface ILogReporterCreateParams<T, TD = unknown> {\n logger?: ILogger;\n valueFormatter?: LogValueFormatter<T, TD>;\n messageFormatter?: LogMessageFormatter<TD>;\n}\n\n/**\n * Abstract base class which wraps an existing {@link Logging.ILogger | ILogger} to implement\n * both {@link Logging.ILogger | ILogger} and {@link IResultReporter | IResultReporter}.\n * @public\n */\nexport class LogReporter<T, TD = unknown> implements IDetailLogger, IResultReporter<T, TD> {\n /**\n * Base logger used to by this reporter.\n * @public\n */\n public readonly logger: ILogger;\n\n /**\n * The formatter to use for values.\n * @internal\n */\n protected readonly _valueFormatter: LogValueFormatter<T, TD>;\n\n /**\n * The formatter to use for messages.\n * @internal\n */\n protected readonly _messageFormatter: LogMessageFormatter<TD>;\n\n /**\n * Creates a new {@link Logging.LogReporter | LogReporter}.\n * @param params - The parameters for creating the {@link Logging.LogReporter | LogReporter}.\n */\n public constructor(params?: ILogReporterCreateParams<T, TD>) {\n /* c8 ignore next 1 */\n params = params ?? {};\n this.logger = params.logger ?? new NoOpLogger();\n this._valueFormatter = params.valueFormatter ?? LogReporter.tryFormatObject;\n this._messageFormatter = params.messageFormatter ?? ((message, __detail) => message);\n }\n\n /**\n * Creates a default {@link Logging.LogReporter | LogReporter} with a {@link Logging.NoOpLogger | NoOpLogger} with the\n * supplied parameters, returning both the logger and reporter.\n * @param logger - Optional logger to use; defaults to a new {@link Logging.NoOpLogger | NoOpLogger} if not provided.\n * @returns\n */\n public static createDefault(logger?: ILogger): Result<LogReporter<unknown>> {\n logger = logger ?? new NoOpLogger();\n return captureResult(() => new LogReporter<unknown>({ logger }));\n }\n\n /**\n * {@inheritDoc Logging.ILogger.logLevel}\n */\n public get logLevel(): ReporterLogLevel {\n return this.logger.logLevel;\n }\n\n /**\n * {@inheritDoc Logging.ILogger.detail}\n */\n public detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.logger.detail(message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.info}\n */\n public info(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.logger.info(message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.warn}\n */\n public warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.logger.warn(message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.error}\n */\n public error(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.logger.error(message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.IDetailLogger.errorWithDetail}\n */\n public errorWithDetail(message: string, detail: unknown): Success<string | undefined> {\n if (isDetailLogger(this.logger)) {\n return this.logger.errorWithDetail(message, detail);\n }\n this.logger.detail(detail);\n return this.logger.error(message);\n }\n\n /**\n * {@inheritDoc Logging.IDetailLogger.warnWithDetail}\n */\n public warnWithDetail(message: string, detail: unknown): Success<string | undefined> {\n if (isDetailLogger(this.logger)) {\n return this.logger.warnWithDetail(message, detail);\n }\n this.logger.detail(detail);\n return this.logger.warn(message);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.log}\n */\n public log(\n level: MessageLogLevel,\n message?: unknown,\n ...parameters: unknown[]\n ): Success<string | undefined> {\n return this.logger.log(level, message, ...parameters);\n }\n\n /**\n * {@inheritDoc IResultReporter.reportSuccess}\n */\n public reportSuccess(level: MessageLogLevel, value: T, detail?: TD, message?: ErrorFormatter<TD>): void {\n const formattedValue = this._valueFormatter(value, detail);\n const formatted = message ? message(formattedValue, detail) : formattedValue;\n this.log(level, formatted);\n }\n\n /**\n * {@inheritDoc IResultReporter.reportFailure}\n */\n public reportFailure(level: MessageLogLevel, message: string, detail?: TD): void {\n const formatted = this._messageFormatter(message, detail);\n this.log(level, formatted);\n }\n\n /**\n * Creates a new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.\n * @param valueFormatter - The value formatter to use.\n * @returns A new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.\n */\n public withValueFormatter<TN>(valueFormatter: LogValueFormatter<TN, TD>): LogReporter<TN, TD> {\n return new LogReporter<TN, TD>({\n logger: this.logger,\n valueFormatter,\n messageFormatter: this._messageFormatter\n });\n }\n\n /**\n * Generic method to try to format an object for logging.\n * @param value - The value to format.\n * @param detail - The detail to format.\n * @returns\n */\n public static tryFormatObject<T = unknown, TD = unknown>(value: T, detail?: TD): string {\n return stringifyLogValue(value);\n }\n}\n"]}
@@ -106,36 +106,61 @@ export declare function isDetailLogger(logger: ILogger): logger is IDetailLogger
106
106
  */
107
107
  export declare abstract class LoggerBase implements IDetailLogger {
108
108
  /**
109
- * {@inheritDoc Logging.ILogger.logLevel}
109
+ * The level of logging to be used.
110
110
  */
111
111
  logLevel: ReporterLogLevel;
112
112
  protected constructor(logLevel?: ReporterLogLevel);
113
113
  /**
114
- * {@inheritDoc Logging.ILogger.detail}
114
+ * Logs a detail message.
115
+ * @param message - The message to log.
116
+ * @param parameters - The parameters to log.
117
+ * @returns `Success` with the logged message if the level is enabled, or
118
+ * `Success` with `undefined` if the message is suppressed.
115
119
  */
116
120
  detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
117
121
  /**
118
- * {@inheritDoc Logging.ILogger.info}
122
+ * Logs an info message.
123
+ * @param message - The message to log.
124
+ * @param parameters - The parameters to log.
125
+ * @returns `Success` with the logged message if the level is enabled, or
126
+ * `Success` with `undefined` if the message is suppressed.
119
127
  */
120
128
  info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
121
129
  /**
122
- * {@inheritDoc Logging.ILogger.warn}
130
+ * Logs a warning message.
131
+ * @param message - The message to log.
132
+ * @param parameters - The parameters to log.
133
+ * @returns `Success` with the logged message if the level is enabled, or
134
+ * `Success` with `undefined` if the message is suppressed.
123
135
  */
124
136
  warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
125
137
  /**
126
- * {@inheritDoc Logging.ILogger.error}
138
+ * Logs an error message.
139
+ * @param message - The message to log.
140
+ * @param parameters - The parameters to log.
141
+ * @returns `Success` with the logged message if the level is enabled, or
142
+ * `Success` with `undefined` if the message is suppressed.
127
143
  */
128
144
  error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
129
145
  /**
130
- * {@inheritDoc Logging.IDetailLogger.errorWithDetail}
146
+ * Logs a short error summary at `error` level, then emits `detail` at `detail` level.
147
+ * @param message - Short human-readable summary.
148
+ * @param detail - Full detail (e.g. raw converter error) logged at `detail` level.
131
149
  */
132
150
  errorWithDetail(message: string, detail: unknown): Success<string | undefined>;
133
151
  /**
134
- * {@inheritDoc Logging.IDetailLogger.warnWithDetail}
152
+ * Logs a short warning summary at `warning` level, then emits `detail` at `detail` level.
153
+ * @param message - Short human-readable summary.
154
+ * @param detail - Full detail logged at `detail` level.
135
155
  */
136
156
  warnWithDetail(message: string, detail: unknown): Success<string | undefined>;
137
157
  /**
138
- * {@inheritDoc Logging.ILogger.log}
158
+ * Logs a message at the given level.
159
+ * @param level - The level of the message.
160
+ * @param message - The message to log.
161
+ * @param parameters - The parameters to log.
162
+ * @returns `Success` with the logged message if the level is enabled, or
163
+ * `Success` with `undefined` if the message is suppressed.
139
164
  */
140
165
  log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
141
166
  /**
@@ -146,6 +171,19 @@ export declare abstract class LoggerBase implements IDetailLogger {
146
171
  * @public
147
172
  */
148
173
  protected _format(message?: unknown, ...parameters: unknown[]): string;
174
+ /**
175
+ * Inner hook called for logged messages alongside {@link Logging.LoggerBase._log | _log},
176
+ * exposing the structured `(level, formatted, message, parameters)` form before it is
177
+ * collapsed to the formatted string. The default implementation is a no-op; subclasses
178
+ * that need to retain structured records (e.g. {@link Logging.RetainingLogger | RetainingLogger})
179
+ * override this. Fired only in the `shouldLog` branch, so suppressed messages never reach it.
180
+ * @param __level - The {@link MessageLogLevel | level} of the message.
181
+ * @param __formatted - The formatted message (same string passed to `_log`).
182
+ * @param __message - The raw message argument before formatting.
183
+ * @param __parameters - The raw parameter arguments before formatting.
184
+ * @public
185
+ */
186
+ protected _logStructured(__level: MessageLogLevel, __formatted: string, __message?: unknown, __parameters?: readonly unknown[]): void;
149
187
  /**
150
188
  * Inner method called for suppressed log messages.
151
189
  * @public
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/packlets/logging/logger.ts"],"names":[],"mappings":"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"}
@@ -92,55 +92,81 @@ function isDetailLogger(logger) {
92
92
  class LoggerBase {
93
93
  constructor(logLevel) {
94
94
  /**
95
- * {@inheritDoc Logging.ILogger.logLevel}
95
+ * The level of logging to be used.
96
96
  */
97
97
  this.logLevel = 'info';
98
98
  this.logLevel = logLevel !== null && logLevel !== void 0 ? logLevel : 'info';
99
99
  }
100
100
  /**
101
- * {@inheritDoc Logging.ILogger.detail}
101
+ * Logs a detail message.
102
+ * @param message - The message to log.
103
+ * @param parameters - The parameters to log.
104
+ * @returns `Success` with the logged message if the level is enabled, or
105
+ * `Success` with `undefined` if the message is suppressed.
102
106
  */
103
107
  detail(message, ...parameters) {
104
108
  return this.log('detail', message, ...parameters);
105
109
  }
106
110
  /**
107
- * {@inheritDoc Logging.ILogger.info}
111
+ * Logs an info message.
112
+ * @param message - The message to log.
113
+ * @param parameters - The parameters to log.
114
+ * @returns `Success` with the logged message if the level is enabled, or
115
+ * `Success` with `undefined` if the message is suppressed.
108
116
  */
109
117
  info(message, ...parameters) {
110
118
  return this.log('info', message, ...parameters);
111
119
  }
112
120
  /**
113
- * {@inheritDoc Logging.ILogger.warn}
121
+ * Logs a warning message.
122
+ * @param message - The message to log.
123
+ * @param parameters - The parameters to log.
124
+ * @returns `Success` with the logged message if the level is enabled, or
125
+ * `Success` with `undefined` if the message is suppressed.
114
126
  */
115
127
  warn(message, ...parameters) {
116
128
  return this.log('warning', message, ...parameters);
117
129
  }
118
130
  /**
119
- * {@inheritDoc Logging.ILogger.error}
131
+ * Logs an error message.
132
+ * @param message - The message to log.
133
+ * @param parameters - The parameters to log.
134
+ * @returns `Success` with the logged message if the level is enabled, or
135
+ * `Success` with `undefined` if the message is suppressed.
120
136
  */
121
137
  error(message, ...parameters) {
122
138
  return this.log('error', message, ...parameters);
123
139
  }
124
140
  /**
125
- * {@inheritDoc Logging.IDetailLogger.errorWithDetail}
141
+ * Logs a short error summary at `error` level, then emits `detail` at `detail` level.
142
+ * @param message - Short human-readable summary.
143
+ * @param detail - Full detail (e.g. raw converter error) logged at `detail` level.
126
144
  */
127
145
  errorWithDetail(message, detail) {
128
146
  this.detail(detail);
129
147
  return this.error(message);
130
148
  }
131
149
  /**
132
- * {@inheritDoc Logging.IDetailLogger.warnWithDetail}
150
+ * Logs a short warning summary at `warning` level, then emits `detail` at `detail` level.
151
+ * @param message - Short human-readable summary.
152
+ * @param detail - Full detail logged at `detail` level.
133
153
  */
134
154
  warnWithDetail(message, detail) {
135
155
  this.detail(detail);
136
156
  return this.warn(message);
137
157
  }
138
158
  /**
139
- * {@inheritDoc Logging.ILogger.log}
159
+ * Logs a message at the given level.
160
+ * @param level - The level of the message.
161
+ * @param message - The message to log.
162
+ * @param parameters - The parameters to log.
163
+ * @returns `Success` with the logged message if the level is enabled, or
164
+ * `Success` with `undefined` if the message is suppressed.
140
165
  */
141
166
  log(level, message, ...parameters) {
142
167
  if (shouldLog(level, this.logLevel)) {
143
168
  const formatted = this._format(message, ...parameters);
169
+ this._logStructured(level, formatted, message, parameters);
144
170
  return this._log(formatted, level);
145
171
  }
146
172
  return this._suppressLog(level, message, ...parameters);
@@ -159,6 +185,21 @@ class LoggerBase {
159
185
  const joined = strings.join('');
160
186
  return joined;
161
187
  }
188
+ /**
189
+ * Inner hook called for logged messages alongside {@link Logging.LoggerBase._log | _log},
190
+ * exposing the structured `(level, formatted, message, parameters)` form before it is
191
+ * collapsed to the formatted string. The default implementation is a no-op; subclasses
192
+ * that need to retain structured records (e.g. {@link Logging.RetainingLogger | RetainingLogger})
193
+ * override this. Fired only in the `shouldLog` branch, so suppressed messages never reach it.
194
+ * @param __level - The {@link MessageLogLevel | level} of the message.
195
+ * @param __formatted - The formatted message (same string passed to `_log`).
196
+ * @param __message - The raw message argument before formatting.
197
+ * @param __parameters - The raw parameter arguments before formatting.
198
+ * @public
199
+ */
200
+ _logStructured(__level, __formatted, __message, __parameters) {
201
+ /* no-op; subclasses that retain structured records override this */
202
+ }
162
203
  /**
163
204
  * Inner method called for suppressed log messages.
164
205
  * @public
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/packlets/logging/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { MessageLogLevel, Success, captureResult, succeed } from '../base';\n\n/**\n * The level of logging to be used.\n * @public\n */\nexport type ReporterLogLevel = 'all' | 'detail' | 'info' | 'warning' | 'error' | 'silent';\n\n/**\n * Compares two log levels.\n * @param message - The first log level.\n * @param reporter - The second log level.\n * @returns `true` if the message should be logged, `false` if it should be suppressed.\n * @public\n */\nexport function shouldLog(message: MessageLogLevel, reporter: ReporterLogLevel): boolean {\n if (reporter === 'all') {\n return true; // 'all' logs everything, including 'quiet'\n }\n if (reporter === 'silent') {\n return false; // 'silent' suppresses everything\n }\n if (message === 'quiet') {\n return false; // 'quiet' messages only show when reporter is 'all'\n }\n switch (reporter) {\n case 'error':\n return message === 'error';\n case 'warning':\n return message === 'warning' || message === 'error';\n case 'info':\n return message !== 'detail';\n }\n return true;\n}\n\n/**\n * Stringifies an arbitrary value for logging.\n * @param value - The value to stringify.\n * @returns The stringified value.\n * @param maxLength - The maximum length of the stringified value.\n * @public\n */\nexport function stringifyLogValue(value: unknown, maxLength?: number): string {\n maxLength = maxLength ?? 40;\n if (typeof value === 'string') {\n return value;\n }\n const str = String(value);\n if (str === '[object Object]') {\n return captureResult(() => JSON.stringify(value))\n .onSuccess((s) => {\n return succeed(s.length < maxLength ? s : s.substring(0, maxLength - 3) + '...');\n })\n .orDefault(str);\n }\n return str;\n}\n\n/**\n * Generic Result-aware logger interface with multiple levels of logging.\n * @public\n */\nexport interface ILogger {\n /**\n * The level of logging to be used.\n */\n readonly logLevel: ReporterLogLevel;\n\n /**\n * Logs a message at the given level.\n * @param level - The level of the message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;\n\n /**\n * Logs a detail message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;\n\n /**\n * Logs an info message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;\n\n /**\n * Logs a warning message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;\n\n /**\n * Logs an error message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;\n}\n\n/**\n * Extended logger interface that supports logging a short summary message at a\n * primary level (error/warn) while emitting the full detail at `detail` level.\n *\n * The detail is suppressed by default (requires log level `'detail'` or `'all'`),\n * keeping the primary log clean while preserving the full context for debugging.\n * @public\n */\nexport interface IDetailLogger extends ILogger {\n /**\n * Logs a short error summary at `error` level, then emits `detail` at `detail` level.\n * @param message - Short human-readable summary.\n * @param detail - Full detail (e.g. raw converter error) logged at `detail` level.\n */\n errorWithDetail(message: string, detail: unknown): Success<string | undefined>;\n\n /**\n * Logs a short warning summary at `warning` level, then emits `detail` at `detail` level.\n * @param message - Short human-readable summary.\n * @param detail - Full detail logged at `detail` level.\n */\n warnWithDetail(message: string, detail: unknown): Success<string | undefined>;\n}\n\n/**\n * Type guard that checks whether a logger implements {@link IDetailLogger}.\n * @param logger - The logger to check.\n * @returns `true` if the logger implements `IDetailLogger`.\n * @public\n */\nexport function isDetailLogger(logger: ILogger): logger is IDetailLogger {\n return (\n typeof (logger as IDetailLogger).errorWithDetail === 'function' &&\n typeof (logger as IDetailLogger).warnWithDetail === 'function'\n );\n}\n\n/**\n * Abstract base class which implements {@link Logging.IDetailLogger | IDetailLogger}.\n * @public\n */\nexport abstract class LoggerBase implements IDetailLogger {\n /**\n * The level of logging to be used.\n */\n public logLevel: ReporterLogLevel = 'info';\n\n protected constructor(logLevel?: ReporterLogLevel) {\n this.logLevel = logLevel ?? 'info';\n }\n\n /**\n * Logs a detail message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n public detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('detail', message, ...parameters);\n }\n\n /**\n * Logs an info message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n public info(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('info', message, ...parameters);\n }\n\n /**\n * Logs a warning message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n public warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('warning', message, ...parameters);\n }\n\n /**\n * Logs an error message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n public error(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('error', message, ...parameters);\n }\n\n /**\n * Logs a short error summary at `error` level, then emits `detail` at `detail` level.\n * @param message - Short human-readable summary.\n * @param detail - Full detail (e.g. raw converter error) logged at `detail` level.\n */\n public errorWithDetail(message: string, detail: unknown): Success<string | undefined> {\n this.detail(detail);\n return this.error(message);\n }\n\n /**\n * Logs a short warning summary at `warning` level, then emits `detail` at `detail` level.\n * @param message - Short human-readable summary.\n * @param detail - Full detail logged at `detail` level.\n */\n public warnWithDetail(message: string, detail: unknown): Success<string | undefined> {\n this.detail(detail);\n return this.warn(message);\n }\n\n /**\n * Logs a message at the given level.\n * @param level - The level of the message.\n * @param message - The message to log.\n * @param parameters - The parameters to log.\n * @returns `Success` with the logged message if the level is enabled, or\n * `Success` with `undefined` if the message is suppressed.\n */\n public log(\n level: MessageLogLevel,\n message?: unknown,\n ...parameters: unknown[]\n ): Success<string | undefined> {\n if (shouldLog(level, this.logLevel)) {\n const formatted = this._format(message, ...parameters);\n this._logStructured(level, formatted, message, parameters);\n return this._log(formatted, level);\n }\n return this._suppressLog(level, message, ...parameters);\n }\n\n /**\n * Formats a message and parameters into a string.\n * @param message - The message to format.\n * @param parameters - The parameters to format.\n * @returns The formatted message.\n * @public\n */\n protected _format(message?: unknown, ...parameters: unknown[]): string {\n const raw = [message, ...parameters];\n const filtered = raw.filter((m): m is string => m !== undefined);\n const strings = filtered.map((m) => stringifyLogValue(m));\n const joined = strings.join('');\n return joined;\n }\n\n /**\n * Inner hook called for logged messages alongside {@link Logging.LoggerBase._log | _log},\n * exposing the structured `(level, formatted, message, parameters)` form before it is\n * collapsed to the formatted string. The default implementation is a no-op; subclasses\n * that need to retain structured records (e.g. {@link Logging.RetainingLogger | RetainingLogger})\n * override this. Fired only in the `shouldLog` branch, so suppressed messages never reach it.\n * @param __level - The {@link MessageLogLevel | level} of the message.\n * @param __formatted - The formatted message (same string passed to `_log`).\n * @param __message - The raw message argument before formatting.\n * @param __parameters - The raw parameter arguments before formatting.\n * @public\n */\n protected _logStructured(\n __level: MessageLogLevel,\n __formatted: string,\n __message?: unknown,\n __parameters?: readonly unknown[]\n ): void {\n /* no-op; subclasses that retain structured records override this */\n }\n\n /**\n * Inner method called for suppressed log messages.\n * @public\n */\n protected _suppressLog(\n __level: MessageLogLevel,\n __message?: unknown,\n ...__parameters: unknown[]\n ): Success<undefined> {\n return succeed(undefined);\n }\n\n /**\n * Inner method called for logged messages. Should be implemented by derived classes.\n * @param message - The message to log.\n * @param level - The {@link MessageLogLevel | level} of the message.\n * @returns `Success` with the logged message, or `Success` with `undefined` if the message is suppressed.\n * @public\n */\n protected abstract _log(message: string, level: MessageLogLevel): Success<string | undefined>;\n}\n\n/**\n * An in-memory logger that stores logged and suppressed messages.\n * @public\n */\nexport class InMemoryLogger extends LoggerBase {\n /**\n * The messages that have been logged.\n * @internal\n */\n private _logged: string[] = [];\n\n /**\n * The messages that have been suppressed.\n * @internal\n */\n private _suppressed: string[] = [];\n\n /**\n * Creates a new in-memory logger.\n * @param logLevel - The level of logging to be used.\n */\n public constructor(logLevel?: ReporterLogLevel) {\n super(logLevel);\n }\n\n /**\n * The messages that have been logged.\n */\n public get logged(): string[] {\n return this._logged;\n }\n\n /**\n * The messages that have been suppressed.\n */\n public get suppressed(): string[] {\n return this._suppressed;\n }\n\n /**\n * Clears the logged and suppressed messages.\n */\n public clear(): void {\n this._logged = [];\n this._suppressed = [];\n }\n\n /**\n * {@inheritDoc Logging.LoggerBase._log}\n * @internal\n */\n protected _log(message: string, __level: MessageLogLevel): Success<string | undefined> {\n this._logged.push(message);\n return succeed(message);\n }\n\n /**\n * {@inheritDoc Logging.LoggerBase._suppressLog}\n * @internal\n */\n protected _suppressLog(\n level: MessageLogLevel,\n message?: unknown,\n ...parameters: unknown[]\n ): Success<undefined> {\n const formatted = this._format(message, ...parameters);\n this._suppressed.push(formatted);\n return succeed(undefined);\n }\n}\n\n/**\n * A console logger that outputs messages to the console.\n * @public\n */\nexport class ConsoleLogger extends LoggerBase {\n /**\n * Creates a new console logger.\n * @param logLevel - The level of logging to be used.\n */\n public constructor(logLevel?: ReporterLogLevel) {\n super(logLevel);\n }\n\n /**\n * {@inheritDoc Logging.LoggerBase._log}\n * @internal\n */\n protected _log(message: string, level: MessageLogLevel): Success<string | undefined> {\n switch (level) {\n case 'error':\n console.error(message);\n break;\n case 'warning':\n console.warn(message);\n break;\n case 'info':\n console.info(message);\n break;\n default:\n console.log(message);\n break;\n }\n return succeed(message);\n }\n}\n\n/**\n * A no-op {@link Logging.LoggerBase | LoggerBase} that does not log anything.\n * @public\n */\nexport class NoOpLogger extends LoggerBase {\n /**\n * Creates a new no-op logger.\n * @param logLevel - The level of logging to be used.\n */\n public constructor(logLevel?: ReporterLogLevel) {\n super(logLevel);\n }\n\n /**\n * {@inheritDoc Logging.LoggerBase._log}\n * @internal\n */\n protected _log(message: string, __level: MessageLogLevel): Success<string | undefined> {\n // no-op\n return succeed(message);\n }\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import { MessageLogLevel, Success } from '../base';
2
+ import { ILogger, ReporterLogLevel } from './logger';
3
+ /**
4
+ * An {@link Logging.ILogger | ILogger} that fans every log call out to N child loggers,
5
+ * each applying its own threshold.
6
+ *
7
+ * @remarks
8
+ * The composite does not pre-filter — it forwards the raw `(level, message, ...params)`
9
+ * to each child's public method so each child formats and filters per its own rules.
10
+ * This lets a single pinned logger feed, for example, a {@link Logging.ConsoleLogger | ConsoleLogger}
11
+ * (stdout) and a {@link Logging.RetainingLogger | RetainingLogger} (observability buffer)
12
+ * with independent log levels.
13
+ *
14
+ * @public
15
+ */
16
+ export declare class MultiLogger implements ILogger {
17
+ /**
18
+ * The child loggers calls are fanned out to.
19
+ * @internal
20
+ */
21
+ private readonly _loggers;
22
+ /**
23
+ * Creates a new multi logger.
24
+ * @param loggers - The child loggers to fan calls out to.
25
+ */
26
+ constructor(loggers: ReadonlyArray<ILogger>);
27
+ /**
28
+ * The most-verbose (most-permissive) level among the children, so an upstream
29
+ * `shouldLog` gate does not suppress a call before it can fan out to a more
30
+ * permissive child. Computed on access, since a child's level may change.
31
+ */
32
+ get logLevel(): ReporterLogLevel;
33
+ /**
34
+ * {@inheritDoc Logging.ILogger.log}
35
+ */
36
+ log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
37
+ /**
38
+ * {@inheritDoc Logging.ILogger.detail}
39
+ */
40
+ detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
41
+ /**
42
+ * {@inheritDoc Logging.ILogger.info}
43
+ */
44
+ info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
45
+ /**
46
+ * {@inheritDoc Logging.ILogger.warn}
47
+ */
48
+ warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
49
+ /**
50
+ * {@inheritDoc Logging.ILogger.error}
51
+ */
52
+ error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
53
+ }
54
+ //# sourceMappingURL=multiLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiLogger.d.ts","sourceRoot":"","sources":["../../../src/packlets/logging/multiLogger.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAW,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiBrD;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,YAAW,OAAO;IACzC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD;;;OAGG;gBACgB,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IAIlD;;;;OAIG;IACH,IAAW,QAAQ,IAAI,gBAAgB,CAKtC;IAED;;OAEG;IACI,GAAG,CACR,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,OAAO,EACjB,GAAG,UAAU,EAAE,OAAO,EAAE,GACvB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAW9B;;OAEG;IACI,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIvF;;OAEG;IACI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIrF;;OAEG;IACI,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIrF;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAGvF"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiLogger = void 0;
4
+ /*
5
+ * Copyright (c) 2020 Erik Fortune
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+ const base_1 = require("../base");
26
+ /**
27
+ * Verbosity rank for each {@link Logging.ReporterLogLevel | ReporterLogLevel}, materializing
28
+ * the {@link Logging.shouldLog | shouldLog} ordering. A higher rank is more permissive
29
+ * (emits strictly more message levels).
30
+ * @internal
31
+ */
32
+ const verbosityRank = {
33
+ silent: 0,
34
+ error: 1,
35
+ warning: 2,
36
+ info: 3,
37
+ detail: 4,
38
+ all: 5
39
+ };
40
+ /**
41
+ * An {@link Logging.ILogger | ILogger} that fans every log call out to N child loggers,
42
+ * each applying its own threshold.
43
+ *
44
+ * @remarks
45
+ * The composite does not pre-filter — it forwards the raw `(level, message, ...params)`
46
+ * to each child's public method so each child formats and filters per its own rules.
47
+ * This lets a single pinned logger feed, for example, a {@link Logging.ConsoleLogger | ConsoleLogger}
48
+ * (stdout) and a {@link Logging.RetainingLogger | RetainingLogger} (observability buffer)
49
+ * with independent log levels.
50
+ *
51
+ * @public
52
+ */
53
+ class MultiLogger {
54
+ /**
55
+ * Creates a new multi logger.
56
+ * @param loggers - The child loggers to fan calls out to.
57
+ */
58
+ constructor(loggers) {
59
+ this._loggers = [...loggers];
60
+ }
61
+ /**
62
+ * The most-verbose (most-permissive) level among the children, so an upstream
63
+ * `shouldLog` gate does not suppress a call before it can fan out to a more
64
+ * permissive child. Computed on access, since a child's level may change.
65
+ */
66
+ get logLevel() {
67
+ return this._loggers.reduce((most, logger) => (verbosityRank[logger.logLevel] > verbosityRank[most] ? logger.logLevel : most), 'silent');
68
+ }
69
+ /**
70
+ * {@inheritDoc Logging.ILogger.log}
71
+ */
72
+ log(level, message, ...parameters) {
73
+ let logged;
74
+ for (const logger of this._loggers) {
75
+ const value = logger.log(level, message, ...parameters).value;
76
+ if (value !== undefined) {
77
+ logged = value;
78
+ }
79
+ }
80
+ return (0, base_1.succeed)(logged);
81
+ }
82
+ /**
83
+ * {@inheritDoc Logging.ILogger.detail}
84
+ */
85
+ detail(message, ...parameters) {
86
+ return this.log('detail', message, ...parameters);
87
+ }
88
+ /**
89
+ * {@inheritDoc Logging.ILogger.info}
90
+ */
91
+ info(message, ...parameters) {
92
+ return this.log('info', message, ...parameters);
93
+ }
94
+ /**
95
+ * {@inheritDoc Logging.ILogger.warn}
96
+ */
97
+ warn(message, ...parameters) {
98
+ return this.log('warning', message, ...parameters);
99
+ }
100
+ /**
101
+ * {@inheritDoc Logging.ILogger.error}
102
+ */
103
+ error(message, ...parameters) {
104
+ return this.log('error', message, ...parameters);
105
+ }
106
+ }
107
+ exports.MultiLogger = MultiLogger;
108
+ //# sourceMappingURL=multiLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiLogger.js","sourceRoot":"","sources":["../../../src/packlets/logging/multiLogger.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,kCAA4D;AAG5D;;;;;GAKG;AACH,MAAM,aAAa,GAAqC;IACtD,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAa,WAAW;IAOtB;;;OAGG;IACH,YAAmB,OAA+B;QAChD,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EACjG,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,GAAG,CACR,KAAsB,EACtB,OAAiB,EACjB,GAAG,UAAqB;QAExB,IAAI,MAA0B,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC;YAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,GAAG,KAAK,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACvD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAiB,EAAE,GAAG,UAAqB;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IACnD,CAAC;CACF;AAxED,kCAwEC","sourcesContent":["/*\n * Copyright (c) 2020 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { MessageLogLevel, Success, succeed } from '../base';\nimport { ILogger, ReporterLogLevel } from './logger';\n\n/**\n * Verbosity rank for each {@link Logging.ReporterLogLevel | ReporterLogLevel}, materializing\n * the {@link Logging.shouldLog | shouldLog} ordering. A higher rank is more permissive\n * (emits strictly more message levels).\n * @internal\n */\nconst verbosityRank: Record<ReporterLogLevel, number> = {\n silent: 0,\n error: 1,\n warning: 2,\n info: 3,\n detail: 4,\n all: 5\n};\n\n/**\n * An {@link Logging.ILogger | ILogger} that fans every log call out to N child loggers,\n * each applying its own threshold.\n *\n * @remarks\n * The composite does not pre-filter — it forwards the raw `(level, message, ...params)`\n * to each child's public method so each child formats and filters per its own rules.\n * This lets a single pinned logger feed, for example, a {@link Logging.ConsoleLogger | ConsoleLogger}\n * (stdout) and a {@link Logging.RetainingLogger | RetainingLogger} (observability buffer)\n * with independent log levels.\n *\n * @public\n */\nexport class MultiLogger implements ILogger {\n /**\n * The child loggers calls are fanned out to.\n * @internal\n */\n private readonly _loggers: ReadonlyArray<ILogger>;\n\n /**\n * Creates a new multi logger.\n * @param loggers - The child loggers to fan calls out to.\n */\n public constructor(loggers: ReadonlyArray<ILogger>) {\n this._loggers = [...loggers];\n }\n\n /**\n * The most-verbose (most-permissive) level among the children, so an upstream\n * `shouldLog` gate does not suppress a call before it can fan out to a more\n * permissive child. Computed on access, since a child's level may change.\n */\n public get logLevel(): ReporterLogLevel {\n return this._loggers.reduce<ReporterLogLevel>(\n (most, logger) => (verbosityRank[logger.logLevel] > verbosityRank[most] ? logger.logLevel : most),\n 'silent'\n );\n }\n\n /**\n * {@inheritDoc Logging.ILogger.log}\n */\n public log(\n level: MessageLogLevel,\n message?: unknown,\n ...parameters: unknown[]\n ): Success<string | undefined> {\n let logged: string | undefined;\n for (const logger of this._loggers) {\n const value = logger.log(level, message, ...parameters).value;\n if (value !== undefined) {\n logged = value;\n }\n }\n return succeed(logged);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.detail}\n */\n public detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('detail', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.info}\n */\n public info(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('info', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.warn}\n */\n public warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('warning', message, ...parameters);\n }\n\n /**\n * {@inheritDoc Logging.ILogger.error}\n */\n public error(message?: unknown, ...parameters: unknown[]): Success<string | undefined> {\n return this.log('error', message, ...parameters);\n }\n}\n"]}