docxmlater 10.1.4 → 10.1.6

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 (372) hide show
  1. package/README.md +759 -754
  2. package/dist/constants/legacyCompatFlags.js +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.js.map +1 -1
  5. package/dist/core/Document.d.ts +51 -50
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +486 -471
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +9 -9
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +1 -1
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentGenerator.d.ts +11 -11
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +251 -251
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.js.map +1 -1
  18. package/dist/core/DocumentParser.d.ts +15 -15
  19. package/dist/core/DocumentParser.d.ts.map +1 -1
  20. package/dist/core/DocumentParser.js +2123 -2155
  21. package/dist/core/DocumentParser.js.map +1 -1
  22. package/dist/core/DocumentValidator.d.ts.map +1 -1
  23. package/dist/core/DocumentValidator.js +2 -5
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.js.map +1 -1
  26. package/dist/core/RelationshipManager.d.ts.map +1 -1
  27. package/dist/core/RelationshipManager.js +3 -3
  28. package/dist/core/RelationshipManager.js.map +1 -1
  29. package/dist/elements/AlternateContent.js.map +1 -1
  30. package/dist/elements/Bookmark.d.ts.map +1 -1
  31. package/dist/elements/Bookmark.js +3 -1
  32. package/dist/elements/Bookmark.js.map +1 -1
  33. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  34. package/dist/elements/BookmarkManager.js.map +1 -1
  35. package/dist/elements/Comment.d.ts.map +1 -1
  36. package/dist/elements/Comment.js +9 -6
  37. package/dist/elements/Comment.js.map +1 -1
  38. package/dist/elements/CommentManager.d.ts.map +1 -1
  39. package/dist/elements/CommentManager.js +18 -17
  40. package/dist/elements/CommentManager.js.map +1 -1
  41. package/dist/elements/CommonTypes.d.ts +21 -21
  42. package/dist/elements/CommonTypes.d.ts.map +1 -1
  43. package/dist/elements/CommonTypes.js +56 -56
  44. package/dist/elements/CommonTypes.js.map +1 -1
  45. package/dist/elements/CustomXml.js.map +1 -1
  46. package/dist/elements/Endnote.d.ts.map +1 -1
  47. package/dist/elements/Endnote.js +6 -6
  48. package/dist/elements/Endnote.js.map +1 -1
  49. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  50. package/dist/elements/EndnoteManager.js +6 -7
  51. package/dist/elements/EndnoteManager.js.map +1 -1
  52. package/dist/elements/Field.d.ts.map +1 -1
  53. package/dist/elements/Field.js +82 -25
  54. package/dist/elements/Field.js.map +1 -1
  55. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  56. package/dist/elements/FieldHelpers.js.map +1 -1
  57. package/dist/elements/FontManager.d.ts.map +1 -1
  58. package/dist/elements/FontManager.js +1 -1
  59. package/dist/elements/FontManager.js.map +1 -1
  60. package/dist/elements/Footer.js +2 -2
  61. package/dist/elements/Footer.js.map +1 -1
  62. package/dist/elements/Footnote.d.ts.map +1 -1
  63. package/dist/elements/Footnote.js +6 -6
  64. package/dist/elements/Footnote.js.map +1 -1
  65. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  66. package/dist/elements/FootnoteManager.js +6 -7
  67. package/dist/elements/FootnoteManager.js.map +1 -1
  68. package/dist/elements/Header.js +2 -2
  69. package/dist/elements/Header.js.map +1 -1
  70. package/dist/elements/HeaderFooterManager.js.map +1 -1
  71. package/dist/elements/Hyperlink.d.ts +5 -3
  72. package/dist/elements/Hyperlink.d.ts.map +1 -1
  73. package/dist/elements/Hyperlink.js +134 -76
  74. package/dist/elements/Hyperlink.js.map +1 -1
  75. package/dist/elements/Image.d.ts.map +1 -1
  76. package/dist/elements/Image.js +238 -106
  77. package/dist/elements/Image.js.map +1 -1
  78. package/dist/elements/ImageManager.d.ts.map +1 -1
  79. package/dist/elements/ImageManager.js +1 -1
  80. package/dist/elements/ImageManager.js.map +1 -1
  81. package/dist/elements/ImageRun.js +1 -1
  82. package/dist/elements/ImageRun.js.map +1 -1
  83. package/dist/elements/MathElement.js.map +1 -1
  84. package/dist/elements/Paragraph.d.ts +24 -24
  85. package/dist/elements/Paragraph.d.ts.map +1 -1
  86. package/dist/elements/Paragraph.js +181 -188
  87. package/dist/elements/Paragraph.js.map +1 -1
  88. package/dist/elements/PreservedElement.js.map +1 -1
  89. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  90. package/dist/elements/PropertyChangeTypes.js +6 -6
  91. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  92. package/dist/elements/RangeMarker.d.ts.map +1 -1
  93. package/dist/elements/RangeMarker.js.map +1 -1
  94. package/dist/elements/Revision.d.ts.map +1 -1
  95. package/dist/elements/Revision.js +4 -5
  96. package/dist/elements/Revision.js.map +1 -1
  97. package/dist/elements/RevisionContent.js.map +1 -1
  98. package/dist/elements/RevisionManager.d.ts.map +1 -1
  99. package/dist/elements/RevisionManager.js +40 -48
  100. package/dist/elements/RevisionManager.js.map +1 -1
  101. package/dist/elements/Run.d.ts +16 -16
  102. package/dist/elements/Run.d.ts.map +1 -1
  103. package/dist/elements/Run.js +256 -238
  104. package/dist/elements/Run.js.map +1 -1
  105. package/dist/elements/Section.d.ts.map +1 -1
  106. package/dist/elements/Section.js +36 -11
  107. package/dist/elements/Section.js.map +1 -1
  108. package/dist/elements/Shape.d.ts.map +1 -1
  109. package/dist/elements/Shape.js.map +1 -1
  110. package/dist/elements/StructuredDocumentTag.d.ts +6 -6
  111. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  112. package/dist/elements/StructuredDocumentTag.js +99 -104
  113. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  114. package/dist/elements/Table.d.ts +11 -11
  115. package/dist/elements/Table.d.ts.map +1 -1
  116. package/dist/elements/Table.js +102 -107
  117. package/dist/elements/Table.js.map +1 -1
  118. package/dist/elements/TableCell.d.ts +10 -10
  119. package/dist/elements/TableCell.d.ts.map +1 -1
  120. package/dist/elements/TableCell.js +105 -106
  121. package/dist/elements/TableCell.js.map +1 -1
  122. package/dist/elements/TableGridChange.d.ts.map +1 -1
  123. package/dist/elements/TableGridChange.js.map +1 -1
  124. package/dist/elements/TableOfContents.d.ts.map +1 -1
  125. package/dist/elements/TableOfContents.js +4 -4
  126. package/dist/elements/TableOfContents.js.map +1 -1
  127. package/dist/elements/TableOfContentsElement.js.map +1 -1
  128. package/dist/elements/TableRow.d.ts.map +1 -1
  129. package/dist/elements/TableRow.js +13 -6
  130. package/dist/elements/TableRow.js.map +1 -1
  131. package/dist/elements/TextBox.d.ts.map +1 -1
  132. package/dist/elements/TextBox.js +3 -5
  133. package/dist/elements/TextBox.js.map +1 -1
  134. package/dist/formatting/AbstractNumbering.d.ts +4 -4
  135. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  136. package/dist/formatting/AbstractNumbering.js +54 -49
  137. package/dist/formatting/AbstractNumbering.js.map +1 -1
  138. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  139. package/dist/formatting/NumberingInstance.js +1 -3
  140. package/dist/formatting/NumberingInstance.js.map +1 -1
  141. package/dist/formatting/NumberingLevel.d.ts +5 -5
  142. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  143. package/dist/formatting/NumberingLevel.js +119 -125
  144. package/dist/formatting/NumberingLevel.js.map +1 -1
  145. package/dist/formatting/NumberingManager.d.ts +1 -0
  146. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  147. package/dist/formatting/NumberingManager.js +27 -9
  148. package/dist/formatting/NumberingManager.js.map +1 -1
  149. package/dist/formatting/Style.d.ts +11 -11
  150. package/dist/formatting/Style.d.ts.map +1 -1
  151. package/dist/formatting/Style.js +219 -247
  152. package/dist/formatting/Style.js.map +1 -1
  153. package/dist/formatting/StylesManager.d.ts +2 -2
  154. package/dist/formatting/StylesManager.d.ts.map +1 -1
  155. package/dist/formatting/StylesManager.js +96 -102
  156. package/dist/formatting/StylesManager.js.map +1 -1
  157. package/dist/helpers/CleanupHelper.d.ts +1 -1
  158. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  159. package/dist/helpers/CleanupHelper.js +6 -6
  160. package/dist/helpers/CleanupHelper.js.map +1 -1
  161. package/dist/images/ImageOptimizer.js +7 -7
  162. package/dist/images/ImageOptimizer.js.map +1 -1
  163. package/dist/index.d.ts +9 -9
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js.map +1 -1
  166. package/dist/managers/DrawingManager.js.map +1 -1
  167. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  168. package/dist/tracking/DocumentTrackingContext.js +23 -7
  169. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  170. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  171. package/dist/tracking/TrackingContext.js.map +1 -1
  172. package/dist/types/compatibility-types.js.map +1 -1
  173. package/dist/types/formatting.js.map +1 -1
  174. package/dist/types/list-types.d.ts +6 -6
  175. package/dist/types/list-types.js.map +1 -1
  176. package/dist/types/settings-types.js.map +1 -1
  177. package/dist/types/styleConfig.d.ts +2 -2
  178. package/dist/types/styleConfig.js.map +1 -1
  179. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  180. package/dist/utils/ChangelogGenerator.js +97 -101
  181. package/dist/utils/ChangelogGenerator.js.map +1 -1
  182. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  183. package/dist/utils/CompatibilityUpgrader.js +1 -1
  184. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  185. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  186. package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
  187. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  188. package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
  189. package/dist/utils/MoveOperationHelper.js +1 -1
  190. package/dist/utils/MoveOperationHelper.js.map +1 -1
  191. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  192. package/dist/utils/RevisionAwareProcessor.js +2 -4
  193. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  194. package/dist/utils/RevisionWalker.d.ts.map +1 -1
  195. package/dist/utils/RevisionWalker.js +4 -12
  196. package/dist/utils/RevisionWalker.js.map +1 -1
  197. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  198. package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
  199. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  200. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  201. package/dist/utils/ShadingResolver.js +1 -1
  202. package/dist/utils/ShadingResolver.js.map +1 -1
  203. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  204. package/dist/utils/acceptRevisions.js +23 -12
  205. package/dist/utils/acceptRevisions.js.map +1 -1
  206. package/dist/utils/cnfStyleDecoder.d.ts +1 -1
  207. package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
  208. package/dist/utils/cnfStyleDecoder.js +40 -40
  209. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  210. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  211. package/dist/utils/corruptionDetection.js.map +1 -1
  212. package/dist/utils/dateFormatting.js.map +1 -1
  213. package/dist/utils/deepClone.js +1 -1
  214. package/dist/utils/deepClone.js.map +1 -1
  215. package/dist/utils/diagnostics.d.ts.map +1 -1
  216. package/dist/utils/diagnostics.js +1 -1
  217. package/dist/utils/diagnostics.js.map +1 -1
  218. package/dist/utils/errorHandling.js.map +1 -1
  219. package/dist/utils/formatting.d.ts.map +1 -1
  220. package/dist/utils/formatting.js +10 -2
  221. package/dist/utils/formatting.js.map +1 -1
  222. package/dist/utils/list-detection.d.ts +2 -2
  223. package/dist/utils/list-detection.d.ts.map +1 -1
  224. package/dist/utils/list-detection.js +21 -23
  225. package/dist/utils/list-detection.js.map +1 -1
  226. package/dist/utils/logger.d.ts.map +1 -1
  227. package/dist/utils/logger.js +12 -7
  228. package/dist/utils/logger.js.map +1 -1
  229. package/dist/utils/parsingHelpers.js.map +1 -1
  230. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  231. package/dist/utils/stripTrackedChanges.js +3 -3
  232. package/dist/utils/stripTrackedChanges.js.map +1 -1
  233. package/dist/utils/textDiff.d.ts +1 -1
  234. package/dist/utils/textDiff.js +8 -8
  235. package/dist/utils/textDiff.js.map +1 -1
  236. package/dist/utils/units.js.map +1 -1
  237. package/dist/utils/validation.d.ts.map +1 -1
  238. package/dist/utils/validation.js +24 -7
  239. package/dist/utils/validation.js.map +1 -1
  240. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  241. package/dist/utils/xmlSanitization.js +3 -3
  242. package/dist/utils/xmlSanitization.js.map +1 -1
  243. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  244. package/dist/validation/RevisionAutoFixer.js +5 -5
  245. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  246. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  247. package/dist/validation/RevisionValidator.js +7 -9
  248. package/dist/validation/RevisionValidator.js.map +1 -1
  249. package/dist/validation/ValidationRules.js +3 -3
  250. package/dist/validation/ValidationRules.js.map +1 -1
  251. package/dist/validation/index.js.map +1 -1
  252. package/dist/xml/XMLBuilder.d.ts +1 -1
  253. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  254. package/dist/xml/XMLBuilder.js +98 -100
  255. package/dist/xml/XMLBuilder.js.map +1 -1
  256. package/dist/xml/XMLParser.d.ts.map +1 -1
  257. package/dist/xml/XMLParser.js +61 -66
  258. package/dist/xml/XMLParser.js.map +1 -1
  259. package/dist/zip/ZipHandler.d.ts.map +1 -1
  260. package/dist/zip/ZipHandler.js.map +1 -1
  261. package/dist/zip/ZipReader.d.ts.map +1 -1
  262. package/dist/zip/ZipReader.js +1 -3
  263. package/dist/zip/ZipReader.js.map +1 -1
  264. package/dist/zip/ZipWriter.d.ts +1 -1
  265. package/dist/zip/ZipWriter.d.ts.map +1 -1
  266. package/dist/zip/ZipWriter.js +28 -36
  267. package/dist/zip/ZipWriter.js.map +1 -1
  268. package/dist/zip/types.js +1 -1
  269. package/dist/zip/types.js.map +1 -1
  270. package/package.json +92 -92
  271. package/src/__tests__/helper-methods.test.ts +512 -512
  272. package/src/constants/legacyCompatFlags.ts +138 -138
  273. package/src/constants/limits.ts +50 -50
  274. package/src/core/Document.ts +1010 -1145
  275. package/src/core/DocumentContent.ts +461 -467
  276. package/src/core/DocumentGenerator.ts +1133 -1104
  277. package/src/core/DocumentIdManager.ts +158 -158
  278. package/src/core/DocumentParser.ts +2347 -2716
  279. package/src/core/DocumentValidator.ts +363 -372
  280. package/src/core/Relationship.ts +367 -367
  281. package/src/core/RelationshipManager.ts +429 -428
  282. package/src/elements/AlternateContent.ts +42 -42
  283. package/src/elements/Bookmark.ts +212 -210
  284. package/src/elements/BookmarkManager.ts +247 -250
  285. package/src/elements/Comment.ts +356 -359
  286. package/src/elements/CommentManager.ts +499 -502
  287. package/src/elements/CommonTypes.ts +524 -549
  288. package/src/elements/CustomXml.ts +36 -36
  289. package/src/elements/Endnote.ts +221 -217
  290. package/src/elements/EndnoteManager.ts +246 -249
  291. package/src/elements/Field.ts +1292 -1233
  292. package/src/elements/FieldHelpers.ts +329 -333
  293. package/src/elements/FontManager.ts +336 -339
  294. package/src/elements/Footer.ts +269 -269
  295. package/src/elements/Footnote.ts +221 -217
  296. package/src/elements/FootnoteManager.ts +246 -249
  297. package/src/elements/Header.ts +269 -269
  298. package/src/elements/HeaderFooterManager.ts +219 -219
  299. package/src/elements/Hyperlink.ts +1288 -1193
  300. package/src/elements/Image.ts +1982 -1756
  301. package/src/elements/ImageManager.ts +437 -432
  302. package/src/elements/ImageRun.ts +59 -59
  303. package/src/elements/MathElement.ts +65 -65
  304. package/src/elements/Paragraph.ts +4347 -4287
  305. package/src/elements/PreservedElement.ts +53 -53
  306. package/src/elements/PropertyChangeTypes.ts +458 -442
  307. package/src/elements/RangeMarker.ts +382 -400
  308. package/src/elements/Revision.ts +1198 -1217
  309. package/src/elements/RevisionContent.ts +73 -73
  310. package/src/elements/RevisionManager.ts +1070 -1070
  311. package/src/elements/Run.ts +3103 -3073
  312. package/src/elements/Section.ts +1521 -1421
  313. package/src/elements/Shape.ts +884 -873
  314. package/src/elements/StructuredDocumentTag.ts +1176 -1207
  315. package/src/elements/Table.ts +2468 -2524
  316. package/src/elements/TableCell.ts +1617 -1621
  317. package/src/elements/TableGridChange.ts +149 -151
  318. package/src/elements/TableOfContents.ts +701 -691
  319. package/src/elements/TableOfContentsElement.ts +89 -89
  320. package/src/elements/TableRow.ts +960 -929
  321. package/src/elements/TextBox.ts +766 -768
  322. package/src/formatting/AbstractNumbering.ts +580 -579
  323. package/src/formatting/NumberingInstance.ts +295 -299
  324. package/src/formatting/NumberingLevel.ts +981 -1040
  325. package/src/formatting/NumberingManager.ts +875 -827
  326. package/src/formatting/Style.ts +1785 -1879
  327. package/src/formatting/StylesManager.ts +1090 -1130
  328. package/src/helpers/CleanupHelper.ts +524 -524
  329. package/src/images/ImageOptimizer.ts +274 -274
  330. package/src/index.ts +559 -554
  331. package/src/managers/DrawingManager.ts +319 -319
  332. package/src/tracking/DocumentTrackingContext.ts +687 -674
  333. package/src/tracking/TrackingContext.ts +175 -173
  334. package/src/types/compatibility-types.ts +49 -49
  335. package/src/types/formatting.ts +210 -210
  336. package/src/types/list-types.ts +14 -14
  337. package/src/types/settings-types.ts +59 -59
  338. package/src/types/styleConfig.ts +189 -189
  339. package/src/utils/ChangelogGenerator.ts +1583 -1581
  340. package/src/utils/CompatibilityUpgrader.ts +235 -237
  341. package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
  342. package/src/utils/MoveOperationHelper.ts +233 -238
  343. package/src/utils/RevisionAwareProcessor.ts +518 -526
  344. package/src/utils/RevisionWalker.ts +427 -457
  345. package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
  346. package/src/utils/ShadingResolver.ts +105 -107
  347. package/src/utils/acceptRevisions.ts +723 -714
  348. package/src/utils/cnfStyleDecoder.ts +212 -217
  349. package/src/utils/corruptionDetection.ts +346 -345
  350. package/src/utils/dateFormatting.ts +20 -20
  351. package/src/utils/deepClone.ts +77 -78
  352. package/src/utils/diagnostics.ts +125 -129
  353. package/src/utils/errorHandling.ts +80 -80
  354. package/src/utils/formatting.ts +220 -213
  355. package/src/utils/list-detection.ts +32 -42
  356. package/src/utils/logger.ts +412 -404
  357. package/src/utils/parsingHelpers.ts +190 -190
  358. package/src/utils/stripTrackedChanges.ts +356 -353
  359. package/src/utils/textDiff.ts +100 -100
  360. package/src/utils/units.ts +421 -421
  361. package/src/utils/validation.ts +553 -542
  362. package/src/utils/xmlSanitization.ts +179 -182
  363. package/src/validation/RevisionAutoFixer.ts +541 -542
  364. package/src/validation/RevisionValidator.ts +470 -460
  365. package/src/validation/ValidationRules.ts +338 -338
  366. package/src/validation/index.ts +30 -30
  367. package/src/xml/XMLBuilder.ts +857 -871
  368. package/src/xml/XMLParser.ts +877 -919
  369. package/src/zip/ZipHandler.ts +629 -637
  370. package/src/zip/ZipReader.ts +295 -299
  371. package/src/zip/ZipWriter.ts +374 -390
  372. package/src/zip/types.ts +116 -116
