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 +1 @@
1
- {"version":3,"file":"RevisionContent.js","sourceRoot":"","sources":["../../src/elements/RevisionContent.ts"],"names":[],"mappings":";;AAiCA,oCAQC;AAUD,gDAKC;AAWD,8CAKC;AAvCD,SAAgB,YAAY,CAAC,OAAwB;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,MAAM,UAAU,GAAG,OAAQ,OAAe,CAAC,OAAO,KAAK,UAAU,CAAC;IAClE,MAAM,SAAS,GAAG,OAAQ,OAAe,CAAC,MAAM,KAAK,UAAU,CAAC;IAEhE,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC;AAClC,CAAC;AAUD,SAAgB,kBAAkB,CAAC,OAAwB;IACzD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,OAAO,OAAQ,OAAe,CAAC,MAAM,KAAK,UAAU,CAAC;AACvD,CAAC;AAWD,SAAgB,iBAAiB,CAAC,OAAwB;IACxD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,OAAO,OAAQ,OAAe,CAAC,eAAe,KAAK,UAAU,CAAC;AAChE,CAAC","sourcesContent":["/**\r\n * RevisionContent - Defines valid content types for tracked changes (revisions)\r\n *\r\n * Per ECMA-376, w:ins and w:del elements can contain:\r\n * - w:r (runs) - Text with formatting\r\n * - w:r with w:drawing (image runs) - Images embedded in runs\r\n * - w:hyperlink - Hyperlinks with nested runs\r\n *\r\n * This module provides the type definitions and type guards for revision content.\r\n */\r\n\r\nimport type { Run } from './Run';\r\nimport type { Hyperlink } from './Hyperlink';\r\nimport type { ImageRun } from './ImageRun';\r\n\r\n/**\r\n * Content types valid within a revision (tracked change)\r\n *\r\n * Per ECMA-376 Part 1 section 17.13.5, revision elements can contain:\r\n * - Run elements (w:r) - the most common case\r\n * - ImageRun elements (w:r with w:drawing) - for tracked image changes\r\n * - Hyperlink elements (w:hyperlink) - for tracked hyperlink changes\r\n */\r\nexport type RevisionContent = Run | ImageRun | Hyperlink;\r\n\r\n/**\r\n * Type guard to check if content is a Run\r\n * @param content - The content to check\r\n * @returns true if content is a Run instance\r\n *\r\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\r\n * Run objects have getText() but NOT getUrl() or getAnchor() methods.\r\n */\r\nexport function isRunContent(content: RevisionContent): content is Run {\r\n if (!content || typeof content !== 'object') return false;\r\n\r\n // Duck typing: Runs have getText but no getUrl\r\n const hasGetText = typeof (content as any).getText === 'function';\r\n const hasGetUrl = typeof (content as any).getUrl === 'function';\r\n\r\n return hasGetText && !hasGetUrl;\r\n}\r\n\r\n/**\r\n * Type guard to check if content is a Hyperlink\r\n * @param content - The content to check\r\n * @returns true if content is a Hyperlink instance\r\n *\r\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\r\n * Hyperlink objects have getUrl() method which Runs don't have.\r\n */\r\nexport function isHyperlinkContent(content: RevisionContent): content is Hyperlink {\r\n if (!content || typeof content !== 'object') return false;\r\n\r\n // Duck typing: Hyperlinks have getUrl method\r\n return typeof (content as any).getUrl === 'function';\r\n}\r\n\r\n/**\r\n * Type guard to check if content is an ImageRun\r\n * @param content - The content to check\r\n * @returns true if content is an ImageRun instance\r\n *\r\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\r\n * ImageRun objects have getImageElement() method which regular Runs don't have.\r\n * This check should be performed BEFORE isRunContent() since ImageRun extends Run.\r\n */\r\nexport function isImageRunContent(content: RevisionContent): content is ImageRun {\r\n if (!content || typeof content !== 'object') return false;\r\n\r\n // Duck typing: ImageRun has getImageElement method which regular Run doesn't have\r\n return typeof (content as any).getImageElement === 'function';\r\n}\r\n"]}
1
+ {"version":3,"file":"RevisionContent.js","sourceRoot":"","sources":["../../src/elements/RevisionContent.ts"],"names":[],"mappings":";;AAiCA,oCAQC;AAUD,gDAKC;AAWD,8CAKC;AAvCD,SAAgB,YAAY,CAAC,OAAwB;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,MAAM,UAAU,GAAG,OAAQ,OAAe,CAAC,OAAO,KAAK,UAAU,CAAC;IAClE,MAAM,SAAS,GAAG,OAAQ,OAAe,CAAC,MAAM,KAAK,UAAU,CAAC;IAEhE,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC;AAClC,CAAC;AAUD,SAAgB,kBAAkB,CAAC,OAAwB;IACzD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,OAAO,OAAQ,OAAe,CAAC,MAAM,KAAK,UAAU,CAAC;AACvD,CAAC;AAWD,SAAgB,iBAAiB,CAAC,OAAwB;IACxD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAG1D,OAAO,OAAQ,OAAe,CAAC,eAAe,KAAK,UAAU,CAAC;AAChE,CAAC","sourcesContent":["/**\n * RevisionContent - Defines valid content types for tracked changes (revisions)\n *\n * Per ECMA-376, w:ins and w:del elements can contain:\n * - w:r (runs) - Text with formatting\n * - w:r with w:drawing (image runs) - Images embedded in runs\n * - w:hyperlink - Hyperlinks with nested runs\n *\n * This module provides the type definitions and type guards for revision content.\n */\n\nimport type { Run } from './Run';\nimport type { Hyperlink } from './Hyperlink';\nimport type { ImageRun } from './ImageRun';\n\n/**\n * Content types valid within a revision (tracked change)\n *\n * Per ECMA-376 Part 1 section 17.13.5, revision elements can contain:\n * - Run elements (w:r) - the most common case\n * - ImageRun elements (w:r with w:drawing) - for tracked image changes\n * - Hyperlink elements (w:hyperlink) - for tracked hyperlink changes\n */\nexport type RevisionContent = Run | ImageRun | Hyperlink;\n\n/**\n * Type guard to check if content is a Run\n * @param content - The content to check\n * @returns true if content is a Run instance\n *\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\n * Run objects have getText() but NOT getUrl() or getAnchor() methods.\n */\nexport function isRunContent(content: RevisionContent): content is Run {\n if (!content || typeof content !== 'object') return false;\n\n // Duck typing: Runs have getText but no getUrl\n const hasGetText = typeof (content as any).getText === 'function';\n const hasGetUrl = typeof (content as any).getUrl === 'function';\n\n return hasGetText && !hasGetUrl;\n}\n\n/**\n * Type guard to check if content is a Hyperlink\n * @param content - The content to check\n * @returns true if content is a Hyperlink instance\n *\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\n * Hyperlink objects have getUrl() method which Runs don't have.\n */\nexport function isHyperlinkContent(content: RevisionContent): content is Hyperlink {\n if (!content || typeof content !== 'object') return false;\n\n // Duck typing: Hyperlinks have getUrl method\n return typeof (content as any).getUrl === 'function';\n}\n\n/**\n * Type guard to check if content is an ImageRun\n * @param content - The content to check\n * @returns true if content is an ImageRun instance\n *\n * Note: Uses duck typing instead of constructor.name to handle minified builds.\n * ImageRun objects have getImageElement() method which regular Runs don't have.\n * This check should be performed BEFORE isRunContent() since ImageRun extends Run.\n */\nexport function isImageRunContent(content: RevisionContent): content is ImageRun {\n if (!content || typeof content !== 'object') return false;\n\n // Duck typing: ImageRun has getImageElement method which regular Run doesn't have\n return typeof (content as any).getImageElement === 'function';\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RevisionManager.d.ts","sourceRoot":"","sources":["../../src/elements/RevisionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RevisionManager.d.ts","sourceRoot":"","sources":["../../src/elements/RevisionManager.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ class RevisionManager {
33
33
  logger.debug('Revision registered', {
34
34
  id: revision.getId(),
35
35
  type: revision.getType(),
36
- author: revision.getAuthor()
36
+ author: revision.getAuthor(),
37
37
  });
38
38
  return revision;
39
39
  }
@@ -51,7 +51,7 @@ class RevisionManager {
51
51
  logger.debug('Existing revision registered', {
52
52
  id: existingId,
53
53
  type: revision.getType(),
54
- author: revision.getAuthor()
54
+ author: revision.getAuthor(),
55
55
  });
56
56
  return revision;
57
57
  }
@@ -62,7 +62,7 @@ class RevisionManager {
62
62
  if (this.revisionsByTypeCache.has(type)) {
63
63
  return [...this.revisionsByTypeCache.get(type)];
64
64
  }
65
- const result = this.revisions.filter(rev => rev.getType() === type);
65
+ const result = this.revisions.filter((rev) => rev.getType() === type);
66
66
  this.revisionsByTypeCache.set(type, result);
67
67
  return [...result];
68
68
  }
@@ -70,7 +70,7 @@ class RevisionManager {
70
70
  if (this.revisionsByAuthorCache.has(author)) {
71
71
  return [...this.revisionsByAuthorCache.get(author)];
72
72
  }
73
- const result = this.revisions.filter(rev => rev.getAuthor() === author);
73
+ const result = this.revisions.filter((rev) => rev.getAuthor() === author);
74
74
  this.revisionsByAuthorCache.set(author, result);
75
75
  return [...result];
76
76
  }
@@ -109,9 +109,10 @@ class RevisionManager {
109
109
  }
110
110
  findRevisionsByText(searchText) {
111
111
  const lowerSearch = searchText.toLowerCase();
112
- return this.revisions.filter(revision => {
113
- const text = revision.getRuns()
114
- .map(run => run.getText())
112
+ return this.revisions.filter((revision) => {
113
+ const text = revision
114
+ .getRuns()
115
+ .map((run) => run.getText())
115
116
  .join('')
116
117
  .toLowerCase();
117
118
  return text.includes(lowerSearch);
@@ -133,7 +134,7 @@ class RevisionManager {
133
134
  return this.getRevisionsByType('tablePropertiesChange');
134
135
  }
135
136
  getAllMoves() {
136
- return this.revisions.filter(rev => rev.getType() === 'moveFrom' || rev.getType() === 'moveTo');
137
+ return this.revisions.filter((rev) => rev.getType() === 'moveFrom' || rev.getType() === 'moveTo');
137
138
  }
138
139
  getAllMoveFrom() {
139
140
  return this.getRevisionsByType('moveFrom');
@@ -142,7 +143,7 @@ class RevisionManager {
142
143
  return this.getRevisionsByType('moveTo');
143
144
  }
144
145
  getAllTableCellChanges() {
145
- return this.revisions.filter(rev => rev.getType() === 'tableCellInsert' ||
146
+ return this.revisions.filter((rev) => rev.getType() === 'tableCellInsert' ||
146
147
  rev.getType() === 'tableCellDelete' ||
147
148
  rev.getType() === 'tableCellMerge');
148
149
  }
@@ -150,7 +151,7 @@ class RevisionManager {
150
151
  return this.getRevisionsByType('numberingChange');
151
152
  }
152
153
  getAllPropertyChanges() {
153
- return this.revisions.filter(rev => rev.getType() === 'runPropertiesChange' ||
154
+ return this.revisions.filter((rev) => rev.getType() === 'runPropertiesChange' ||
154
155
  rev.getType() === 'paragraphPropertiesChange' ||
155
156
  rev.getType() === 'tablePropertiesChange' ||
156
157
  rev.getType() === 'tableRowPropertiesChange' ||
@@ -159,8 +160,8 @@ class RevisionManager {
159
160
  rev.getType() === 'numberingChange');
160
161
  }
161
162
  getMovePair(moveId) {
162
- const moveFrom = this.revisions.find(rev => rev.getType() === 'moveFrom' && rev.getMoveId() === moveId);
163
- const moveTo = this.revisions.find(rev => rev.getType() === 'moveTo' && rev.getMoveId() === moveId);
163
+ const moveFrom = this.revisions.find((rev) => rev.getType() === 'moveFrom' && rev.getMoveId() === moveId);
164
+ const moveTo = this.revisions.find((rev) => rev.getType() === 'moveTo' && rev.getMoveId() === moveId);
164
165
  return { moveFrom, moveTo };
165
166
  }
166
167
  getStats() {
@@ -185,7 +186,7 @@ class RevisionManager {
185
186
  return this.revisions[this.revisions.length - 1];
186
187
  }
187
188
  getRevisionsByDateRange(startDate, endDate) {
188
- return this.revisions.filter(rev => {
189
+ return this.revisions.filter((rev) => {
189
190
  const revDate = rev.getDate();
190
191
  return revDate >= startDate && revDate <= endDate;
191
192
  });
@@ -212,34 +213,34 @@ class RevisionManager {
212
213
  if (this.revisionsByCategoryCache.has(category)) {
213
214
  return [...this.revisionsByCategoryCache.get(category)];
214
215
  }
215
- const result = this.revisions.filter(rev => {
216
+ const result = this.revisions.filter((rev) => {
216
217
  const type = rev.getType();
217
218
  switch (category) {
218
219
  case 'content':
219
- return type === 'insert' ||
220
+ return (type === 'insert' ||
220
221
  type === 'delete' ||
221
222
  type === 'imageChange' ||
222
223
  type === 'fieldChange' ||
223
224
  type === 'commentChange' ||
224
225
  type === 'contentControlChange' ||
225
- type === 'hyperlinkChange';
226
+ type === 'hyperlinkChange');
226
227
  case 'formatting':
227
- return type === 'runPropertiesChange' ||
228
+ return (type === 'runPropertiesChange' ||
228
229
  type === 'paragraphPropertiesChange' ||
229
- type === 'numberingChange';
230
+ type === 'numberingChange');
230
231
  case 'structural':
231
- return type === 'moveFrom' ||
232
+ return (type === 'moveFrom' ||
232
233
  type === 'moveTo' ||
233
234
  type === 'sectionPropertiesChange' ||
234
- type === 'bookmarkChange';
235
+ type === 'bookmarkChange');
235
236
  case 'table':
236
- return type === 'tablePropertiesChange' ||
237
+ return (type === 'tablePropertiesChange' ||
237
238
  type === 'tableExceptionPropertiesChange' ||
238
239
  type === 'tableRowPropertiesChange' ||
239
240
  type === 'tableCellPropertiesChange' ||
240
241
  type === 'tableCellInsert' ||
241
242
  type === 'tableCellDelete' ||
242
- type === 'tableCellMerge';
243
+ type === 'tableCellMerge');
243
244
  default:
244
245
  return false;
245
246
  }
@@ -251,7 +252,7 @@ class RevisionManager {
251
252
  if (paragraphIndex < 0) {
252
253
  return [];
253
254
  }
254
- return this.revisions.filter(rev => {
255
+ return this.revisions.filter((rev) => {
255
256
  const loc = rev.getLocation();
256
257
  if (!loc)
257
258
  return false;
@@ -282,9 +283,7 @@ class RevisionManager {
282
283
  type === 'numberingChange') {
283
284
  byCategory.formatting++;
284
285
  }
285
- else if (type === 'moveFrom' ||
286
- type === 'moveTo' ||
287
- type === 'sectionPropertiesChange') {
286
+ else if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
288
287
  byCategory.structural++;
289
288
  }
290
289
  else if (type === 'tablePropertiesChange' ||
@@ -316,16 +315,16 @@ class RevisionManager {
316
315
  ins: summary.byType.insertions,
317
316
  del: summary.byType.deletions,
318
317
  fmt: summary.byType.propertyChanges,
319
- authors: summary.authors.length
318
+ authors: summary.authors.length,
320
319
  });
321
320
  }
322
321
  return summary;
323
322
  }
324
323
  getById(id) {
325
- return this.revisions.find(rev => rev.getId() === id);
324
+ return this.revisions.find((rev) => rev.getId() === id);
326
325
  }
327
326
  removeById(id) {
328
- const index = this.revisions.findIndex(rev => rev.getId() === id);
327
+ const index = this.revisions.findIndex((rev) => rev.getId() === id);
329
328
  if (index === -1)
330
329
  return false;
331
330
  this.revisions.splice(index, 1);
@@ -333,7 +332,7 @@ class RevisionManager {
333
332
  return true;
334
333
  }
335
334
  getMatching(criteria) {
336
- return this.revisions.filter(rev => {
335
+ return this.revisions.filter((rev) => {
337
336
  if (criteria.types && !criteria.types.includes(rev.getType())) {
338
337
  return false;
339
338
  }
@@ -365,9 +364,7 @@ class RevisionManager {
365
364
  type === 'numberingChange') {
366
365
  return 'formatting';
367
366
  }
368
- if (type === 'moveFrom' ||
369
- type === 'moveTo' ||
370
- type === 'sectionPropertiesChange') {
367
+ if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {
371
368
  return 'structural';
372
369
  }
373
370
  if (type === 'tablePropertiesChange' ||
@@ -382,7 +379,7 @@ class RevisionManager {
382
379
  return 'content';
383
380
  }
384
381
  getRevisionsForRun(paragraphIndex, runIndex) {
385
- return this.revisions.filter(rev => {
382
+ return this.revisions.filter((rev) => {
386
383
  const loc = rev.getLocation();
387
384
  if (!loc)
388
385
  return false;
@@ -390,28 +387,23 @@ class RevisionManager {
390
387
  });
391
388
  }
392
389
  getRevisionsByLocation(criteria) {
393
- return this.revisions.filter(rev => {
390
+ return this.revisions.filter((rev) => {
394
391
  const loc = rev.getLocation();
395
392
  if (!loc)
396
393
  return false;
397
- if (criteria.paragraphIndex !== undefined &&
398
- loc.paragraphIndex !== criteria.paragraphIndex) {
394
+ if (criteria.paragraphIndex !== undefined && loc.paragraphIndex !== criteria.paragraphIndex) {
399
395
  return false;
400
396
  }
401
- if (criteria.runIndex !== undefined &&
402
- loc.runIndex !== criteria.runIndex) {
397
+ if (criteria.runIndex !== undefined && loc.runIndex !== criteria.runIndex) {
403
398
  return false;
404
399
  }
405
- if (criteria.tableRow !== undefined &&
406
- loc.tableRow !== criteria.tableRow) {
400
+ if (criteria.tableRow !== undefined && loc.tableRow !== criteria.tableRow) {
407
401
  return false;
408
402
  }
409
- if (criteria.tableCell !== undefined &&
410
- loc.tableCell !== criteria.tableCell) {
403
+ if (criteria.tableCell !== undefined && loc.tableCell !== criteria.tableCell) {
411
404
  return false;
412
405
  }
413
- if (criteria.sectionIndex !== undefined &&
414
- loc.sectionIndex !== criteria.sectionIndex) {
406
+ if (criteria.sectionIndex !== undefined && loc.sectionIndex !== criteria.sectionIndex) {
415
407
  return false;
416
408
  }
417
409
  if (criteria.headerFooterType !== undefined &&
@@ -422,10 +414,10 @@ class RevisionManager {
422
414
  });
423
415
  }
424
416
  getRevisionsWithLocation() {
425
- return this.revisions.filter(rev => rev.getLocation() !== undefined);
417
+ return this.revisions.filter((rev) => rev.getLocation() !== undefined);
426
418
  }
427
419
  getRevisionsWithoutLocation() {
428
- return this.revisions.filter(rev => rev.getLocation() === undefined);
420
+ return this.revisions.filter((rev) => rev.getLocation() === undefined);
429
421
  }
430
422
  validateRevisionIds() {
431
423
  const seen = new Set();
@@ -487,7 +479,7 @@ class RevisionManager {
487
479
  getHighestId() {
488
480
  if (this.revisions.length === 0)
489
481
  return -1;
490
- return Math.max(...this.revisions.map(r => r.getId()));
482
+ return Math.max(...this.revisions.map((r) => r.getId()));
491
483
  }
492
484
  syncNextId() {
493
485
  const highestId = this.getHighestId();
@@ -1 +1 @@
1
- {"version":3,"file":"RevisionManager.js","sourceRoot":"","sources":["../../src/elements/RevisionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * RevisionManager - Manages tracked changes (revisions) in a document\r\n *\r\n * Tracks all revisions, assigns unique IDs, and provides statistics.\r\n */\r\n\r\nimport { Revision, RevisionType } from './Revision';\r\nimport type { RevisionLocation } from './PropertyChangeTypes';\r\nimport { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger';\r\n\r\n// Scoped logger for RevisionManager\r\nfunction getLogger(): ILogger {\r\n return createScopedLogger(getGlobalLogger(), 'RevisionManager');\r\n}\r\n\r\n/**\r\n * Type for the centralized ID provider callback.\r\n * Returns the next available annotation ID from a shared counter.\r\n */\r\nexport type IdProviderCallback = () => number;\r\n\r\n/**\r\n * Type for callback to notify of existing IDs (for synchronization).\r\n * Called when registering existing revisions to keep the central counter in sync.\r\n */\r\nexport type IdExistsCallback = (existingId: number) => void;\r\n\r\n/**\r\n * Semantic category for grouping revisions.\r\n */\r\nexport type RevisionCategory =\r\n | 'content' // Text insertions, deletions\r\n | 'formatting' // Run/paragraph property changes\r\n | 'structural' // Moves, section changes\r\n | 'table'; // Table structure changes\r\n\r\n/**\r\n * Summary statistics for revisions.\r\n */\r\nexport interface RevisionSummary {\r\n total: number;\r\n byType: {\r\n insertions: number;\r\n deletions: number;\r\n moves: number;\r\n propertyChanges: number;\r\n tableChanges: number;\r\n };\r\n byCategory: Record<RevisionCategory, number>;\r\n authors: string[];\r\n dateRange: { earliest: Date; latest: Date } | null;\r\n}\r\n\r\n/**\r\n * Manages document revisions (track changes)\r\n *\r\n * Per ECMA-376, revision IDs must be unique across ALL annotation types\r\n * in a document. Use setIdProvider() to connect to a centralized ID allocator.\r\n */\r\nexport class RevisionManager {\r\n private revisions: Revision[] = [];\r\n private nextId = 0;\r\n private idProvider: IdProviderCallback | null = null;\r\n private idExistsNotifier: IdExistsCallback | null = null;\r\n\r\n // Performance caching for frequently accessed filtered results\r\n private revisionsByTypeCache = new Map<RevisionType, Revision[]>();\r\n private revisionsByAuthorCache = new Map<string, Revision[]>();\r\n private revisionsByCategoryCache = new Map<RevisionCategory, Revision[]>();\r\n private cacheValid = true;\r\n\r\n /**\r\n * Invalidates all caches. Called when revisions are added/removed.\r\n * @private\r\n */\r\n private invalidateCache(): void {\r\n this.revisionsByTypeCache.clear();\r\n this.revisionsByAuthorCache.clear();\r\n this.revisionsByCategoryCache.clear();\r\n this.cacheValid = false;\r\n }\r\n\r\n /**\r\n * Sets the centralized ID provider callback.\r\n * When set, IDs will be allocated from the centralized DocumentIdManager\r\n * instead of the local nextId counter.\r\n *\r\n * @param provider - Callback that returns the next available ID\r\n * @param existsNotifier - Optional callback to notify when existing IDs are found\r\n */\r\n setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {\r\n this.idProvider = provider;\r\n this.idExistsNotifier = existsNotifier || null;\r\n }\r\n\r\n /**\r\n * Registers a revision with the manager\r\n * Assigns a unique ID\r\n * @param revision - Revision to register\r\n * @returns The registered revision (same instance)\r\n */\r\n register(revision: Revision): Revision {\r\n const logger = getLogger();\r\n // Assign unique ID - use centralized provider if available\r\n const id = this.idProvider ? this.idProvider() : this.nextId++;\r\n revision.setId(id);\r\n\r\n // Store revision\r\n this.revisions.push(revision);\r\n this.invalidateCache();\r\n\r\n logger.debug('Revision registered', {\r\n id: revision.getId(),\r\n type: revision.getType(),\r\n author: revision.getAuthor()\r\n });\r\n\r\n return revision;\r\n }\r\n\r\n /**\r\n * Registers an existing revision (from parsing) with its pre-assigned ID.\r\n * Unlike register(), this does NOT assign a new ID - preserves the original\r\n * ID from parsed XML. Used when loading documents to avoid overwriting\r\n * revision IDs that are already correct.\r\n *\r\n * @param revision - Revision with ID already set from XML parsing\r\n * @returns The registered revision (same instance)\r\n */\r\n registerExisting(revision: Revision): Revision {\r\n const logger = getLogger();\r\n const existingId = revision.getId();\r\n\r\n // Notify centralized ID manager about this existing ID\r\n // This ensures the shared counter stays above all existing IDs\r\n if (this.idExistsNotifier) {\r\n this.idExistsNotifier(existingId);\r\n }\r\n\r\n // Also update local nextId to avoid collisions (fallback when no provider)\r\n if (existingId >= this.nextId) {\r\n this.nextId = existingId + 1;\r\n }\r\n\r\n // Store revision (keep its existing ID - do NOT overwrite)\r\n this.revisions.push(revision);\r\n this.invalidateCache();\r\n\r\n logger.debug('Existing revision registered', {\r\n id: existingId,\r\n type: revision.getType(),\r\n author: revision.getAuthor()\r\n });\r\n\r\n return revision;\r\n }\r\n\r\n /**\r\n * Gets all revisions\r\n * @returns Array of all revisions\r\n */\r\n getAllRevisions(): Revision[] {\r\n return [...this.revisions];\r\n }\r\n\r\n /**\r\n * Gets revisions by type\r\n * Uses caching for improved performance on repeated calls\r\n * @param type - Revision type to filter by\r\n * @returns Array of revisions of the specified type\r\n */\r\n getRevisionsByType(type: RevisionType): Revision[] {\r\n // Check cache first\r\n if (this.revisionsByTypeCache.has(type)) {\r\n return [...this.revisionsByTypeCache.get(type)!];\r\n }\r\n\r\n // Compute and cache\r\n const result = this.revisions.filter(rev => rev.getType() === type);\r\n this.revisionsByTypeCache.set(type, result);\r\n return [...result];\r\n }\r\n\r\n /**\r\n * Gets revisions by author\r\n * Uses caching for improved performance on repeated calls\r\n * @param author - Author name to filter by\r\n * @returns Array of revisions by the specified author\r\n */\r\n getRevisionsByAuthor(author: string): Revision[] {\r\n // Check cache first\r\n if (this.revisionsByAuthorCache.has(author)) {\r\n return [...this.revisionsByAuthorCache.get(author)!];\r\n }\r\n\r\n // Compute and cache\r\n const result = this.revisions.filter(rev => rev.getAuthor() === author);\r\n this.revisionsByAuthorCache.set(author, result);\r\n return [...result];\r\n }\r\n\r\n /**\r\n * Gets the number of revisions\r\n * @returns Number of revisions\r\n */\r\n getCount(): number {\r\n return this.revisions.length;\r\n }\r\n\r\n /**\r\n * Gets the number of insertions\r\n * @returns Number of insertion revisions\r\n */\r\n getInsertionCount(): number {\r\n return this.getRevisionsByType('insert').length;\r\n }\r\n\r\n /**\r\n * Gets the number of deletions\r\n * @returns Number of deletion revisions\r\n */\r\n getDeletionCount(): number {\r\n return this.getRevisionsByType('delete').length;\r\n }\r\n\r\n /**\r\n * Gets all unique authors who have made changes\r\n * @returns Array of unique author names\r\n */\r\n getAuthors(): string[] {\r\n const authorsSet = new Set<string>();\r\n for (const revision of this.revisions) {\r\n authorsSet.add(revision.getAuthor());\r\n }\r\n return Array.from(authorsSet);\r\n }\r\n\r\n /**\r\n * Clears all revisions\r\n */\r\n clear(): void {\r\n const count = this.revisions.length;\r\n this.revisions = [];\r\n this.nextId = 0;\r\n this.invalidateCache();\r\n if (count > 0) {\r\n getLogger().info('Revisions cleared', { previousCount: count });\r\n }\r\n }\r\n\r\n /**\r\n * Checks if there are no revisions\r\n * @returns True if there are no tracked changes\r\n */\r\n isEmpty(): boolean {\r\n return this.revisions.length === 0;\r\n }\r\n\r\n /**\r\n * Gets the most recent N revisions\r\n * @param count - Number of recent revisions to return\r\n * @returns Array of most recent revisions\r\n */\r\n getRecentRevisions(count: number): Revision[] {\r\n return [...this.revisions]\r\n .sort((a, b) => b.getDate().getTime() - a.getDate().getTime())\r\n .slice(0, count);\r\n }\r\n\r\n /**\r\n * Searches revisions by text content\r\n * @param searchText - Text to search for (case-insensitive)\r\n * @returns Array of revisions containing the search text\r\n */\r\n findRevisionsByText(searchText: string): Revision[] {\r\n const lowerSearch = searchText.toLowerCase();\r\n return this.revisions.filter(revision => {\r\n const text = revision.getRuns()\r\n .map(run => run.getText())\r\n .join('')\r\n .toLowerCase();\r\n return text.includes(lowerSearch);\r\n });\r\n }\r\n\r\n /**\r\n * Gets all insertions (added text)\r\n * @returns Array of insertion revisions\r\n */\r\n getAllInsertions(): Revision[] {\r\n return this.getRevisionsByType('insert');\r\n }\r\n\r\n /**\r\n * Gets all deletions (removed text)\r\n * @returns Array of deletion revisions\r\n */\r\n getAllDeletions(): Revision[] {\r\n return this.getRevisionsByType('delete');\r\n }\r\n\r\n /**\r\n * Gets all run properties changes (formatting changes)\r\n * @returns Array of run property change revisions\r\n */\r\n getAllRunPropertiesChanges(): Revision[] {\r\n return this.getRevisionsByType('runPropertiesChange');\r\n }\r\n\r\n /**\r\n * Gets all paragraph properties changes\r\n * @returns Array of paragraph property change revisions\r\n */\r\n getAllParagraphPropertiesChanges(): Revision[] {\r\n return this.getRevisionsByType('paragraphPropertiesChange');\r\n }\r\n\r\n /**\r\n * Gets all table properties changes\r\n * @returns Array of table property change revisions\r\n */\r\n getAllTablePropertiesChanges(): Revision[] {\r\n return this.getRevisionsByType('tablePropertiesChange');\r\n }\r\n\r\n /**\r\n * Gets all move operations (both moveFrom and moveTo)\r\n * @returns Array of move-related revisions\r\n */\r\n getAllMoves(): Revision[] {\r\n return this.revisions.filter(rev =>\r\n rev.getType() === 'moveFrom' || rev.getType() === 'moveTo'\r\n );\r\n }\r\n\r\n /**\r\n * Gets all moveFrom revisions (source of moves)\r\n * @returns Array of moveFrom revisions\r\n */\r\n getAllMoveFrom(): Revision[] {\r\n return this.getRevisionsByType('moveFrom');\r\n }\r\n\r\n /**\r\n * Gets all moveTo revisions (destination of moves)\r\n * @returns Array of moveTo revisions\r\n */\r\n getAllMoveTo(): Revision[] {\r\n return this.getRevisionsByType('moveTo');\r\n }\r\n\r\n /**\r\n * Gets all table cell changes (insert, delete, merge)\r\n * @returns Array of table cell change revisions\r\n */\r\n getAllTableCellChanges(): Revision[] {\r\n return this.revisions.filter(rev =>\r\n rev.getType() === 'tableCellInsert' ||\r\n rev.getType() === 'tableCellDelete' ||\r\n rev.getType() === 'tableCellMerge'\r\n );\r\n }\r\n\r\n /**\r\n * Gets all numbering changes\r\n * @returns Array of numbering change revisions\r\n */\r\n getAllNumberingChanges(): Revision[] {\r\n return this.getRevisionsByType('numberingChange');\r\n }\r\n\r\n /**\r\n * Gets all property change revisions (run, paragraph, table, etc.)\r\n * @returns Array of all property change revisions\r\n */\r\n getAllPropertyChanges(): Revision[] {\r\n return this.revisions.filter(rev =>\r\n rev.getType() === 'runPropertiesChange' ||\r\n rev.getType() === 'paragraphPropertiesChange' ||\r\n rev.getType() === 'tablePropertiesChange' ||\r\n rev.getType() === 'tableRowPropertiesChange' ||\r\n rev.getType() === 'tableCellPropertiesChange' ||\r\n rev.getType() === 'sectionPropertiesChange' ||\r\n rev.getType() === 'numberingChange'\r\n );\r\n }\r\n\r\n /**\r\n * Gets move pair by move ID\r\n * @param moveId - Move operation ID\r\n * @returns Object with moveFrom and moveTo revisions (if found)\r\n */\r\n getMovePair(moveId: string): { moveFrom?: Revision; moveTo?: Revision } {\r\n const moveFrom = this.revisions.find(\r\n rev => rev.getType() === 'moveFrom' && rev.getMoveId() === moveId\r\n );\r\n const moveTo = this.revisions.find(\r\n rev => rev.getType() === 'moveTo' && rev.getMoveId() === moveId\r\n );\r\n return { moveFrom, moveTo };\r\n }\r\n\r\n /**\r\n * Gets statistics about revisions\r\n * @returns Object with revision statistics\r\n */\r\n getStats(): {\r\n total: number;\r\n insertions: number;\r\n deletions: number;\r\n propertyChanges: number;\r\n moves: number;\r\n tableCellChanges: number;\r\n authors: string[];\r\n nextId: number;\r\n } {\r\n return {\r\n total: this.revisions.length,\r\n insertions: this.getInsertionCount(),\r\n deletions: this.getDeletionCount(),\r\n propertyChanges: this.getAllPropertyChanges().length,\r\n moves: this.getAllMoves().length,\r\n tableCellChanges: this.getAllTableCellChanges().length,\r\n authors: this.getAuthors(),\r\n nextId: this.nextId,\r\n };\r\n }\r\n\r\n /**\r\n * Checks if track changes is enabled (has any revisions)\r\n * @returns True if there are revisions\r\n */\r\n isTrackingChanges(): boolean {\r\n return this.revisions.length > 0;\r\n }\r\n\r\n /**\r\n * Gets the most recent revision\r\n * @returns The most recent revision, or undefined if no revisions\r\n */\r\n getLatestRevision(): Revision | undefined {\r\n if (this.revisions.length === 0) {\r\n return undefined;\r\n }\r\n return this.revisions[this.revisions.length - 1];\r\n }\r\n\r\n /**\r\n * Gets revisions within a date range\r\n * @param startDate - Start of date range\r\n * @param endDate - End of date range\r\n * @returns Array of revisions within the date range\r\n */\r\n getRevisionsByDateRange(startDate: Date, endDate: Date): Revision[] {\r\n return this.revisions.filter(rev => {\r\n const revDate = rev.getDate();\r\n return revDate >= startDate && revDate <= endDate;\r\n });\r\n }\r\n\r\n /**\r\n * Gets the next available revision ID without consuming it.\r\n *\r\n * This is an alias for peekNextId() for backward compatibility.\r\n * Use consumeNextId() if you need to reserve an ID for manual use.\r\n *\r\n * @returns Next available revision ID (without consuming it)\r\n * @see consumeNextId for reserving IDs\r\n * @see register for automatic ID assignment\r\n */\r\n getNextId(): number {\r\n return this.nextId;\r\n }\r\n\r\n /**\r\n * Peeks at the next revision ID without incrementing\r\n * @returns Next available revision ID (without consuming it)\r\n */\r\n peekNextId(): number {\r\n return this.nextId;\r\n }\r\n\r\n /**\r\n * Consumes and returns the next revision ID.\r\n *\r\n * Use this when you need to manually assign an ID to a revision\r\n * that won't be registered through register(). The ID is reserved\r\n * and won't be reused by subsequent register() calls.\r\n *\r\n * When a centralized ID provider is set, IDs come from the shared counter.\r\n *\r\n * @returns The consumed revision ID\r\n *\r\n * @example\r\n * ```typescript\r\n * // Reserve an ID for manual assignment\r\n * const id = revisionManager.consumeNextId();\r\n * revision.setId(id);\r\n * // Don't call register() - the ID is already consumed\r\n * ```\r\n */\r\n consumeNextId(): number {\r\n // Use centralized provider if available\r\n return this.idProvider ? this.idProvider() : this.nextId++;\r\n }\r\n\r\n /**\r\n * Sets the next ID to be assigned.\r\n * Used when loading documents to avoid ID collisions with existing revisions.\r\n * @param id - The next ID value to use\r\n */\r\n setNextId(id: number): void {\r\n this.nextId = id;\r\n }\r\n\r\n /**\r\n * Creates a new RevisionManager\r\n * @returns New RevisionManager instance\r\n */\r\n static create(): RevisionManager {\r\n return new RevisionManager();\r\n }\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // NEW METHODS - Added for ChangelogGenerator and RevisionAwareProcessor\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Check if any revisions exist in the manager.\r\n * @returns True if there are any revisions\r\n */\r\n hasRevisions(): boolean {\r\n return this.revisions.length > 0;\r\n }\r\n\r\n /**\r\n * Get revisions by semantic category.\r\n *\r\n * Categories:\r\n * - content: insert, delete, imageChange, fieldChange, commentChange, contentControlChange, hyperlinkChange\r\n * - formatting: runPropertiesChange, paragraphPropertiesChange, numberingChange\r\n * - structural: moveFrom, moveTo, sectionPropertiesChange, bookmarkChange\r\n * - table: tablePropertiesChange, tableCellInsert, tableCellDelete, tableCellMerge, etc.\r\n *\r\n * @param category - Semantic category to filter by\r\n * @returns Array of revisions in the specified category\r\n */\r\n getByCategory(category: RevisionCategory): Revision[] {\r\n // Check cache first\r\n if (this.revisionsByCategoryCache.has(category)) {\r\n return [...this.revisionsByCategoryCache.get(category)!];\r\n }\r\n\r\n // Compute and cache\r\n const result = this.revisions.filter(rev => {\r\n const type = rev.getType();\r\n switch (category) {\r\n case 'content':\r\n return type === 'insert' ||\r\n type === 'delete' ||\r\n // Internal tracking types for rich content changes\r\n type === 'imageChange' ||\r\n type === 'fieldChange' ||\r\n type === 'commentChange' ||\r\n type === 'contentControlChange' ||\r\n type === 'hyperlinkChange';\r\n\r\n case 'formatting':\r\n return type === 'runPropertiesChange' ||\r\n type === 'paragraphPropertiesChange' ||\r\n type === 'numberingChange';\r\n\r\n case 'structural':\r\n return type === 'moveFrom' ||\r\n type === 'moveTo' ||\r\n type === 'sectionPropertiesChange' ||\r\n // Bookmarks are structural markers\r\n type === 'bookmarkChange';\r\n\r\n case 'table':\r\n return type === 'tablePropertiesChange' ||\r\n type === 'tableExceptionPropertiesChange' ||\r\n type === 'tableRowPropertiesChange' ||\r\n type === 'tableCellPropertiesChange' ||\r\n type === 'tableCellInsert' ||\r\n type === 'tableCellDelete' ||\r\n type === 'tableCellMerge';\r\n\r\n default:\r\n return false;\r\n }\r\n });\r\n this.revisionsByCategoryCache.set(category, result);\r\n return [...result];\r\n }\r\n\r\n /**\r\n * Get revisions affecting a specific paragraph.\r\n *\r\n * Uses the revision's location data if available. Returns revisions\r\n * where location.paragraphIndex matches the specified index.\r\n *\r\n * Note: Revisions must have location data set (via setLocation()) for\r\n * accurate filtering. Revisions without location data are excluded.\r\n *\r\n * @param paragraphIndex - Index of the paragraph (0-based)\r\n * @returns Array of revisions affecting the specified paragraph\r\n *\r\n * @example\r\n * ```typescript\r\n * const revisions = revisionManager.getRevisionsForParagraph(3);\r\n * console.log(`${revisions.length} revisions affect paragraph 3`);\r\n * ```\r\n */\r\n getRevisionsForParagraph(paragraphIndex: number): Revision[] {\r\n if (paragraphIndex < 0) {\r\n return [];\r\n }\r\n return this.revisions.filter(rev => {\r\n const loc = rev.getLocation();\r\n if (!loc) return false;\r\n return loc.paragraphIndex === paragraphIndex;\r\n });\r\n }\r\n\r\n /**\r\n * Get summary statistics for all revisions.\r\n * Provides comprehensive breakdown by type, category, and author.\r\n *\r\n * @returns Summary statistics object\r\n */\r\n getSummary(): RevisionSummary {\r\n const byCategory: Record<RevisionCategory, number> = {\r\n content: 0,\r\n formatting: 0,\r\n structural: 0,\r\n table: 0,\r\n };\r\n\r\n let earliest: Date | null = null;\r\n let latest: Date | null = null;\r\n\r\n // Count by category and track date range\r\n for (const rev of this.revisions) {\r\n const type = rev.getType();\r\n const date = rev.getDate();\r\n\r\n // Update date range\r\n if (!earliest || date < earliest) earliest = date;\r\n if (!latest || date > latest) latest = date;\r\n\r\n // Categorize\r\n if (type === 'insert' || type === 'delete') {\r\n byCategory.content++;\r\n } else if (\r\n type === 'runPropertiesChange' ||\r\n type === 'paragraphPropertiesChange' ||\r\n type === 'numberingChange'\r\n ) {\r\n byCategory.formatting++;\r\n } else if (\r\n type === 'moveFrom' ||\r\n type === 'moveTo' ||\r\n type === 'sectionPropertiesChange'\r\n ) {\r\n byCategory.structural++;\r\n } else if (\r\n type === 'tablePropertiesChange' ||\r\n type === 'tableExceptionPropertiesChange' ||\r\n type === 'tableRowPropertiesChange' ||\r\n type === 'tableCellPropertiesChange' ||\r\n type === 'tableCellInsert' ||\r\n type === 'tableCellDelete' ||\r\n type === 'tableCellMerge'\r\n ) {\r\n byCategory.table++;\r\n }\r\n }\r\n\r\n const summary = {\r\n total: this.revisions.length,\r\n byType: {\r\n insertions: this.getInsertionCount(),\r\n deletions: this.getDeletionCount(),\r\n moves: this.getAllMoves().length,\r\n propertyChanges: this.getAllPropertyChanges().length,\r\n tableChanges: this.getAllTableCellChanges().length,\r\n },\r\n byCategory,\r\n authors: this.getAuthors(),\r\n dateRange: earliest && latest ? { earliest, latest } : null,\r\n };\r\n\r\n if (summary.total > 0) {\r\n getLogger().info('Revision summary', {\r\n total: summary.total,\r\n ins: summary.byType.insertions,\r\n del: summary.byType.deletions,\r\n fmt: summary.byType.propertyChanges,\r\n authors: summary.authors.length\r\n });\r\n }\r\n\r\n return summary;\r\n }\r\n\r\n /**\r\n * Get a revision by its ID.\r\n *\r\n * @param id - Revision ID to find\r\n * @returns Revision with the specified ID, or undefined\r\n */\r\n getById(id: number): Revision | undefined {\r\n return this.revisions.find(rev => rev.getId() === id);\r\n }\r\n\r\n /**\r\n * Remove a revision by its ID.\r\n *\r\n * @param id - ID of the revision to remove\r\n * @returns True if revision was found and removed\r\n */\r\n removeById(id: number): boolean {\r\n const index = this.revisions.findIndex(rev => rev.getId() === id);\r\n if (index === -1) return false;\r\n\r\n this.revisions.splice(index, 1);\r\n this.invalidateCache();\r\n return true;\r\n }\r\n\r\n /**\r\n * Get revisions matching multiple criteria.\r\n *\r\n * @param criteria - Filter criteria\r\n * @returns Array of matching revisions\r\n */\r\n getMatching(criteria: {\r\n types?: RevisionType[];\r\n authors?: string[];\r\n categories?: RevisionCategory[];\r\n dateRange?: { start: Date; end: Date };\r\n }): Revision[] {\r\n return this.revisions.filter(rev => {\r\n // Filter by types\r\n if (criteria.types && !criteria.types.includes(rev.getType())) {\r\n return false;\r\n }\r\n\r\n // Filter by authors\r\n if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {\r\n return false;\r\n }\r\n\r\n // Filter by categories\r\n if (criteria.categories) {\r\n const revCategory = this.getRevisionCategory(rev);\r\n if (!criteria.categories.includes(revCategory)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Filter by date range\r\n if (criteria.dateRange) {\r\n const date = rev.getDate();\r\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Get the semantic category of a revision.\r\n * @internal\r\n */\r\n private getRevisionCategory(revision: Revision): RevisionCategory {\r\n const type = revision.getType();\r\n\r\n if (type === 'insert' || type === 'delete') {\r\n return 'content';\r\n }\r\n if (\r\n type === 'runPropertiesChange' ||\r\n type === 'paragraphPropertiesChange' ||\r\n type === 'numberingChange'\r\n ) {\r\n return 'formatting';\r\n }\r\n if (\r\n type === 'moveFrom' ||\r\n type === 'moveTo' ||\r\n type === 'sectionPropertiesChange'\r\n ) {\r\n return 'structural';\r\n }\r\n if (\r\n type === 'tablePropertiesChange' ||\r\n type === 'tableExceptionPropertiesChange' ||\r\n type === 'tableRowPropertiesChange' ||\r\n type === 'tableCellPropertiesChange' ||\r\n type === 'tableCellInsert' ||\r\n type === 'tableCellDelete' ||\r\n type === 'tableCellMerge'\r\n ) {\r\n return 'table';\r\n }\r\n\r\n // Default\r\n return 'content';\r\n }\r\n\r\n // ============================================================\r\n // Location-Aware Methods\r\n // ============================================================\r\n\r\n /**\r\n * Gets revisions affecting a specific run within a paragraph.\r\n *\r\n * Uses the revision's location data if available.\r\n *\r\n * @param paragraphIndex - Index of the paragraph (0-based)\r\n * @param runIndex - Index of the run within the paragraph (0-based)\r\n * @returns Array of revisions affecting the specified run\r\n *\r\n * @example\r\n * ```typescript\r\n * const revisions = revisionManager.getRevisionsForRun(0, 2);\r\n * console.log(`${revisions.length} revisions affect run 2 in paragraph 0`);\r\n * ```\r\n */\r\n getRevisionsForRun(paragraphIndex: number, runIndex: number): Revision[] {\r\n return this.revisions.filter(rev => {\r\n const loc = rev.getLocation();\r\n if (!loc) return false;\r\n return loc.paragraphIndex === paragraphIndex && loc.runIndex === runIndex;\r\n });\r\n }\r\n\r\n /**\r\n * Gets revisions by location criteria.\r\n *\r\n * Filters revisions based on their location within the document structure.\r\n * All specified criteria must match (AND logic).\r\n *\r\n * @param criteria - Location filter criteria\r\n * @returns Array of revisions matching the criteria\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get all revisions in paragraph 5\r\n * const paraRevisions = revisionManager.getRevisionsByLocation({\r\n * paragraphIndex: 5\r\n * });\r\n *\r\n * // Get all revisions in table row 2, cell 1\r\n * const cellRevisions = revisionManager.getRevisionsByLocation({\r\n * tableRow: 2,\r\n * tableCell: 1\r\n * });\r\n * ```\r\n */\r\n getRevisionsByLocation(criteria: Partial<RevisionLocation>): Revision[] {\r\n return this.revisions.filter(rev => {\r\n const loc = rev.getLocation();\r\n if (!loc) return false;\r\n\r\n // Check each criteria if specified\r\n if (criteria.paragraphIndex !== undefined &&\r\n loc.paragraphIndex !== criteria.paragraphIndex) {\r\n return false;\r\n }\r\n if (criteria.runIndex !== undefined &&\r\n loc.runIndex !== criteria.runIndex) {\r\n return false;\r\n }\r\n if (criteria.tableRow !== undefined &&\r\n loc.tableRow !== criteria.tableRow) {\r\n return false;\r\n }\r\n if (criteria.tableCell !== undefined &&\r\n loc.tableCell !== criteria.tableCell) {\r\n return false;\r\n }\r\n if (criteria.sectionIndex !== undefined &&\r\n loc.sectionIndex !== criteria.sectionIndex) {\r\n return false;\r\n }\r\n if (criteria.headerFooterType !== undefined &&\r\n loc.headerFooterType !== criteria.headerFooterType) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Gets revisions that have location data.\r\n *\r\n * @returns Array of revisions with location information\r\n */\r\n getRevisionsWithLocation(): Revision[] {\r\n return this.revisions.filter(rev => rev.getLocation() !== undefined);\r\n }\r\n\r\n /**\r\n * Gets revisions that do NOT have location data.\r\n *\r\n * @returns Array of revisions without location information\r\n */\r\n getRevisionsWithoutLocation(): Revision[] {\r\n return this.revisions.filter(rev => rev.getLocation() === undefined);\r\n }\r\n\r\n // ============================================================\r\n // Validation Methods\r\n // ============================================================\r\n\r\n /**\r\n * Validates that all revision IDs are unique.\r\n *\r\n * Per ECMA-376, revision IDs must be unique within a document.\r\n * Duplicate IDs can cause Word to reject the document or\r\n * produce unexpected behavior.\r\n *\r\n * @returns Validation result with any duplicate IDs found\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = revisionManager.validateRevisionIds();\r\n * if (!result.valid) {\r\n * console.error('Duplicate IDs found:', result.duplicates);\r\n * }\r\n * ```\r\n */\r\n validateRevisionIds(): { valid: boolean; duplicates: number[] } {\r\n const seen = new Set<number>();\r\n const duplicates: number[] = [];\r\n\r\n for (const rev of this.revisions) {\r\n const id = rev.getId();\r\n if (seen.has(id)) {\r\n if (!duplicates.includes(id)) {\r\n duplicates.push(id);\r\n }\r\n }\r\n seen.add(id);\r\n }\r\n\r\n return {\r\n valid: duplicates.length === 0,\r\n duplicates,\r\n };\r\n }\r\n\r\n /**\r\n * Reassigns all revision IDs to ensure uniqueness.\r\n *\r\n * This is useful after merging documents or when duplicate\r\n * IDs are detected. IDs are reassigned sequentially starting\r\n * from the specified value.\r\n *\r\n * @param startId - Starting ID value (default: 0)\r\n * @returns Number of IDs reassigned\r\n *\r\n * @example\r\n * ```typescript\r\n * const count = revisionManager.reassignRevisionIds();\r\n * console.log(`Reassigned ${count} revision IDs`);\r\n * ```\r\n */\r\n reassignRevisionIds(startId = 0): number {\r\n let currentId = startId;\r\n\r\n for (const rev of this.revisions) {\r\n rev.setId(currentId++);\r\n }\r\n\r\n // Update nextId to continue from where we left off\r\n this.nextId = currentId;\r\n\r\n return this.revisions.length;\r\n }\r\n\r\n /**\r\n * Validates move operation pairs (moveFrom/moveTo).\r\n *\r\n * Each moveFrom must have a matching moveTo with the same moveId,\r\n * and vice versa. Orphaned move markers can cause document corruption.\r\n *\r\n * @returns Validation result with orphaned move IDs\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = revisionManager.validateMovePairs();\r\n * if (!result.valid) {\r\n * console.error('Orphaned moveFrom IDs:', result.orphanedMoveFrom);\r\n * console.error('Orphaned moveTo IDs:', result.orphanedMoveTo);\r\n * }\r\n * ```\r\n */\r\n validateMovePairs(): {\r\n valid: boolean;\r\n orphanedMoveFrom: string[];\r\n orphanedMoveTo: string[];\r\n } {\r\n const moveFromIds = new Map<string, Revision>();\r\n const moveToIds = new Map<string, Revision>();\r\n\r\n for (const rev of this.revisions) {\r\n const moveId = rev.getMoveId();\r\n if (!moveId) continue;\r\n\r\n if (rev.getType() === 'moveFrom') {\r\n moveFromIds.set(moveId, rev);\r\n } else if (rev.getType() === 'moveTo') {\r\n moveToIds.set(moveId, rev);\r\n }\r\n }\r\n\r\n const orphanedMoveFrom: string[] = [];\r\n const orphanedMoveTo: string[] = [];\r\n\r\n // Find moveFrom without matching moveTo\r\n for (const moveId of moveFromIds.keys()) {\r\n if (!moveToIds.has(moveId)) {\r\n orphanedMoveFrom.push(moveId);\r\n }\r\n }\r\n\r\n // Find moveTo without matching moveFrom\r\n for (const moveId of moveToIds.keys()) {\r\n if (!moveFromIds.has(moveId)) {\r\n orphanedMoveTo.push(moveId);\r\n }\r\n }\r\n\r\n return {\r\n valid: orphanedMoveFrom.length === 0 && orphanedMoveTo.length === 0,\r\n orphanedMoveFrom,\r\n orphanedMoveTo,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the highest revision ID currently in use.\r\n *\r\n * @returns Highest ID, or -1 if no revisions exist\r\n */\r\n getHighestId(): number {\r\n if (this.revisions.length === 0) return -1;\r\n return Math.max(...this.revisions.map(r => r.getId()));\r\n }\r\n\r\n /**\r\n * Ensures the next ID is higher than all existing IDs.\r\n *\r\n * Useful after loading a document with existing revisions\r\n * to prevent ID conflicts with new revisions.\r\n */\r\n syncNextId(): void {\r\n const highestId = this.getHighestId();\r\n if (highestId >= this.nextId) {\r\n this.nextId = highestId + 1;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"RevisionManager.js","sourceRoot":"","sources":["../../src/elements/RevisionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionManager - Manages tracked changes (revisions) in a document\n *\n * Tracks all revisions, assigns unique IDs, and provides statistics.\n */\n\nimport { Revision, RevisionType } from './Revision';\nimport type { RevisionLocation } from './PropertyChangeTypes';\nimport { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger';\n\n// Scoped logger for RevisionManager\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'RevisionManager');\n}\n\n/**\n * Type for the centralized ID provider callback.\n * Returns the next available annotation ID from a shared counter.\n */\nexport type IdProviderCallback = () => number;\n\n/**\n * Type for callback to notify of existing IDs (for synchronization).\n * Called when registering existing revisions to keep the central counter in sync.\n */\nexport type IdExistsCallback = (existingId: number) => void;\n\n/**\n * Semantic category for grouping revisions.\n */\nexport type RevisionCategory =\n | 'content' // Text insertions, deletions\n | 'formatting' // Run/paragraph property changes\n | 'structural' // Moves, section changes\n | 'table'; // Table structure changes\n\n/**\n * Summary statistics for revisions.\n */\nexport interface RevisionSummary {\n total: number;\n byType: {\n insertions: number;\n deletions: number;\n moves: number;\n propertyChanges: number;\n tableChanges: number;\n };\n byCategory: Record<RevisionCategory, number>;\n authors: string[];\n dateRange: { earliest: Date; latest: Date } | null;\n}\n\n/**\n * Manages document revisions (track changes)\n *\n * Per ECMA-376, revision IDs must be unique across ALL annotation types\n * in a document. Use setIdProvider() to connect to a centralized ID allocator.\n */\nexport class RevisionManager {\n private revisions: Revision[] = [];\n private nextId = 0;\n private idProvider: IdProviderCallback | null = null;\n private idExistsNotifier: IdExistsCallback | null = null;\n\n // Performance caching for frequently accessed filtered results\n private revisionsByTypeCache = new Map<RevisionType, Revision[]>();\n private revisionsByAuthorCache = new Map<string, Revision[]>();\n private revisionsByCategoryCache = new Map<RevisionCategory, Revision[]>();\n private cacheValid = true;\n\n /**\n * Invalidates all caches. Called when revisions are added/removed.\n * @private\n */\n private invalidateCache(): void {\n this.revisionsByTypeCache.clear();\n this.revisionsByAuthorCache.clear();\n this.revisionsByCategoryCache.clear();\n this.cacheValid = false;\n }\n\n /**\n * Sets the centralized ID provider callback.\n * When set, IDs will be allocated from the centralized DocumentIdManager\n * instead of the local nextId counter.\n *\n * @param provider - Callback that returns the next available ID\n * @param existsNotifier - Optional callback to notify when existing IDs are found\n */\n setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {\n this.idProvider = provider;\n this.idExistsNotifier = existsNotifier || null;\n }\n\n /**\n * Registers a revision with the manager\n * Assigns a unique ID\n * @param revision - Revision to register\n * @returns The registered revision (same instance)\n */\n register(revision: Revision): Revision {\n const logger = getLogger();\n // Assign unique ID - use centralized provider if available\n const id = this.idProvider ? this.idProvider() : this.nextId++;\n revision.setId(id);\n\n // Store revision\n this.revisions.push(revision);\n this.invalidateCache();\n\n logger.debug('Revision registered', {\n id: revision.getId(),\n type: revision.getType(),\n author: revision.getAuthor(),\n });\n\n return revision;\n }\n\n /**\n * Registers an existing revision (from parsing) with its pre-assigned ID.\n * Unlike register(), this does NOT assign a new ID - preserves the original\n * ID from parsed XML. Used when loading documents to avoid overwriting\n * revision IDs that are already correct.\n *\n * @param revision - Revision with ID already set from XML parsing\n * @returns The registered revision (same instance)\n */\n registerExisting(revision: Revision): Revision {\n const logger = getLogger();\n const existingId = revision.getId();\n\n // Notify centralized ID manager about this existing ID\n // This ensures the shared counter stays above all existing IDs\n if (this.idExistsNotifier) {\n this.idExistsNotifier(existingId);\n }\n\n // Also update local nextId to avoid collisions (fallback when no provider)\n if (existingId >= this.nextId) {\n this.nextId = existingId + 1;\n }\n\n // Store revision (keep its existing ID - do NOT overwrite)\n this.revisions.push(revision);\n this.invalidateCache();\n\n logger.debug('Existing revision registered', {\n id: existingId,\n type: revision.getType(),\n author: revision.getAuthor(),\n });\n\n return revision;\n }\n\n /**\n * Gets all revisions\n * @returns Array of all revisions\n */\n getAllRevisions(): Revision[] {\n return [...this.revisions];\n }\n\n /**\n * Gets revisions by type\n * Uses caching for improved performance on repeated calls\n * @param type - Revision type to filter by\n * @returns Array of revisions of the specified type\n */\n getRevisionsByType(type: RevisionType): Revision[] {\n // Check cache first\n if (this.revisionsByTypeCache.has(type)) {\n return [...this.revisionsByTypeCache.get(type)!];\n }\n\n // Compute and cache\n const result = this.revisions.filter((rev) => rev.getType() === type);\n this.revisionsByTypeCache.set(type, result);\n return [...result];\n }\n\n /**\n * Gets revisions by author\n * Uses caching for improved performance on repeated calls\n * @param author - Author name to filter by\n * @returns Array of revisions by the specified author\n */\n getRevisionsByAuthor(author: string): Revision[] {\n // Check cache first\n if (this.revisionsByAuthorCache.has(author)) {\n return [...this.revisionsByAuthorCache.get(author)!];\n }\n\n // Compute and cache\n const result = this.revisions.filter((rev) => rev.getAuthor() === author);\n this.revisionsByAuthorCache.set(author, result);\n return [...result];\n }\n\n /**\n * Gets the number of revisions\n * @returns Number of revisions\n */\n getCount(): number {\n return this.revisions.length;\n }\n\n /**\n * Gets the number of insertions\n * @returns Number of insertion revisions\n */\n getInsertionCount(): number {\n return this.getRevisionsByType('insert').length;\n }\n\n /**\n * Gets the number of deletions\n * @returns Number of deletion revisions\n */\n getDeletionCount(): number {\n return this.getRevisionsByType('delete').length;\n }\n\n /**\n * Gets all unique authors who have made changes\n * @returns Array of unique author names\n */\n getAuthors(): string[] {\n const authorsSet = new Set<string>();\n for (const revision of this.revisions) {\n authorsSet.add(revision.getAuthor());\n }\n return Array.from(authorsSet);\n }\n\n /**\n * Clears all revisions\n */\n clear(): void {\n const count = this.revisions.length;\n this.revisions = [];\n this.nextId = 0;\n this.invalidateCache();\n if (count > 0) {\n getLogger().info('Revisions cleared', { previousCount: count });\n }\n }\n\n /**\n * Checks if there are no revisions\n * @returns True if there are no tracked changes\n */\n isEmpty(): boolean {\n return this.revisions.length === 0;\n }\n\n /**\n * Gets the most recent N revisions\n * @param count - Number of recent revisions to return\n * @returns Array of most recent revisions\n */\n getRecentRevisions(count: number): Revision[] {\n return [...this.revisions]\n .sort((a, b) => b.getDate().getTime() - a.getDate().getTime())\n .slice(0, count);\n }\n\n /**\n * Searches revisions by text content\n * @param searchText - Text to search for (case-insensitive)\n * @returns Array of revisions containing the search text\n */\n findRevisionsByText(searchText: string): Revision[] {\n const lowerSearch = searchText.toLowerCase();\n return this.revisions.filter((revision) => {\n const text = revision\n .getRuns()\n .map((run) => run.getText())\n .join('')\n .toLowerCase();\n return text.includes(lowerSearch);\n });\n }\n\n /**\n * Gets all insertions (added text)\n * @returns Array of insertion revisions\n */\n getAllInsertions(): Revision[] {\n return this.getRevisionsByType('insert');\n }\n\n /**\n * Gets all deletions (removed text)\n * @returns Array of deletion revisions\n */\n getAllDeletions(): Revision[] {\n return this.getRevisionsByType('delete');\n }\n\n /**\n * Gets all run properties changes (formatting changes)\n * @returns Array of run property change revisions\n */\n getAllRunPropertiesChanges(): Revision[] {\n return this.getRevisionsByType('runPropertiesChange');\n }\n\n /**\n * Gets all paragraph properties changes\n * @returns Array of paragraph property change revisions\n */\n getAllParagraphPropertiesChanges(): Revision[] {\n return this.getRevisionsByType('paragraphPropertiesChange');\n }\n\n /**\n * Gets all table properties changes\n * @returns Array of table property change revisions\n */\n getAllTablePropertiesChanges(): Revision[] {\n return this.getRevisionsByType('tablePropertiesChange');\n }\n\n /**\n * Gets all move operations (both moveFrom and moveTo)\n * @returns Array of move-related revisions\n */\n getAllMoves(): Revision[] {\n return this.revisions.filter(\n (rev) => rev.getType() === 'moveFrom' || rev.getType() === 'moveTo'\n );\n }\n\n /**\n * Gets all moveFrom revisions (source of moves)\n * @returns Array of moveFrom revisions\n */\n getAllMoveFrom(): Revision[] {\n return this.getRevisionsByType('moveFrom');\n }\n\n /**\n * Gets all moveTo revisions (destination of moves)\n * @returns Array of moveTo revisions\n */\n getAllMoveTo(): Revision[] {\n return this.getRevisionsByType('moveTo');\n }\n\n /**\n * Gets all table cell changes (insert, delete, merge)\n * @returns Array of table cell change revisions\n */\n getAllTableCellChanges(): Revision[] {\n return this.revisions.filter(\n (rev) =>\n rev.getType() === 'tableCellInsert' ||\n rev.getType() === 'tableCellDelete' ||\n rev.getType() === 'tableCellMerge'\n );\n }\n\n /**\n * Gets all numbering changes\n * @returns Array of numbering change revisions\n */\n getAllNumberingChanges(): Revision[] {\n return this.getRevisionsByType('numberingChange');\n }\n\n /**\n * Gets all property change revisions (run, paragraph, table, etc.)\n * @returns Array of all property change revisions\n */\n getAllPropertyChanges(): Revision[] {\n return this.revisions.filter(\n (rev) =>\n rev.getType() === 'runPropertiesChange' ||\n rev.getType() === 'paragraphPropertiesChange' ||\n rev.getType() === 'tablePropertiesChange' ||\n rev.getType() === 'tableRowPropertiesChange' ||\n rev.getType() === 'tableCellPropertiesChange' ||\n rev.getType() === 'sectionPropertiesChange' ||\n rev.getType() === 'numberingChange'\n );\n }\n\n /**\n * Gets move pair by move ID\n * @param moveId - Move operation ID\n * @returns Object with moveFrom and moveTo revisions (if found)\n */\n getMovePair(moveId: string): { moveFrom?: Revision; moveTo?: Revision } {\n const moveFrom = this.revisions.find(\n (rev) => rev.getType() === 'moveFrom' && rev.getMoveId() === moveId\n );\n const moveTo = this.revisions.find(\n (rev) => rev.getType() === 'moveTo' && rev.getMoveId() === moveId\n );\n return { moveFrom, moveTo };\n }\n\n /**\n * Gets statistics about revisions\n * @returns Object with revision statistics\n */\n getStats(): {\n total: number;\n insertions: number;\n deletions: number;\n propertyChanges: number;\n moves: number;\n tableCellChanges: number;\n authors: string[];\n nextId: number;\n } {\n return {\n total: this.revisions.length,\n insertions: this.getInsertionCount(),\n deletions: this.getDeletionCount(),\n propertyChanges: this.getAllPropertyChanges().length,\n moves: this.getAllMoves().length,\n tableCellChanges: this.getAllTableCellChanges().length,\n authors: this.getAuthors(),\n nextId: this.nextId,\n };\n }\n\n /**\n * Checks if track changes is enabled (has any revisions)\n * @returns True if there are revisions\n */\n isTrackingChanges(): boolean {\n return this.revisions.length > 0;\n }\n\n /**\n * Gets the most recent revision\n * @returns The most recent revision, or undefined if no revisions\n */\n getLatestRevision(): Revision | undefined {\n if (this.revisions.length === 0) {\n return undefined;\n }\n return this.revisions[this.revisions.length - 1];\n }\n\n /**\n * Gets revisions within a date range\n * @param startDate - Start of date range\n * @param endDate - End of date range\n * @returns Array of revisions within the date range\n */\n getRevisionsByDateRange(startDate: Date, endDate: Date): Revision[] {\n return this.revisions.filter((rev) => {\n const revDate = rev.getDate();\n return revDate >= startDate && revDate <= endDate;\n });\n }\n\n /**\n * Gets the next available revision ID without consuming it.\n *\n * This is an alias for peekNextId() for backward compatibility.\n * Use consumeNextId() if you need to reserve an ID for manual use.\n *\n * @returns Next available revision ID (without consuming it)\n * @see consumeNextId for reserving IDs\n * @see register for automatic ID assignment\n */\n getNextId(): number {\n return this.nextId;\n }\n\n /**\n * Peeks at the next revision ID without incrementing\n * @returns Next available revision ID (without consuming it)\n */\n peekNextId(): number {\n return this.nextId;\n }\n\n /**\n * Consumes and returns the next revision ID.\n *\n * Use this when you need to manually assign an ID to a revision\n * that won't be registered through register(). The ID is reserved\n * and won't be reused by subsequent register() calls.\n *\n * When a centralized ID provider is set, IDs come from the shared counter.\n *\n * @returns The consumed revision ID\n *\n * @example\n * ```typescript\n * // Reserve an ID for manual assignment\n * const id = revisionManager.consumeNextId();\n * revision.setId(id);\n * // Don't call register() - the ID is already consumed\n * ```\n */\n consumeNextId(): number {\n // Use centralized provider if available\n return this.idProvider ? this.idProvider() : this.nextId++;\n }\n\n /**\n * Sets the next ID to be assigned.\n * Used when loading documents to avoid ID collisions with existing revisions.\n * @param id - The next ID value to use\n */\n setNextId(id: number): void {\n this.nextId = id;\n }\n\n /**\n * Creates a new RevisionManager\n * @returns New RevisionManager instance\n */\n static create(): RevisionManager {\n return new RevisionManager();\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // NEW METHODS - Added for ChangelogGenerator and RevisionAwareProcessor\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Check if any revisions exist in the manager.\n * @returns True if there are any revisions\n */\n hasRevisions(): boolean {\n return this.revisions.length > 0;\n }\n\n /**\n * Get revisions by semantic category.\n *\n * Categories:\n * - content: insert, delete, imageChange, fieldChange, commentChange, contentControlChange, hyperlinkChange\n * - formatting: runPropertiesChange, paragraphPropertiesChange, numberingChange\n * - structural: moveFrom, moveTo, sectionPropertiesChange, bookmarkChange\n * - table: tablePropertiesChange, tableCellInsert, tableCellDelete, tableCellMerge, etc.\n *\n * @param category - Semantic category to filter by\n * @returns Array of revisions in the specified category\n */\n getByCategory(category: RevisionCategory): Revision[] {\n // Check cache first\n if (this.revisionsByCategoryCache.has(category)) {\n return [...this.revisionsByCategoryCache.get(category)!];\n }\n\n // Compute and cache\n const result = this.revisions.filter((rev) => {\n const type = rev.getType();\n switch (category) {\n case 'content':\n return (\n type === 'insert' ||\n type === 'delete' ||\n // Internal tracking types for rich content changes\n type === 'imageChange' ||\n type === 'fieldChange' ||\n type === 'commentChange' ||\n type === 'contentControlChange' ||\n type === 'hyperlinkChange'\n );\n\n case 'formatting':\n return (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n );\n\n case 'structural':\n return (\n type === 'moveFrom' ||\n type === 'moveTo' ||\n type === 'sectionPropertiesChange' ||\n // Bookmarks are structural markers\n type === 'bookmarkChange'\n );\n\n case 'table':\n return (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n );\n\n default:\n return false;\n }\n });\n this.revisionsByCategoryCache.set(category, result);\n return [...result];\n }\n\n /**\n * Get revisions affecting a specific paragraph.\n *\n * Uses the revision's location data if available. Returns revisions\n * where location.paragraphIndex matches the specified index.\n *\n * Note: Revisions must have location data set (via setLocation()) for\n * accurate filtering. Revisions without location data are excluded.\n *\n * @param paragraphIndex - Index of the paragraph (0-based)\n * @returns Array of revisions affecting the specified paragraph\n *\n * @example\n * ```typescript\n * const revisions = revisionManager.getRevisionsForParagraph(3);\n * console.log(`${revisions.length} revisions affect paragraph 3`);\n * ```\n */\n getRevisionsForParagraph(paragraphIndex: number): Revision[] {\n if (paragraphIndex < 0) {\n return [];\n }\n return this.revisions.filter((rev) => {\n const loc = rev.getLocation();\n if (!loc) return false;\n return loc.paragraphIndex === paragraphIndex;\n });\n }\n\n /**\n * Get summary statistics for all revisions.\n * Provides comprehensive breakdown by type, category, and author.\n *\n * @returns Summary statistics object\n */\n getSummary(): RevisionSummary {\n const byCategory: Record<RevisionCategory, number> = {\n content: 0,\n formatting: 0,\n structural: 0,\n table: 0,\n };\n\n let earliest: Date | null = null;\n let latest: Date | null = null;\n\n // Count by category and track date range\n for (const rev of this.revisions) {\n const type = rev.getType();\n const date = rev.getDate();\n\n // Update date range\n if (!earliest || date < earliest) earliest = date;\n if (!latest || date > latest) latest = date;\n\n // Categorize\n if (type === 'insert' || type === 'delete') {\n byCategory.content++;\n } else if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n byCategory.formatting++;\n } else if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n byCategory.structural++;\n } else if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n byCategory.table++;\n }\n }\n\n const summary = {\n total: this.revisions.length,\n byType: {\n insertions: this.getInsertionCount(),\n deletions: this.getDeletionCount(),\n moves: this.getAllMoves().length,\n propertyChanges: this.getAllPropertyChanges().length,\n tableChanges: this.getAllTableCellChanges().length,\n },\n byCategory,\n authors: this.getAuthors(),\n dateRange: earliest && latest ? { earliest, latest } : null,\n };\n\n if (summary.total > 0) {\n getLogger().info('Revision summary', {\n total: summary.total,\n ins: summary.byType.insertions,\n del: summary.byType.deletions,\n fmt: summary.byType.propertyChanges,\n authors: summary.authors.length,\n });\n }\n\n return summary;\n }\n\n /**\n * Get a revision by its ID.\n *\n * @param id - Revision ID to find\n * @returns Revision with the specified ID, or undefined\n */\n getById(id: number): Revision | undefined {\n return this.revisions.find((rev) => rev.getId() === id);\n }\n\n /**\n * Remove a revision by its ID.\n *\n * @param id - ID of the revision to remove\n * @returns True if revision was found and removed\n */\n removeById(id: number): boolean {\n const index = this.revisions.findIndex((rev) => rev.getId() === id);\n if (index === -1) return false;\n\n this.revisions.splice(index, 1);\n this.invalidateCache();\n return true;\n }\n\n /**\n * Get revisions matching multiple criteria.\n *\n * @param criteria - Filter criteria\n * @returns Array of matching revisions\n */\n getMatching(criteria: {\n types?: RevisionType[];\n authors?: string[];\n categories?: RevisionCategory[];\n dateRange?: { start: Date; end: Date };\n }): Revision[] {\n return this.revisions.filter((rev) => {\n // Filter by types\n if (criteria.types && !criteria.types.includes(rev.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(rev.getAuthor())) {\n return false;\n }\n\n // Filter by categories\n if (criteria.categories) {\n const revCategory = this.getRevisionCategory(rev);\n if (!criteria.categories.includes(revCategory)) {\n return false;\n }\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = rev.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n /**\n * Get the semantic category of a revision.\n * @internal\n */\n private getRevisionCategory(revision: Revision): RevisionCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n // Default\n return 'content';\n }\n\n // ============================================================\n // Location-Aware Methods\n // ============================================================\n\n /**\n * Gets revisions affecting a specific run within a paragraph.\n *\n * Uses the revision's location data if available.\n *\n * @param paragraphIndex - Index of the paragraph (0-based)\n * @param runIndex - Index of the run within the paragraph (0-based)\n * @returns Array of revisions affecting the specified run\n *\n * @example\n * ```typescript\n * const revisions = revisionManager.getRevisionsForRun(0, 2);\n * console.log(`${revisions.length} revisions affect run 2 in paragraph 0`);\n * ```\n */\n getRevisionsForRun(paragraphIndex: number, runIndex: number): Revision[] {\n return this.revisions.filter((rev) => {\n const loc = rev.getLocation();\n if (!loc) return false;\n return loc.paragraphIndex === paragraphIndex && loc.runIndex === runIndex;\n });\n }\n\n /**\n * Gets revisions by location criteria.\n *\n * Filters revisions based on their location within the document structure.\n * All specified criteria must match (AND logic).\n *\n * @param criteria - Location filter criteria\n * @returns Array of revisions matching the criteria\n *\n * @example\n * ```typescript\n * // Get all revisions in paragraph 5\n * const paraRevisions = revisionManager.getRevisionsByLocation({\n * paragraphIndex: 5\n * });\n *\n * // Get all revisions in table row 2, cell 1\n * const cellRevisions = revisionManager.getRevisionsByLocation({\n * tableRow: 2,\n * tableCell: 1\n * });\n * ```\n */\n getRevisionsByLocation(criteria: Partial<RevisionLocation>): Revision[] {\n return this.revisions.filter((rev) => {\n const loc = rev.getLocation();\n if (!loc) return false;\n\n // Check each criteria if specified\n if (criteria.paragraphIndex !== undefined && loc.paragraphIndex !== criteria.paragraphIndex) {\n return false;\n }\n if (criteria.runIndex !== undefined && loc.runIndex !== criteria.runIndex) {\n return false;\n }\n if (criteria.tableRow !== undefined && loc.tableRow !== criteria.tableRow) {\n return false;\n }\n if (criteria.tableCell !== undefined && loc.tableCell !== criteria.tableCell) {\n return false;\n }\n if (criteria.sectionIndex !== undefined && loc.sectionIndex !== criteria.sectionIndex) {\n return false;\n }\n if (\n criteria.headerFooterType !== undefined &&\n loc.headerFooterType !== criteria.headerFooterType\n ) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Gets revisions that have location data.\n *\n * @returns Array of revisions with location information\n */\n getRevisionsWithLocation(): Revision[] {\n return this.revisions.filter((rev) => rev.getLocation() !== undefined);\n }\n\n /**\n * Gets revisions that do NOT have location data.\n *\n * @returns Array of revisions without location information\n */\n getRevisionsWithoutLocation(): Revision[] {\n return this.revisions.filter((rev) => rev.getLocation() === undefined);\n }\n\n // ============================================================\n // Validation Methods\n // ============================================================\n\n /**\n * Validates that all revision IDs are unique.\n *\n * Per ECMA-376, revision IDs must be unique within a document.\n * Duplicate IDs can cause Word to reject the document or\n * produce unexpected behavior.\n *\n * @returns Validation result with any duplicate IDs found\n *\n * @example\n * ```typescript\n * const result = revisionManager.validateRevisionIds();\n * if (!result.valid) {\n * console.error('Duplicate IDs found:', result.duplicates);\n * }\n * ```\n */\n validateRevisionIds(): { valid: boolean; duplicates: number[] } {\n const seen = new Set<number>();\n const duplicates: number[] = [];\n\n for (const rev of this.revisions) {\n const id = rev.getId();\n if (seen.has(id)) {\n if (!duplicates.includes(id)) {\n duplicates.push(id);\n }\n }\n seen.add(id);\n }\n\n return {\n valid: duplicates.length === 0,\n duplicates,\n };\n }\n\n /**\n * Reassigns all revision IDs to ensure uniqueness.\n *\n * This is useful after merging documents or when duplicate\n * IDs are detected. IDs are reassigned sequentially starting\n * from the specified value.\n *\n * @param startId - Starting ID value (default: 0)\n * @returns Number of IDs reassigned\n *\n * @example\n * ```typescript\n * const count = revisionManager.reassignRevisionIds();\n * console.log(`Reassigned ${count} revision IDs`);\n * ```\n */\n reassignRevisionIds(startId = 0): number {\n let currentId = startId;\n\n for (const rev of this.revisions) {\n rev.setId(currentId++);\n }\n\n // Update nextId to continue from where we left off\n this.nextId = currentId;\n\n return this.revisions.length;\n }\n\n /**\n * Validates move operation pairs (moveFrom/moveTo).\n *\n * Each moveFrom must have a matching moveTo with the same moveId,\n * and vice versa. Orphaned move markers can cause document corruption.\n *\n * @returns Validation result with orphaned move IDs\n *\n * @example\n * ```typescript\n * const result = revisionManager.validateMovePairs();\n * if (!result.valid) {\n * console.error('Orphaned moveFrom IDs:', result.orphanedMoveFrom);\n * console.error('Orphaned moveTo IDs:', result.orphanedMoveTo);\n * }\n * ```\n */\n validateMovePairs(): {\n valid: boolean;\n orphanedMoveFrom: string[];\n orphanedMoveTo: string[];\n } {\n const moveFromIds = new Map<string, Revision>();\n const moveToIds = new Map<string, Revision>();\n\n for (const rev of this.revisions) {\n const moveId = rev.getMoveId();\n if (!moveId) continue;\n\n if (rev.getType() === 'moveFrom') {\n moveFromIds.set(moveId, rev);\n } else if (rev.getType() === 'moveTo') {\n moveToIds.set(moveId, rev);\n }\n }\n\n const orphanedMoveFrom: string[] = [];\n const orphanedMoveTo: string[] = [];\n\n // Find moveFrom without matching moveTo\n for (const moveId of moveFromIds.keys()) {\n if (!moveToIds.has(moveId)) {\n orphanedMoveFrom.push(moveId);\n }\n }\n\n // Find moveTo without matching moveFrom\n for (const moveId of moveToIds.keys()) {\n if (!moveFromIds.has(moveId)) {\n orphanedMoveTo.push(moveId);\n }\n }\n\n return {\n valid: orphanedMoveFrom.length === 0 && orphanedMoveTo.length === 0,\n orphanedMoveFrom,\n orphanedMoveTo,\n };\n }\n\n /**\n * Gets the highest revision ID currently in use.\n *\n * @returns Highest ID, or -1 if no revisions exist\n */\n getHighestId(): number {\n if (this.revisions.length === 0) return -1;\n return Math.max(...this.revisions.map((r) => r.getId()));\n }\n\n /**\n * Ensures the next ID is higher than all existing IDs.\n *\n * Useful after loading a document with existing revisions\n * to prevent ID conflicts with new revisions.\n */\n syncNextId(): void {\n const highestId = this.getHighestId();\n if (highestId >= this.nextId) {\n this.nextId = highestId + 1;\n }\n }\n}\n"]}