@@ -1,404 +1,412 @@
1
- /**
2
- * Logging interface for docXMLater
3
- * Allows library consumers to control logging behavior
4
- */
5
-
6
- /**
7
- * Log severity levels
8
- */
9
- export enum LogLevel {
10
- /** Debugging information (most verbose) */
11
- DEBUG = 'debug',
12
- /** Informational messages */
13
- INFO = 'info',
14
- /** Warning messages - potential issues that don't prevent operation */
15
- WARN = 'warn',
16
- /** Error messages - serious issues that may cause failures */
17
- ERROR = 'error',
18
- }
19
-
20
- /**
21
- * Log entry structure
22
- */
23
- export interface LogEntry {
24
- /** Timestamp when log was created */
25
- timestamp: Date;
26
- /** Severity level */
27
- level: LogLevel;
28
- /** Log message */
29
- message: string;
30
- /** Optional context data */
31
- context?: Record<string, any>;
32
- /** Source component that generated the log */
33
- source?: string;
34
- }
35
-
36
- /**
37
- * Logger interface that consumers can implement
38
- * Provides full control over how logs are handled
39
- */
40
- export interface ILogger {
41
- /**
42
- * Log a debug message
43
- * @param message - Debug message
44
- * @param context - Optional context data
45
- */
46
- debug(message: string, context?: Record<string, any>): void;
47
-
48
- /**
49
- * Log an informational message
50
- * @param message - Info message
51
- * @param context - Optional context data
52
- */
53
- info(message: string, context?: Record<string, any>): void;
54
-
55
- /**
56
- * Log a warning message
57
- * @param message - Warning message
58
- * @param context - Optional context data
59
- */
60
- warn(message: string, context?: Record<string, any>): void;
61
-
62
- /**
63
- * Log an error message
64
- * @param message - Error message
65
- * @param context - Optional context data
66
- */
67
- error(message: string, context?: Record<string, any>): void;
68
- }
69
-
70
- /**
71
- * Console-based logger implementation
72
- * Uses standard console methods for output with timestamps and source prefixes
73
- */
74
- export class ConsoleLogger implements ILogger {
75
- private showTimestamp: boolean;
76
-
77
- constructor(private minLevel: LogLevel = LogLevel.WARN, options?: { showTimestamp?: boolean }) {
78
- this.showTimestamp = options?.showTimestamp ?? true;
79
- }
80
-
81
- debug(message: string, context?: Record<string, any>): void {
82
- if (this.shouldLog(LogLevel.DEBUG)) {
83
- console.debug(this.formatMessage(LogLevel.DEBUG, message, context));
84
- }
85
- }
86
-
87
- info(message: string, context?: Record<string, any>): void {
88
- if (this.shouldLog(LogLevel.INFO)) {
89
- console.info(this.formatMessage(LogLevel.INFO, message, context));
90
- }
91
- }
92
-
93
- warn(message: string, context?: Record<string, any>): void {
94
- if (this.shouldLog(LogLevel.WARN)) {
95
- console.warn(this.formatMessage(LogLevel.WARN, message, context));
96
- }
97
- }
98
-
99
- error(message: string, context?: Record<string, any>): void {
100
- if (this.shouldLog(LogLevel.ERROR)) {
101
- console.error(this.formatMessage(LogLevel.ERROR, message, context));
102
- }
103
- }
104
-
105
- private shouldLog(level: LogLevel): boolean {
106
- const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
107
- const minIndex = levels.indexOf(this.minLevel);
108
- const currentIndex = levels.indexOf(level);
109
- return currentIndex >= minIndex;
110
- }
111
-
112
- private formatMessage(level: LogLevel, message: string, context?: Record<string, any>): string {
113
- const parts: string[] = [];
114
-
115
- // Add timestamp if enabled
116
- if (this.showTimestamp) {
117
- const timestamp = new Date().toISOString().slice(11, 23); // HH:mm:ss.SSS
118
- parts.push(timestamp);
119
- }
120
-
121
- // Add level tag
122
- parts.push(`[${level.toUpperCase().padEnd(5)}]`);
123
-
124
- // Add source if present
125
- if (context?.source) {
126
- parts.push(`[${context.source}]`);
127
- }
128
-
129
- // Add message
130
- parts.push(message);
131
-
132
- // Add context (excluding source which is already shown)
133
- if (context && Object.keys(context).length > 0) {
134
- const contextWithoutSource = { ...context };
135
- delete contextWithoutSource.source;
136
- if (Object.keys(contextWithoutSource).length > 0) {
137
- // Format context as key=value pairs for readability
138
- const contextStr = this.formatContext(contextWithoutSource);
139
- if (contextStr) {
140
- parts.push(contextStr);
141
- }
142
- }
143
- }
144
-
145
- return parts.join(' ');
146
- }
147
-
148
- private formatContext(context: Record<string, any>): string {
149
- const pairs: string[] = [];
150
- for (const [key, value] of Object.entries(context)) {
151
- if (value === undefined || value === null) continue;
152
- if (typeof value === 'object' && !Array.isArray(value)) {
153
- // Nested object - use compact JSON
154
- pairs.push(`${key}=${JSON.stringify(value)}`);
155
- } else if (Array.isArray(value)) {
156
- pairs.push(`${key}=[${value.length}]`);
157
- } else {
158
- pairs.push(`${key}=${value}`);
159
- }
160
- }
161
- return pairs.length > 0 ? pairs.join(' ') : '';
162
- }
163
- }
164
-
165
- /**
166
- * Silent logger that discards all log messages
167
- * Useful for testing or when logging is not desired
168
- */
169
- export class SilentLogger implements ILogger {
170
- debug(): void {
171
- // No-op
172
- }
173
-
174
- info(): void {
175
- // No-op
176
- }
177
-
178
- warn(): void {
179
- // No-op
180
- }
181
-
182
- error(): void {
183
- // No-op
184
- }
185
- }
186
-
187
- /**
188
- * Collecting logger that stores log entries in memory
189
- * Useful for testing and diagnostics
190
- */
191
- export class CollectingLogger implements ILogger {
192
- private logs: LogEntry[] = [];
193
-
194
- debug(message: string, context?: Record<string, any>): void {
195
- this.addLog(LogLevel.DEBUG, message, context);
196
- }
197
-
198
- info(message: string, context?: Record<string, any>): void {
199
- this.addLog(LogLevel.INFO, message, context);
200
- }
201
-
202
- warn(message: string, context?: Record<string, any>): void {
203
- this.addLog(LogLevel.WARN, message, context);
204
- }
205
-
206
- error(message: string, context?: Record<string, any>): void {
207
- this.addLog(LogLevel.ERROR, message, context);
208
- }
209
-
210
- private addLog(level: LogLevel, message: string, context?: Record<string, any>): void {
211
- this.logs.push({
212
- timestamp: new Date(),
213
- level,
214
- message,
215
- context,
216
- });
217
- }
218
-
219
- /**
220
- * Get all collected log entries
221
- */
222
- getLogs(): readonly LogEntry[] {
223
- return [...this.logs];
224
- }
225
-
226
- /**
227
- * Get logs filtered by level
228
- */
229
- getLogsByLevel(level: LogLevel): readonly LogEntry[] {
230
- return this.logs.filter(log => log.level === level);
231
- }
232
-
233
- /**
234
- * Clear all collected logs
235
- */
236
- clear(): void {
237
- this.logs = [];
238
- }
239
-
240
- /**
241
- * Get count of logs by level
242
- */
243
- getCount(level?: LogLevel): number {
244
- if (level) {
245
- return this.logs.filter(log => log.level === level).length;
246
- }
247
- return this.logs.length;
248
- }
249
- }
250
-
251
- /**
252
- * Default logger instance
253
- * Delegates to the global logger, respecting setGlobalLogger() and environment variables
254
- */
255
- export const defaultLogger: ILogger = {
256
- debug(message: string, context?: Record<string, any>): void {
257
- getGlobalLogger().debug(message, context);
258
- },
259
- info(message: string, context?: Record<string, any>): void {
260
- getGlobalLogger().info(message, context);
261
- },
262
- warn(message: string, context?: Record<string, any>): void {
263
- getGlobalLogger().warn(message, context);
264
- },
265
- error(message: string, context?: Record<string, any>): void {
266
- getGlobalLogger().error(message, context);
267
- },
268
- };
269
-
270
- /**
271
- * Creates a scoped logger that adds source information
272
- * @param logger - Base logger
273
- * @param source - Source component name
274
- * @returns Scoped logger with source context
275
- */
276
- export function createScopedLogger(logger: ILogger, source: string): ILogger {
277
- return {
278
- debug(message: string, context?: Record<string, any>): void {
279
- logger.debug(message, { ...context, source });
280
- },
281
- info(message: string, context?: Record<string, any>): void {
282
- logger.info(message, { ...context, source });
283
- },
284
- warn(message: string, context?: Record<string, any>): void {
285
- logger.warn(message, { ...context, source });
286
- },
287
- error(message: string, context?: Record<string, any>): void {
288
- logger.error(message, { ...context, source });
289
- },
290
- };
291
- }
292
-
293
- /**
294
- * Parse log level from string
295
- * @param level - Log level string (case-insensitive)
296
- * @returns LogLevel or undefined if invalid
297
- */
298
- function parseLogLevel(level: string | undefined): LogLevel | undefined {
299
- if (!level) return undefined;
300
- const normalized = level.toLowerCase();
301
- switch (normalized) {
302
- case 'debug': return LogLevel.DEBUG;
303
- case 'info': return LogLevel.INFO;
304
- case 'warn': return LogLevel.WARN;
305
- case 'error': return LogLevel.ERROR;
306
- default: return undefined;
307
- }
308
- }
309
-
310
- /**
311
- * Create a logger based on environment variables
312
- *
313
- * Environment variables (in order of precedence):
314
- * - DEBUG=docxmlater or DEBUG=docxmlater:* - Enables DEBUG level
315
- * - DOCXMLATER_LOG_LEVEL=debug|info|warn|error|silent - Sets specific level
316
- *
317
- * @returns Logger configured from environment, or SilentLogger if not configured
318
- */
319
- function createLoggerFromEnv(): ILogger {
320
- // Check DEBUG environment variable first (highest precedence for debug mode)
321
- const debugEnv = process.env.DEBUG || '';
322
- if (debugEnv.includes('docxmlater')) {
323
- return new ConsoleLogger(LogLevel.DEBUG);
324
- }
325
-
326
- // Check DOCXMLATER_LOG_LEVEL environment variable
327
- const envLevel = process.env.DOCXMLATER_LOG_LEVEL?.toLowerCase();
328
- if (envLevel === 'silent') {
329
- return new SilentLogger();
330
- }
331
-
332
- const parsedLevel = parseLogLevel(envLevel);
333
- if (parsedLevel) {
334
- return new ConsoleLogger(parsedLevel);
335
- }
336
-
337
- // Default: silent (no logging unless explicitly enabled)
338
- return new SilentLogger();
339
- }
340
-
341
- // Global logger instance - initialized from environment
342
- let globalLogger: ILogger = createLoggerFromEnv();
343
-
344
- /**
345
- * Set the global logger instance
346
- * Use this to configure logging programmatically
347
- *
348
- * @example
349
- * ```typescript
350
- * import { setGlobalLogger, ConsoleLogger, LogLevel } from 'docxmlater';
351
- *
352
- * // Enable info-level logging
353
- * setGlobalLogger(new ConsoleLogger(LogLevel.INFO));
354
- * ```
355
- *
356
- * @param logger - Logger instance to use globally
357
- */
358
- export function setGlobalLogger(logger: ILogger): void {
359
- globalLogger = logger;
360
- }
361
-
362
- /**
363
- * Get the global logger instance
364
- * Used internally by framework components
365
- *
366
- * @returns Current global logger
367
- */
368
- export function getGlobalLogger(): ILogger {
369
- return globalLogger;
370
- }
371
-
372
- /**
373
- * Reset the global logger to its default (environment-based) configuration
374
- * Useful for testing cleanup
375
- */
376
- export function resetGlobalLogger(): void {
377
- globalLogger = createLoggerFromEnv();
378
- }
379
-
380
- /**
381
- * Creates a component-scoped logger using the global logger.
382
- * This is a convenience function that combines getGlobalLogger() and createScopedLogger()
383
- * into a single call, reducing boilerplate in component files.
384
- *
385
- * @param componentName - Name of the component (appears in log output)
386
- * @returns Scoped logger instance
387
- *
388
- * @example
389
- * ```typescript
390
- * // Instead of:
391
- * function getLogger(): ILogger {
392
- * return createScopedLogger(getGlobalLogger(), 'MyComponent');
393
- * }
394
- *
395
- * // You can use:
396
- * const logger = createComponentLogger('MyComponent');
397
- *
398
- * // Or for lazy initialization:
399
- * const getLogger = () => createComponentLogger('MyComponent');
400
- * ```
401
- */
402
- export function createComponentLogger(componentName: string): ILogger {
403
- return createScopedLogger(getGlobalLogger(), componentName);
404
- }
1
+ /**
2
+ * Logging interface for docXMLater
3
+ * Allows library consumers to control logging behavior
4
+ */
5
+
6
+ /**
7
+ * Log severity levels
8
+ */
9
+ export enum LogLevel {
10
+ /** Debugging information (most verbose) */
11
+ DEBUG = 'debug',
12
+ /** Informational messages */
13
+ INFO = 'info',
14
+ /** Warning messages - potential issues that don't prevent operation */
15
+ WARN = 'warn',
16
+ /** Error messages - serious issues that may cause failures */
17
+ ERROR = 'error',
18
+ }
19
+
20
+ /**
21
+ * Log entry structure
22
+ */
23
+ export interface LogEntry {
24
+ /** Timestamp when log was created */
25
+ timestamp: Date;
26
+ /** Severity level */
27
+ level: LogLevel;
28
+ /** Log message */
29
+ message: string;
30
+ /** Optional context data */
31
+ context?: Record<string, any>;
32
+ /** Source component that generated the log */
33
+ source?: string;
34
+ }
35
+
36
+ /**
37
+ * Logger interface that consumers can implement
38
+ * Provides full control over how logs are handled
39
+ */
40
+ export interface ILogger {
41
+ /**
42
+ * Log a debug message
43
+ * @param message - Debug message
44
+ * @param context - Optional context data
45
+ */
46
+ debug(message: string, context?: Record<string, any>): void;
47
+
48
+ /**
49
+ * Log an informational message
50
+ * @param message - Info message
51
+ * @param context - Optional context data
52
+ */
53
+ info(message: string, context?: Record<string, any>): void;
54
+
55
+ /**
56
+ * Log a warning message
57
+ * @param message - Warning message
58
+ * @param context - Optional context data
59
+ */
60
+ warn(message: string, context?: Record<string, any>): void;
61
+
62
+ /**
63
+ * Log an error message
64
+ * @param message - Error message
65
+ * @param context - Optional context data
66
+ */
67
+ error(message: string, context?: Record<string, any>): void;
68
+ }
69
+
70
+ /**
71
+ * Console-based logger implementation
72
+ * Uses standard console methods for output with timestamps and source prefixes
73
+ */
74
+ export class ConsoleLogger implements ILogger {
75
+ private showTimestamp: boolean;
76
+
77
+ constructor(
78
+ private minLevel: LogLevel = LogLevel.WARN,
79
+ options?: { showTimestamp?: boolean }
80
+ ) {
81
+ this.showTimestamp = options?.showTimestamp ?? true;
82
+ }
83
+
84
+ debug(message: string, context?: Record<string, any>): void {
85
+ if (this.shouldLog(LogLevel.DEBUG)) {
86
+ console.debug(this.formatMessage(LogLevel.DEBUG, message, context));
87
+ }
88
+ }
89
+
90
+ info(message: string, context?: Record<string, any>): void {
91
+ if (this.shouldLog(LogLevel.INFO)) {
92
+ console.info(this.formatMessage(LogLevel.INFO, message, context));
93
+ }
94
+ }
95
+
96
+ warn(message: string, context?: Record<string, any>): void {
97
+ if (this.shouldLog(LogLevel.WARN)) {
98
+ console.warn(this.formatMessage(LogLevel.WARN, message, context));
99
+ }
100
+ }
101
+
102
+ error(message: string, context?: Record<string, any>): void {
103
+ if (this.shouldLog(LogLevel.ERROR)) {
104
+ console.error(this.formatMessage(LogLevel.ERROR, message, context));
105
+ }
106
+ }
107
+
108
+ private shouldLog(level: LogLevel): boolean {
109
+ const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
110
+ const minIndex = levels.indexOf(this.minLevel);
111
+ const currentIndex = levels.indexOf(level);
112
+ return currentIndex >= minIndex;
113
+ }
114
+
115
+ private formatMessage(level: LogLevel, message: string, context?: Record<string, any>): string {
116
+ const parts: string[] = [];
117
+
118
+ // Add timestamp if enabled
119
+ if (this.showTimestamp) {
120
+ const timestamp = new Date().toISOString().slice(11, 23); // HH:mm:ss.SSS
121
+ parts.push(timestamp);
122
+ }
123
+
124
+ // Add level tag
125
+ parts.push(`[${level.toUpperCase().padEnd(5)}]`);
126
+
127
+ // Add source if present
128
+ if (context?.source) {
129
+ parts.push(`[${context.source}]`);
130
+ }
131
+
132
+ // Add message
133
+ parts.push(message);
134
+
135
+ // Add context (excluding source which is already shown)
136
+ if (context && Object.keys(context).length > 0) {
137
+ const contextWithoutSource = { ...context };
138
+ delete contextWithoutSource.source;
139
+ if (Object.keys(contextWithoutSource).length > 0) {
140
+ // Format context as key=value pairs for readability
141
+ const contextStr = this.formatContext(contextWithoutSource);
142
+ if (contextStr) {
143
+ parts.push(contextStr);
144
+ }
145
+ }
146
+ }
147
+
148
+ return parts.join(' ');
149
+ }
150
+
151
+ private formatContext(context: Record<string, any>): string {
152
+ const pairs: string[] = [];
153
+ for (const [key, value] of Object.entries(context)) {
154
+ if (value === undefined || value === null) continue;
155
+ if (typeof value === 'object' && !Array.isArray(value)) {
156
+ // Nested object - use compact JSON
157
+ pairs.push(`${key}=${JSON.stringify(value)}`);
158
+ } else if (Array.isArray(value)) {
159
+ pairs.push(`${key}=[${value.length}]`);
160
+ } else {
161
+ pairs.push(`${key}=${value}`);
162
+ }
163
+ }
164
+ return pairs.length > 0 ? pairs.join(' ') : '';
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Silent logger that discards all log messages
170
+ * Useful for testing or when logging is not desired
171
+ */
172
+ export class SilentLogger implements ILogger {
173
+ debug(): void {
174
+ // No-op
175
+ }
176
+
177
+ info(): void {
178
+ // No-op
179
+ }
180
+
181
+ warn(): void {
182
+ // No-op
183
+ }
184
+
185
+ error(): void {
186
+ // No-op
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Collecting logger that stores log entries in memory
192
+ * Useful for testing and diagnostics
193
+ */
194
+ export class CollectingLogger implements ILogger {
195
+ private logs: LogEntry[] = [];
196
+
197
+ debug(message: string, context?: Record<string, any>): void {
198
+ this.addLog(LogLevel.DEBUG, message, context);
199
+ }
200
+
201
+ info(message: string, context?: Record<string, any>): void {
202
+ this.addLog(LogLevel.INFO, message, context);
203
+ }
204
+
205
+ warn(message: string, context?: Record<string, any>): void {
206
+ this.addLog(LogLevel.WARN, message, context);
207
+ }
208
+
209
+ error(message: string, context?: Record<string, any>): void {
210
+ this.addLog(LogLevel.ERROR, message, context);
211
+ }
212
+
213
+ private addLog(level: LogLevel, message: string, context?: Record<string, any>): void {
214
+ this.logs.push({
215
+ timestamp: new Date(),
216
+ level,
217
+ message,
218
+ context,
219
+ });
220
+ }
221
+
222
+ /**
223
+ * Get all collected log entries
224
+ */
225
+ getLogs(): readonly LogEntry[] {
226
+ return [...this.logs];
227
+ }
228
+
229
+ /**
230
+ * Get logs filtered by level
231
+ */
232
+ getLogsByLevel(level: LogLevel): readonly LogEntry[] {
233
+ return this.logs.filter((log) => log.level === level);
234
+ }
235
+
236
+ /**
237
+ * Clear all collected logs
238
+ */
239
+ clear(): void {
240
+ this.logs = [];
241
+ }
242
+
243
+ /**
244
+ * Get count of logs by level
245
+ */
246
+ getCount(level?: LogLevel): number {
247
+ if (level) {
248
+ return this.logs.filter((log) => log.level === level).length;
249
+ }
250
+ return this.logs.length;
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Default logger instance
256
+ * Delegates to the global logger, respecting setGlobalLogger() and environment variables
257
+ */
258
+ export const defaultLogger: ILogger = {
259
+ debug(message: string, context?: Record<string, any>): void {
260
+ getGlobalLogger().debug(message, context);
261
+ },
262
+ info(message: string, context?: Record<string, any>): void {
263
+ getGlobalLogger().info(message, context);
264
+ },
265
+ warn(message: string, context?: Record<string, any>): void {
266
+ getGlobalLogger().warn(message, context);
267
+ },
268
+ error(message: string, context?: Record<string, any>): void {
269
+ getGlobalLogger().error(message, context);
270
+ },
271
+ };
272
+
273
+ /**
274
+ * Creates a scoped logger that adds source information
275
+ * @param logger - Base logger
276
+ * @param source - Source component name
277
+ * @returns Scoped logger with source context
278
+ */
279
+ export function createScopedLogger(logger: ILogger, source: string): ILogger {
280
+ return {
281
+ debug(message: string, context?: Record<string, any>): void {
282
+ logger.debug(message, { ...context, source });
283
+ },
284
+ info(message: string, context?: Record<string, any>): void {
285
+ logger.info(message, { ...context, source });
286
+ },
287
+ warn(message: string, context?: Record<string, any>): void {
288
+ logger.warn(message, { ...context, source });
289
+ },
290
+ error(message: string, context?: Record<string, any>): void {
291
+ logger.error(message, { ...context, source });
292
+ },
293
+ };
294
+ }
295
+
296
+ /**
297
+ * Parse log level from string
298
+ * @param level - Log level string (case-insensitive)
299
+ * @returns LogLevel or undefined if invalid
300
+ */
301
+ function parseLogLevel(level: string | undefined): LogLevel | undefined {
302
+ if (!level) return undefined;
303
+ const normalized = level.toLowerCase();
304
+ switch (normalized) {
305
+ case 'debug':
306
+ return LogLevel.DEBUG;
307
+ case 'info':
308
+ return LogLevel.INFO;
309
+ case 'warn':
310
+ return LogLevel.WARN;
311
+ case 'error':
312
+ return LogLevel.ERROR;
313
+ default:
314
+ return undefined;
315
+ }
316
+ }
317
+
318
+ /**
319
+ * Create a logger based on environment variables
320
+ *
321
+ * Environment variables (in order of precedence):
322
+ * - DEBUG=docxmlater or DEBUG=docxmlater:* - Enables DEBUG level
323
+ * - DOCXMLATER_LOG_LEVEL=debug|info|warn|error|silent - Sets specific level
324
+ *
325
+ * @returns Logger configured from environment, or SilentLogger if not configured
326
+ */
327
+ function createLoggerFromEnv(): ILogger {
328
+ // Check DEBUG environment variable first (highest precedence for debug mode)
329
+ const debugEnv = process.env.DEBUG || '';
330
+ if (debugEnv.includes('docxmlater')) {
331
+ return new ConsoleLogger(LogLevel.DEBUG);
332
+ }
333
+
334
+ // Check DOCXMLATER_LOG_LEVEL environment variable
335
+ const envLevel = process.env.DOCXMLATER_LOG_LEVEL?.toLowerCase();
336
+ if (envLevel === 'silent') {
337
+ return new SilentLogger();
338
+ }
339
+
340
+ const parsedLevel = parseLogLevel(envLevel);
341
+ if (parsedLevel) {
342
+ return new ConsoleLogger(parsedLevel);
343
+ }
344
+
345
+ // Default: silent (no logging unless explicitly enabled)
346
+ return new SilentLogger();
347
+ }
348
+
349
+ // Global logger instance - initialized from environment
350
+ let globalLogger: ILogger = createLoggerFromEnv();
351
+
352
+ /**
353
+ * Set the global logger instance
354
+ * Use this to configure logging programmatically
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * import { setGlobalLogger, ConsoleLogger, LogLevel } from 'docxmlater';
359
+ *
360
+ * // Enable info-level logging
361
+ * setGlobalLogger(new ConsoleLogger(LogLevel.INFO));
362
+ * ```
363
+ *
364
+ * @param logger - Logger instance to use globally
365
+ */
366
+ export function setGlobalLogger(logger: ILogger): void {
367
+ globalLogger = logger;
368
+ }
369
+
370
+ /**
371
+ * Get the global logger instance
372
+ * Used internally by framework components
373
+ *
374
+ * @returns Current global logger
375
+ */
376
+ export function getGlobalLogger(): ILogger {
377
+ return globalLogger;
378
+ }
379
+
380
+ /**
381
+ * Reset the global logger to its default (environment-based) configuration
382
+ * Useful for testing cleanup
383
+ */
384
+ export function resetGlobalLogger(): void {
385
+ globalLogger = createLoggerFromEnv();
386
+ }
387
+
388
+ /**
389
+ * Creates a component-scoped logger using the global logger.
390
+ * This is a convenience function that combines getGlobalLogger() and createScopedLogger()
391
+ * into a single call, reducing boilerplate in component files.
392
+ *
393
+ * @param componentName - Name of the component (appears in log output)
394
+ * @returns Scoped logger instance
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * // Instead of:
399
+ * function getLogger(): ILogger {
400
+ * return createScopedLogger(getGlobalLogger(), 'MyComponent');
401
+ * }
402
+ *
403
+ * // You can use:
404
+ * const logger = createComponentLogger('MyComponent');
405
+ *
406
+ * // Or for lazy initialization:
407
+ * const getLogger = () => createComponentLogger('MyComponent');
408
+ * ```
409
+ */
410
+ export function createComponentLogger(componentName: string): ILogger {
411
+ return createScopedLogger(getGlobalLogger(), componentName);
412
+ }