docxmlater 10.4.1 → 11.0.4

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 (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +74 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +605 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2056 -1073
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +461 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2180 -617
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -3,8 +3,8 @@
3
3
  * Provides a unified interface for reading and writing DOCX files
4
4
  */
5
5
 
6
- import { ZipReader } from './ZipReader';
7
- import { ZipWriter } from './ZipWriter';
6
+ import { ZipReader } from './ZipReader.js';
7
+ import { ZipWriter } from './ZipWriter.js';
8
8
  import {
9
9
  ZipFile,
10
10
  FileMap,
@@ -13,8 +13,8 @@ import {
13
13
  AddFileOptions,
14
14
  SizeLimitOptions,
15
15
  DEFAULT_SIZE_LIMITS,
16
- } from './types';
17
- import { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger';
16
+ } from './types.js';
17
+ import { getGlobalLogger, createScopedLogger, ILogger } from '../utils/logger.js';
18
18
 
19
19
  // Create scoped logger for ZipHandler operations
20
20
  function getLogger(): ILogger {
@@ -4,19 +4,19 @@
4
4
 
5
5
  import JSZip from 'jszip';
6
6
  import { promises as fs } from 'fs';
7
- import { ZipFile, FileMap, LoadOptions } from './types';
7
+ import { ZipFile, FileMap, LoadOptions } from './types.js';
8
8
  import {
9
9
  DocxNotFoundError,
10
10
  InvalidDocxError,
11
11
  CorruptedArchiveError,
12
12
  FileOperationError,
13
- } from './errors';
13
+ } from './errors.js';
14
14
  import {
15
15
  validateDocxStructure,
16
16
  isBinaryFile,
17
17
  normalizePath,
18
18
  isValidZipBuffer,
19
- } from '../utils/validation';
19
+ } from '../utils/validation.js';
20
20
 
21
21
  /**
22
22
  * Handles reading operations on ZIP archives
@@ -9,9 +9,9 @@
9
9
 
10
10
  import JSZip from 'jszip';
11
11
  import { promises as fs } from 'fs';
12
- import { ZipFile, FileMap, SaveOptions, AddFileOptions } from './types';
13
- import { FileOperationError } from './errors';
14
- import { validateDocxStructure, normalizePath } from '../utils/validation';
12
+ import { ZipFile, FileMap, SaveOptions, AddFileOptions } from './types.js';
13
+ import { FileOperationError } from './errors.js';
14
+ import { validateDocxStructure, normalizePath } from '../utils/validation.js';
15
15
 
16
16
  /**
17
17
  * Handles writing operations on ZIP archives with DOCX-specific compliance
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChangelogGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/ChangelogGenerator.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChangelogGenerator.js","sourceRoot":"","sources":["../../src/utils/ChangelogGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChangelogGenerator - Generates structured changelog from Word tracked changes\n *\n * Converts Word revisions (w:ins, w:del, property changes) into structured\n * changelog data with support for consolidation, categorization, and\n * multiple output formats.\n *\n * Follows ECMA-376 revision semantics.\n *\n * @module ChangelogGenerator\n */\n\nimport type { Document } from '../core/Document';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\n\n// Scoped logger for ChangelogGenerator\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'ChangelogGenerator');\n}\n\n/**\n * Semantic category for grouping changes.\n */\nexport type ChangeCategory =\n | 'content' // Text insertions, deletions\n | 'formatting' // Run/paragraph property changes\n | 'structural' // Moves, section changes\n | 'table' // Table structure changes\n | 'hyperlink' // Hyperlink URL, text, or formatting changes\n | 'image' // Image insertion, deletion, or property changes\n | 'field' // Field insertion, deletion, or value changes\n | 'comment' // Comment changes\n | 'bookmark' // Bookmark changes\n | 'contentControl'; // Content control (SDT) changes\n\n/**\n * Location of a change within the document.\n */\nexport interface ChangeLocation {\n /** Section index (0-based) */\n sectionIndex?: number;\n /** Paragraph index within body (0-based) */\n paragraphIndex: number;\n /** Run index within paragraph (0-based) */\n runIndex?: number;\n /** Nearest heading for context */\n nearestHeading?: string;\n /** Character offset within paragraph */\n characterOffset?: number;\n}\n\n/**\n * Represents a single change entry in the changelog.\n * Follows ECMA-376 revision semantics.\n */\nexport interface ChangeEntry {\n /** Unique identifier (matches revision ID) */\n id: string;\n\n /** ECMA-376 revision type */\n revisionType: RevisionType;\n\n /** Semantic category for grouping */\n category: ChangeCategory;\n\n /** Human-readable description */\n description: string;\n\n /** Author who made the change */\n author: string;\n\n /** ISO 8601 timestamp */\n date: Date;\n\n /** Location in document */\n location: ChangeLocation;\n\n /** Content details */\n content: {\n /** Text before change (for deletions/modifications) */\n before?: string;\n /** Text after change (for insertions/modifications) */\n after?: string;\n /** Affected text (for property changes) */\n affectedText?: string;\n };\n\n /** Property change details (for formatting changes) */\n propertyChange?: {\n property: string;\n oldValue?: string;\n newValue?: string;\n };\n}\n\n/**\n * Output format for changelog generation.\n */\nexport type ChangelogFormat = 'json' | 'markdown' | 'text' | 'html' | 'csv';\n\n/**\n * Options for changelog generation.\n */\nexport interface ChangelogOptions {\n /** Include formatting/property changes (default: true) */\n includeFormattingChanges?: boolean;\n /** Consolidate similar changes (default: false) */\n consolidate?: boolean;\n /** Maximum context length for descriptions (default: 50) */\n maxContextLength?: number;\n /** Filter by authors */\n filterAuthors?: string[];\n /** Filter by date range */\n filterDateRange?: { start: Date; end: Date };\n /** Filter by categories */\n filterCategories?: ChangeCategory[];\n /** Output format (default: 'markdown') */\n format?: ChangelogFormat;\n /** Sort changes by field */\n sortBy?: 'date' | 'author' | 'type' | 'category';\n /** Sort order (default: 'asc') */\n sortOrder?: 'asc' | 'desc';\n /** Group changes by element type */\n groupByElement?: boolean;\n /** Include document context (nearest heading, section) */\n includeDocumentContext?: boolean;\n}\n\n/**\n * Consolidated change grouping similar changes together.\n */\nexport interface ConsolidatedChange {\n /** Description of the consolidated change */\n description: string;\n /** Number of individual changes */\n count: number;\n /** Category of changes */\n category: ChangeCategory;\n /** Common attributes shared by all changes */\n commonAttributes: {\n author?: string;\n revisionType?: RevisionType;\n propertyChanged?: string;\n newValue?: string;\n };\n /** Individual change IDs */\n changeIds: string[];\n}\n\n/**\n * Summary statistics for changelog entries.\n */\nexport interface ChangelogSummary {\n /** Total number of changes */\n total: number;\n /** Breakdown by category */\n byCategory: Record<ChangeCategory, number>;\n /** Breakdown by revision type */\n byType: Record<string, number>;\n /** Breakdown by author */\n byAuthor: Record<string, number>;\n /** Date range of changes */\n dateRange: { earliest: Date; latest: Date } | null;\n}\n\n/**\n * Generates changelog from Word tracked changes.\n * Follows ECMA-376 revision semantics.\n */\nexport class ChangelogGenerator {\n /**\n * Generate changelog entries from a document.\n * Document must be loaded with { revisionHandling: 'preserve' }.\n *\n * @param doc - Document to extract revisions from\n * @param options - Changelog generation options\n * @returns Array of changelog entries\n */\n static fromDocument(doc: Document, options?: ChangelogOptions): ChangeEntry[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n const revisions = revisionManager.getAllRevisions();\n return this.fromRevisions(revisions, options, doc);\n }\n\n /**\n * Generate changelog entries from specific revisions.\n *\n * @param revisions - Array of revisions to convert\n * @param options - Changelog generation options\n * @param doc - Optional document for context (paragraph indices, headings)\n * @returns Array of changelog entries\n */\n static fromRevisions(\n revisions: Revision[],\n options?: ChangelogOptions,\n _doc?: Document\n ): ChangeEntry[] {\n const logger = getLogger();\n const opts = {\n includeFormattingChanges: true,\n consolidate: false,\n maxContextLength: 50,\n ...options,\n };\n\n logger.debug('Processing revisions', {\n total: revisions.length,\n filters: {\n categories: opts.filterCategories?.length ?? 0,\n authors: opts.filterAuthors?.length ?? 0,\n dateRange: !!opts.filterDateRange,\n },\n });\n\n const entries: ChangeEntry[] = [];\n let filtered = 0;\n\n for (let i = 0; i < revisions.length; i++) {\n const revision = revisions[i];\n if (!revision) continue;\n\n const category = this.categorize(revision);\n\n // Filter by category\n if (opts.filterCategories && !opts.filterCategories.includes(category)) {\n filtered++;\n continue;\n }\n\n // Filter out formatting changes if requested\n if (!opts.includeFormattingChanges && category === 'formatting') {\n filtered++;\n continue;\n }\n\n // Filter by author\n if (opts.filterAuthors && !opts.filterAuthors.includes(revision.getAuthor())) {\n filtered++;\n continue;\n }\n\n // Filter by date range\n if (opts.filterDateRange) {\n const revDate = revision.getDate();\n if (revDate < opts.filterDateRange.start || revDate > opts.filterDateRange.end) {\n filtered++;\n continue;\n }\n }\n\n const entry = this.revisionToEntry(revision, i, opts.maxContextLength);\n entries.push(entry);\n }\n\n if (filtered > 0) {\n logger.debug('Revisions filtered', { included: entries.length, filtered });\n }\n\n return entries;\n }\n\n /**\n * Convert a single revision to a changelog entry.\n *\n * @param revision - Revision to convert\n * @param index - Index for paragraph location (default location)\n * @param maxContextLength - Maximum length for text context\n * @returns Changelog entry\n */\n private static revisionToEntry(\n revision: Revision,\n index: number,\n maxContextLength: number\n ): ChangeEntry {\n const type = revision.getType();\n const category = this.categorize(revision);\n const runs = revision.getRuns();\n\n // Extract text content from runs\n const text = runs.map((r) => r.getText()).join('');\n const truncatedText =\n text.length > maxContextLength ? text.substring(0, maxContextLength) + '...' : text;\n\n // Build content object based on revision type\n const content: ChangeEntry['content'] = {};\n if (type === 'insert' || type === 'moveTo') {\n content.after = truncatedText;\n } else if (type === 'delete' || type === 'moveFrom') {\n content.before = truncatedText;\n } else if (this.isPropertyChangeType(type)) {\n content.affectedText = truncatedText;\n }\n\n // Handle hyperlink changes specially\n const prevProps = revision.getPreviousProperties();\n const newProps = revision.getNewProperties();\n if (type === 'hyperlinkChange' && (prevProps || newProps)) {\n (content as any).hyperlinkChange = {\n urlBefore: prevProps?.url,\n urlAfter: newProps?.url,\n textBefore: prevProps?.text,\n textAfter: newProps?.text,\n };\n // Set before/after for standard diff view\n if (prevProps?.url !== newProps?.url) {\n content.before = prevProps?.url;\n content.after = newProps?.url;\n } else if (prevProps?.text !== newProps?.text) {\n content.before = prevProps?.text;\n content.after = newProps?.text;\n }\n }\n\n // Build property change details if applicable\n let propertyChange: ChangeEntry['propertyChange'] | undefined;\n if (prevProps || newProps) {\n // Get the first property that changed\n const allKeys = new Set([...Object.keys(prevProps || {}), ...Object.keys(newProps || {})]);\n const firstKey = Array.from(allKeys)[0];\n if (firstKey) {\n propertyChange = {\n property: firstKey,\n oldValue: this.formatPropertyValue(prevProps?.[firstKey]),\n newValue: this.formatPropertyValue(newProps?.[firstKey]),\n };\n }\n }\n\n // Use revision's location if available, otherwise fall back to index\n const revisionLocation = revision.getLocation();\n const location: ChangeLocation = {\n paragraphIndex: revisionLocation?.paragraphIndex ?? index, // Use actual or fallback\n sectionIndex: revisionLocation?.sectionIndex,\n runIndex: revisionLocation?.runIndex,\n };\n\n return {\n id: revision.getId().toString(),\n revisionType: type,\n category,\n description: this.describeRevision(revision, maxContextLength),\n author: revision.getAuthor(),\n date: revision.getDate(),\n location,\n content,\n propertyChange,\n };\n }\n\n /**\n * Get summary statistics for changelog entries.\n *\n * @param entries - Array of changelog entries\n * @returns Summary statistics\n */\n static getSummary(entries: ChangeEntry[]): ChangelogSummary {\n const byCategory: Record<ChangeCategory, number> = {\n content: 0,\n formatting: 0,\n structural: 0,\n table: 0,\n hyperlink: 0,\n image: 0,\n field: 0,\n comment: 0,\n bookmark: 0,\n contentControl: 0,\n };\n const byType: Record<string, number> = {};\n const byAuthor: Record<string, number> = {};\n let earliest: Date | null = null;\n let latest: Date | null = null;\n\n for (const entry of entries) {\n // Count by category\n byCategory[entry.category]++;\n\n // Count by type\n byType[entry.revisionType] = (byType[entry.revisionType] || 0) + 1;\n\n // Count by author\n byAuthor[entry.author] = (byAuthor[entry.author] || 0) + 1;\n\n // Track date range\n if (!earliest || entry.date < earliest) {\n earliest = entry.date;\n }\n if (!latest || entry.date > latest) {\n latest = entry.date;\n }\n }\n\n return {\n total: entries.length,\n byCategory,\n byType,\n byAuthor,\n dateRange: earliest && latest ? { earliest, latest } : null,\n };\n }\n\n /**\n * Consolidate similar changes into groups.\n * Groups changes that share: same type, same property, same new value.\n *\n * @param entries - Array of changelog entries\n * @returns Array of consolidated changes\n */\n static consolidate(entries: ChangeEntry[]): ConsolidatedChange[] {\n const groups = new Map<string, ChangeEntry[]>();\n\n for (const entry of entries) {\n // Create grouping key\n let key = `${entry.revisionType}_${entry.category}`;\n\n // For property changes, include the property name and new value\n if (entry.propertyChange) {\n key += `_${entry.propertyChange.property}_${entry.propertyChange.newValue || ''}`;\n }\n\n // For content changes by same author, group them\n key += `_${entry.author}`;\n\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(entry);\n }\n\n const consolidated: ConsolidatedChange[] = [];\n\n for (const [_, groupEntries] of groups) {\n const first = groupEntries[0];\n if (!first) continue;\n\n let description: string;\n\n if (groupEntries.length === 1) {\n description = first.description;\n } else {\n // Generate consolidated description\n description = this.generateConsolidatedDescription(groupEntries);\n }\n\n consolidated.push({\n description,\n count: groupEntries.length,\n category: first.category,\n commonAttributes: {\n author: this.allSame(groupEntries.map((e) => e.author)) ? first.author : undefined,\n revisionType: first.revisionType,\n propertyChanged: first.propertyChange?.property,\n newValue: first.propertyChange?.newValue,\n },\n changeIds: groupEntries.map((e) => e.id),\n });\n }\n\n // Sort by count descending\n consolidated.sort((a, b) => b.count - a.count);\n\n if (entries.length > 0) {\n getLogger().info('Entries consolidated', {\n input: entries.length,\n groups: consolidated.length,\n reduction: `${Math.round((1 - consolidated.length / entries.length) * 100)}%`,\n });\n }\n\n return consolidated;\n }\n\n /**\n * Generate a consolidated description for a group of similar changes.\n */\n private static generateConsolidatedDescription(entries: ChangeEntry[]): string {\n const first = entries[0];\n if (!first) {\n return `${entries.length} changes`;\n }\n\n const count = entries.length;\n\n switch (first.revisionType) {\n case 'insert':\n return `Inserted text in ${count} locations`;\n case 'delete':\n return `Deleted text from ${count} locations`;\n case 'moveFrom':\n case 'moveTo':\n return `Moved content (${count} operations)`;\n case 'runPropertiesChange':\n if (first.propertyChange) {\n return `Changed ${first.propertyChange.property} to \"${first.propertyChange.newValue}\" (${count} times)`;\n }\n return `Changed run formatting (${count} times)`;\n case 'paragraphPropertiesChange':\n if (first.propertyChange) {\n return `Changed paragraph ${first.propertyChange.property} (${count} times)`;\n }\n return `Changed paragraph formatting (${count} times)`;\n case 'tablePropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n return `Changed table formatting (${count} times)`;\n case 'tableCellInsert':\n return `Inserted ${count} table cells`;\n case 'tableCellDelete':\n return `Deleted ${count} table cells`;\n case 'tableCellMerge':\n return `Merged table cells (${count} operations)`;\n case 'numberingChange':\n return `Changed list numbering (${count} times)`;\n case 'sectionPropertiesChange':\n return `Changed section properties (${count} times)`;\n default:\n return `${count} changes of type ${first.revisionType}`;\n }\n }\n\n /**\n * Check if all values in an array are the same.\n */\n private static allSame<T>(arr: T[]): boolean {\n if (arr.length === 0) return true;\n const first = arr[0];\n return arr.every((v) => v === first);\n }\n\n /**\n * Categorize a revision into a semantic category.\n *\n * @param revision - Revision to categorize\n * @returns Semantic category\n */\n static categorize(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n switch (type) {\n // Content changes\n case 'insert':\n case 'delete':\n return 'content';\n\n // Structural changes\n case 'moveFrom':\n case 'moveTo':\n case 'sectionPropertiesChange':\n return 'structural';\n\n // Formatting changes\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'numberingChange':\n return 'formatting';\n\n // Table changes\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'tableCellInsert':\n case 'tableCellDelete':\n case 'tableCellMerge':\n return 'table';\n\n // Hyperlink changes\n case 'hyperlinkChange':\n return 'hyperlink';\n\n // Rich content changes\n case 'imageChange':\n return 'image';\n\n case 'fieldChange':\n return 'field';\n\n case 'commentChange':\n return 'comment';\n\n case 'bookmarkChange':\n return 'bookmark';\n\n case 'contentControlChange':\n return 'contentControl';\n\n default:\n return 'content';\n }\n }\n\n /**\n * Check if a revision type is a property change type.\n */\n private static isPropertyChangeType(type: RevisionType): boolean {\n return [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n ].includes(type);\n }\n\n /**\n * Generate human-readable description for a revision.\n *\n * @param revision - Revision to describe\n * @param maxLength - Maximum length for text excerpts\n * @returns Human-readable description\n */\n static describeRevision(revision: Revision, maxLength = 50): string {\n const type = revision.getType();\n const runs = revision.getRuns();\n const text = runs.map((r) => r.getText()).join('');\n const excerpt =\n text.length > maxLength ? `\"${text.substring(0, maxLength)}...\"` : text ? `\"${text}\"` : '';\n\n switch (type) {\n case 'insert':\n return excerpt ? `Inserted ${excerpt}` : 'Inserted content';\n case 'delete':\n return excerpt ? `Deleted ${excerpt}` : 'Deleted content';\n case 'moveFrom':\n return excerpt ? `Moved ${excerpt} from here` : 'Moved content from here';\n case 'moveTo':\n return excerpt ? `Moved ${excerpt} to here` : 'Moved content to here';\n case 'runPropertiesChange':\n return this.describePropertyChange(revision, 'run formatting');\n case 'paragraphPropertiesChange':\n return this.describePropertyChange(revision, 'paragraph formatting');\n case 'tablePropertiesChange':\n return 'Changed table properties';\n case 'tableExceptionPropertiesChange':\n return 'Changed table exception properties';\n case 'tableRowPropertiesChange':\n return 'Changed table row properties';\n case 'tableCellPropertiesChange':\n return 'Changed table cell properties';\n case 'sectionPropertiesChange':\n return 'Changed section properties';\n case 'tableCellInsert':\n return 'Inserted table cell';\n case 'tableCellDelete':\n return 'Deleted table cell';\n case 'tableCellMerge':\n return 'Merged table cells';\n case 'numberingChange':\n return 'Changed list numbering';\n case 'hyperlinkChange':\n return this.describeHyperlinkChange(revision, maxLength);\n case 'imageChange':\n return this.describeImageChange(revision);\n case 'fieldChange':\n return this.describeFieldChange(revision);\n case 'commentChange':\n return this.describeCommentChange(revision);\n case 'bookmarkChange':\n return this.describeBookmarkChange(revision);\n case 'contentControlChange':\n return this.describeContentControlChange(revision);\n default:\n return `Changed (${type})`;\n }\n }\n\n /**\n * Generate description for a hyperlink change revision.\n */\n private static describeHyperlinkChange(revision: Revision, _maxLength: number): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n const changes: string[] = [];\n\n if (prevProps.url !== newProps.url) {\n changes.push('URL');\n }\n if (prevProps.text !== newProps.text) {\n changes.push('display text');\n }\n if (prevProps.formatting !== newProps.formatting) {\n changes.push('formatting');\n }\n\n if (changes.length === 0) {\n return 'Updated hyperlink';\n }\n\n return `Changed hyperlink ${changes.join(' and ')}`;\n }\n\n /**\n * Generate description for an image change revision.\n */\n private static describeImageChange(revision: Revision): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n const changes: string[] = [];\n\n // Detect type of change\n if (!prevProps.imageId && newProps.imageId) {\n return `Inserted image${newProps.filename ? ` \"${newProps.filename}\"` : ''}`;\n }\n if (prevProps.imageId && !newProps.imageId) {\n return `Deleted image${prevProps.filename ? ` \"${prevProps.filename}\"` : ''}`;\n }\n\n // Property changes\n if (prevProps.width !== newProps.width || prevProps.height !== newProps.height) {\n changes.push('size');\n }\n if (prevProps.position !== newProps.position) {\n changes.push('position');\n }\n if (prevProps.wrapping !== newProps.wrapping) {\n changes.push('wrapping');\n }\n if (prevProps.altText !== newProps.altText) {\n changes.push('alt text');\n }\n\n if (changes.length === 0) {\n return 'Updated image';\n }\n\n return `Changed image ${changes.join(' and ')}`;\n }\n\n /**\n * Generate description for a field change revision.\n */\n private static describeFieldChange(revision: Revision): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n\n // Detect type of change\n if (!prevProps.fieldType && newProps.fieldType) {\n return `Inserted ${newProps.fieldType || 'field'}`;\n }\n if (prevProps.fieldType && !newProps.fieldType) {\n return `Deleted ${prevProps.fieldType || 'field'}`;\n }\n\n // Value/formula changes\n if (prevProps.value !== newProps.value) {\n return `Updated ${newProps.fieldType || 'field'} value`;\n }\n if (prevProps.formula !== newProps.formula) {\n return `Changed ${newProps.fieldType || 'field'} formula`;\n }\n\n return `Updated ${newProps.fieldType || 'field'}`;\n }\n\n /**\n * Generate description for a comment change revision.\n */\n private static describeCommentChange(revision: Revision): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n\n // Detect type of change\n if (!prevProps.commentId && newProps.commentId) {\n return `Added comment${newProps.author ? ` by ${newProps.author}` : ''}`;\n }\n if (prevProps.commentId && !newProps.commentId) {\n return `Deleted comment${prevProps.author ? ` by ${prevProps.author}` : ''}`;\n }\n if (prevProps.text !== newProps.text) {\n return `Edited comment${newProps.author ? ` by ${newProps.author}` : ''}`;\n }\n\n return 'Updated comment';\n }\n\n /**\n * Generate description for a bookmark change revision.\n */\n private static describeBookmarkChange(revision: Revision): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n\n // Detect type of change\n if (!prevProps.bookmarkId && newProps.bookmarkId) {\n return `Created bookmark \"${newProps.name || 'unnamed'}\"`;\n }\n if (prevProps.bookmarkId && !newProps.bookmarkId) {\n return `Deleted bookmark \"${prevProps.name || 'unnamed'}\"`;\n }\n if (prevProps.name !== newProps.name) {\n return `Renamed bookmark from \"${prevProps.name}\" to \"${newProps.name}\"`;\n }\n if (prevProps.rangeStart !== newProps.rangeStart || prevProps.rangeEnd !== newProps.rangeEnd) {\n return `Changed bookmark \"${newProps.name || 'unnamed'}\" range`;\n }\n\n return `Updated bookmark \"${newProps.name || prevProps.name || 'unnamed'}\"`;\n }\n\n /**\n * Generate description for a content control change revision.\n */\n private static describeContentControlChange(revision: Revision): string {\n const prevProps = revision.getPreviousProperties() || {};\n const newProps = revision.getNewProperties() || {};\n\n // Detect type of change\n if (!prevProps.sdtId && newProps.sdtId) {\n return `Inserted content control${newProps.title ? ` \"${newProps.title}\"` : ''}`;\n }\n if (prevProps.sdtId && !newProps.sdtId) {\n return `Deleted content control${prevProps.title ? ` \"${prevProps.title}\"` : ''}`;\n }\n if (prevProps.title !== newProps.title) {\n return `Renamed content control to \"${newProps.title}\"`;\n }\n if (prevProps.content !== newProps.content) {\n return `Changed content control${newProps.title ? ` \"${newProps.title}\"` : ''} content`;\n }\n\n return `Updated content control${newProps.title || prevProps.title ? ` \"${newProps.title || prevProps.title}\"` : ''}`;\n }\n\n /**\n * Generate description for a property change revision.\n */\n private static describePropertyChange(revision: Revision, context: string): string {\n const prevProps = revision.getPreviousProperties();\n const newProps = revision.getNewProperties();\n\n if (!prevProps && !newProps) {\n return `Changed ${context}`;\n }\n\n // Get meaningful property names\n const propNames: string[] = [];\n const allKeys = new Set([...Object.keys(prevProps || {}), ...Object.keys(newProps || {})]);\n\n for (const key of allKeys) {\n const oldVal = prevProps?.[key];\n const newVal = newProps?.[key];\n if (oldVal !== newVal) {\n propNames.push(this.friendlyPropertyName(key));\n }\n }\n\n if (propNames.length === 0) {\n return `Changed ${context}`;\n }\n\n if (propNames.length === 1) {\n return `Changed ${propNames[0]}`;\n }\n\n if (propNames.length <= 3) {\n return `Changed ${propNames.join(', ')}`;\n }\n\n return `Changed ${propNames.slice(0, 2).join(', ')} and ${propNames.length - 2} more`;\n }\n\n /**\n * Format a property value for display.\n * Handles objects, arrays, and primitives properly.\n */\n private static formatPropertyValue(value: unknown): string | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === 'object') {\n try {\n // For objects, use JSON.stringify for proper representation\n const json = JSON.stringify(value);\n // Truncate if too long\n return json.length > 100 ? json.substring(0, 97) + '...' : json;\n } catch (e) {\n getLogger().warn('Failed to stringify value for changelog', { error: String(e) });\n return '[complex value]';\n }\n }\n // For primitives, use String() for safe conversion\n return String(value);\n }\n\n /**\n * Convert property key to friendly name.\n */\n private static friendlyPropertyName(key: string): string {\n const friendlyNames: Record<string, string> = {\n // Run (character) properties\n b: 'bold',\n i: 'italic',\n u: 'underline',\n strike: 'strikethrough',\n dstrike: 'double strikethrough',\n sz: 'font size',\n szCs: 'complex script font size',\n color: 'text color',\n highlight: 'highlight',\n rFonts: 'font',\n rStyle: 'character style',\n vertAlign: 'vertical alignment',\n vanish: 'hidden text',\n caps: 'all capitals',\n smallCaps: 'small capitals',\n outline: 'outline effect',\n shadow: 'shadow effect',\n emboss: 'emboss effect',\n imprint: 'imprint effect',\n kern: 'kerning',\n w: 'character width',\n spacing: 'character spacing',\n position: 'text position',\n shd: 'shading',\n bdr: 'border',\n lang: 'language',\n eastAsianLayout: 'East Asian layout',\n specVanish: 'special vanish',\n oMath: 'math mode',\n\n // Paragraph properties\n jc: 'alignment',\n ind: 'indentation',\n pStyle: 'paragraph style',\n numPr: 'list numbering',\n pBdr: 'paragraph border',\n tabs: 'tab stops',\n suppressAutoHyphens: 'hyphenation',\n kinsoku: 'kinsoku rules',\n wordWrap: 'word wrap',\n overflowPunct: 'overflow punctuation',\n topLinePunct: 'top line punctuation',\n autoSpaceDE: 'auto space (DE)',\n autoSpaceDN: 'auto space (DN)',\n bidi: 'bidirectional',\n adjustRightInd: 'right indent adjustment',\n snapToGrid: 'snap to grid',\n contextualSpacing: 'contextual spacing',\n mirrorIndents: 'mirror indents',\n suppressOverlap: 'suppress overlap',\n outlineLvl: 'outline level',\n divId: 'HTML division',\n keepNext: 'keep with next',\n keepLines: 'keep lines together',\n pageBreakBefore: 'page break before',\n widowControl: 'widow/orphan control',\n suppressLineNumbers: 'suppress line numbers',\n textboxTightWrap: 'textbox tight wrap',\n\n // Table properties\n tblStyle: 'table style',\n tblW: 'table width',\n tblInd: 'table indent',\n tblBorders: 'table borders',\n tblCellMar: 'table cell margins',\n tblLook: 'table look',\n tblLayout: 'table layout',\n gridSpan: 'column span',\n vMerge: 'vertical merge',\n tcW: 'cell width',\n tcBorders: 'cell borders',\n vAlign: 'vertical alignment',\n textDirection: 'text direction',\n noWrap: 'no wrap',\n tcMar: 'cell margins',\n tcFitText: 'fit text',\n hideMark: 'hide mark',\n\n // Section properties\n sectPr: 'section properties',\n pgSz: 'page size',\n pgMar: 'page margins',\n cols: 'columns',\n docGrid: 'document grid',\n headerReference: 'header',\n footerReference: 'footer',\n pgNumType: 'page numbering',\n formProt: 'form protection',\n titlePg: 'different first page',\n type: 'section type',\n };\n\n return friendlyNames[key] || key;\n }\n\n /**\n * Export changelog to Markdown format.\n *\n * @param entries - Array of changelog entries\n * @param options - Export options\n * @returns Markdown string\n */\n static toMarkdown(entries: ChangeEntry[], options?: { includeMetadata?: boolean }): string {\n const opts = { includeMetadata: true, ...options };\n const lines: string[] = [];\n\n lines.push('# Document Changes');\n lines.push('');\n\n if (opts.includeMetadata) {\n const summary = this.getSummary(entries);\n lines.push(`**Total Changes:** ${summary.total}`);\n lines.push('');\n\n if (summary.dateRange) {\n lines.push(\n `**Date Range:** ${summary.dateRange.earliest.toLocaleDateString()} - ${summary.dateRange.latest.toLocaleDateString()}`\n );\n lines.push('');\n }\n\n const authors = Object.keys(summary.byAuthor);\n if (authors.length > 0) {\n lines.push(`**Authors:** ${authors.join(', ')}`);\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n }\n\n // Group by category\n const byCategory = new Map<ChangeCategory, ChangeEntry[]>();\n for (const entry of entries) {\n if (!byCategory.has(entry.category)) {\n byCategory.set(entry.category, []);\n }\n byCategory.get(entry.category)!.push(entry);\n }\n\n const categoryTitles: Record<ChangeCategory, string> = {\n content: 'Content Changes',\n formatting: 'Formatting Changes',\n structural: 'Structural Changes',\n table: 'Table Changes',\n hyperlink: 'Hyperlink Changes',\n image: 'Image Changes',\n field: 'Field Changes',\n comment: 'Comment Changes',\n bookmark: 'Bookmark Changes',\n contentControl: 'Content Control Changes',\n };\n\n for (const [category, categoryEntries] of byCategory) {\n if (categoryEntries.length === 0) continue;\n\n lines.push(`## ${categoryTitles[category]}`);\n lines.push('');\n\n for (const entry of categoryEntries) {\n const date = entry.date.toLocaleDateString();\n lines.push(`- ${entry.description} *(${entry.author}, ${date})*`);\n\n if (entry.content.before) {\n lines.push(` - Removed: \"${entry.content.before}\"`);\n }\n if (entry.content.after) {\n lines.push(` - Added: \"${entry.content.after}\"`);\n }\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Export changelog to plain text format.\n *\n * @param entries - Array of changelog entries\n * @returns Plain text string\n */\n static toPlainText(entries: ChangeEntry[]): string {\n const lines: string[] = [];\n\n lines.push('DOCUMENT CHANGES');\n lines.push('================');\n lines.push('');\n\n for (const entry of entries) {\n const date = entry.date.toLocaleDateString();\n lines.push(`[${date}] ${entry.author}: ${entry.description}`);\n\n if (entry.content.before) {\n lines.push(` - ${entry.content.before}`);\n }\n if (entry.content.after) {\n lines.push(` + ${entry.content.after}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Export changelog to JSON (for programmatic consumption).\n *\n * @param entries - Array of changelog entries\n * @returns JSON string\n */\n static toJSON(entries: ChangeEntry[]): string {\n return JSON.stringify(\n {\n generated: new Date().toISOString(),\n summary: this.getSummary(entries),\n entries,\n },\n null,\n 2\n );\n }\n\n // ============================================================\n // Unified API (Phase 2 Enhancement)\n // ============================================================\n\n /**\n * Unified changelog generation - single entry point for all formats.\n *\n * Generates changelog from a document in the specified format.\n * This is the recommended method for most use cases.\n *\n * @param doc - Document to extract revisions from\n * @param options - Generation options including format\n * @returns Formatted changelog string\n *\n * @example\n * ```typescript\n * // Generate Markdown changelog\n * const md = ChangelogGenerator.generate(doc, { format: 'markdown' });\n *\n * // Generate HTML changelog\n * const html = ChangelogGenerator.generate(doc, { format: 'html' });\n *\n * // Generate CSV with filtering\n * const csv = ChangelogGenerator.generate(doc, {\n * format: 'csv',\n * filterAuthors: ['John Doe'],\n * sortBy: 'date',\n * sortOrder: 'desc'\n * });\n * ```\n */\n static generate(doc: Document, options?: ChangelogOptions): string {\n const logger = getLogger();\n const format = options?.format || 'markdown';\n\n logger.info('Generating changelog', { format });\n\n // Get entries with filtering\n let entries = this.fromDocument(doc, options);\n\n // Apply sorting if specified\n if (options?.sortBy) {\n entries = this.sortEntries(entries, options.sortBy, options.sortOrder || 'asc');\n }\n\n logger.info('Changelog entries processed', {\n entries: entries.length,\n format,\n sorted: !!options?.sortBy,\n });\n\n // Generate output in specified format\n switch (format) {\n case 'json':\n return this.toJSON(entries);\n case 'markdown':\n return this.toMarkdown(entries, { includeMetadata: true });\n case 'text':\n return this.toPlainText(entries);\n case 'html':\n return this.toHTML(entries, options);\n case 'csv':\n return this.toCSV(entries);\n default:\n return this.toMarkdown(entries);\n }\n }\n\n /**\n * Export changelog to HTML format.\n *\n * Generates a complete HTML document with styling and structure.\n *\n * @param entries - Array of changelog entries\n * @param options - HTML generation options\n * @returns Complete HTML document string\n *\n * @example\n * ```typescript\n * const html = ChangelogGenerator.toHTML(entries);\n * fs.writeFileSync('changelog.html', html);\n * ```\n */\n static toHTML(entries: ChangeEntry[], _options?: ChangelogOptions): string {\n const summary = this.getSummary(entries);\n\n // Group entries by category\n const byCategory = new Map<ChangeCategory, ChangeEntry[]>();\n for (const entry of entries) {\n if (!byCategory.has(entry.category)) {\n byCategory.set(entry.category, []);\n }\n byCategory.get(entry.category)!.push(entry);\n }\n\n const categoryTitles: Record<ChangeCategory, string> = {\n content: 'Content Changes',\n formatting: 'Formatting Changes',\n structural: 'Structural Changes',\n table: 'Table Changes',\n hyperlink: 'Hyperlink Changes',\n image: 'Image Changes',\n field: 'Field Changes',\n comment: 'Comment Changes',\n bookmark: 'Bookmark Changes',\n contentControl: 'Content Control Changes',\n };\n\n // Build HTML\n let html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Document Changes</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n max-width: 900px;\n margin: 0 auto;\n padding: 20px;\n line-height: 1.6;\n color: #333;\n }\n h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }\n h2 { color: #34495e; margin-top: 30px; }\n .summary { background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 20px; }\n .summary p { margin: 5px 0; }\n .category { margin-bottom: 30px; }\n .change-list { list-style: none; padding: 0; }\n .change-item {\n background: #fff;\n border: 1px solid #e9ecef;\n border-radius: 6px;\n padding: 12px 15px;\n margin-bottom: 10px;\n }\n .change-item:hover { box-shadow: 0 2px 5px rgba(0,0,0,0.1); }\n .change-description { font-weight: 500; color: #2c3e50; }\n .change-meta { font-size: 0.85em; color: #7f8c8d; margin-top: 5px; }\n .change-content { margin-top: 8px; font-size: 0.9em; }\n .removed { color: #c0392b; text-decoration: line-through; }\n .added { color: #27ae60; }\n .badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 0.75em;\n font-weight: 600;\n text-transform: uppercase;\n }\n .badge-insert { background: #d4edda; color: #155724; }\n .badge-delete { background: #f8d7da; color: #721c24; }\n .badge-formatting { background: #cce5ff; color: #004085; }\n .badge-structural { background: #fff3cd; color: #856404; }\n .badge-table { background: #e2e3e5; color: #383d41; }\n </style>\n</head>\n<body>\n <h1>Document Changes</h1>\n\n <div class=\"summary\">\n <p><strong>Total Changes:</strong> ${summary.total}</p>`;\n\n if (summary.dateRange) {\n html += `\n <p><strong>Date Range:</strong> ${summary.dateRange.earliest.toLocaleDateString()} - ${summary.dateRange.latest.toLocaleDateString()}</p>`;\n }\n\n const authors = Object.keys(summary.byAuthor);\n if (authors.length > 0) {\n html += `\n <p><strong>Authors:</strong> ${authors.join(', ')}</p>`;\n }\n\n html += `\n </div>\n`;\n\n // Add sections by category\n for (const [category, categoryEntries] of byCategory) {\n if (categoryEntries.length === 0) continue;\n\n html += `\n <section class=\"category\">\n <h2>${categoryTitles[category]}</h2>\n <ul class=\"change-list\">`;\n\n for (const entry of categoryEntries) {\n const badgeClass = this.getBadgeClass(entry.revisionType);\n const date = entry.date.toLocaleDateString();\n\n html += `\n <li class=\"change-item\">\n <span class=\"badge ${badgeClass}\">${entry.revisionType}</span>\n <div class=\"change-description\">${this.escapeHTML(entry.description)}</div>\n <div class=\"change-meta\">${this.escapeHTML(entry.author)} - ${date}</div>`;\n\n if (entry.content.before || entry.content.after) {\n html += `\n <div class=\"change-content\">`;\n if (entry.content.before) {\n html += `<span class=\"removed\">${this.escapeHTML(entry.content.before || '')}</span> `;\n }\n if (entry.content.after) {\n html += `<span class=\"added\">${this.escapeHTML(entry.content.after || '')}</span>`;\n }\n html += `</div>`;\n }\n\n html += `\n </li>`;\n }\n\n html += `\n </ul>\n </section>`;\n }\n\n html += `\n</body>\n</html>`;\n\n return html;\n }\n\n /**\n * Export changelog to CSV format.\n *\n * Generates CSV data suitable for spreadsheet applications.\n *\n * @param entries - Array of changelog entries\n * @param options - CSV generation options\n * @returns CSV string\n *\n * @example\n * ```typescript\n * const csv = ChangelogGenerator.toCSV(entries);\n * fs.writeFileSync('changelog.csv', csv);\n * ```\n */\n static toCSV(\n entries: ChangeEntry[],\n options?: {\n delimiter?: string;\n includeHeaders?: boolean;\n }\n ): string {\n const delimiter = options?.delimiter || ',';\n const includeHeaders = options?.includeHeaders !== false;\n\n const headers = [\n 'ID',\n 'Type',\n 'Category',\n 'Author',\n 'Date',\n 'Description',\n 'Before',\n 'After',\n 'Paragraph',\n 'Run',\n ];\n\n const lines: string[] = [];\n\n if (includeHeaders) {\n lines.push(headers.join(delimiter));\n }\n\n for (const entry of entries) {\n const row = [\n entry.id,\n entry.revisionType,\n entry.category,\n this.escapeCSV(entry.author),\n entry.date.toISOString(),\n this.escapeCSV(entry.description),\n this.escapeCSV(entry.content.before || ''),\n this.escapeCSV(entry.content.after || ''),\n entry.location.paragraphIndex?.toString() || '',\n entry.location.runIndex?.toString() || '',\n ];\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Get timeline view - changes organized by date.\n *\n * Groups changelog entries by date (YYYY-MM-DD) for timeline visualization.\n *\n * @param entries - Array of changelog entries\n * @returns Map of date strings to entries for that date\n *\n * @example\n * ```typescript\n * const timeline = ChangelogGenerator.getTimeline(entries);\n * for (const [date, dayEntries] of timeline) {\n * console.log(`${date}: ${dayEntries.length} changes`);\n * }\n * ```\n */\n static getTimeline(entries: ChangeEntry[]): Map<string, ChangeEntry[]> {\n const timeline = new Map<string, ChangeEntry[]>();\n\n for (const entry of entries) {\n const dateKey = entry.date.toISOString().split('T')[0]!; // YYYY-MM-DD\n if (!timeline.has(dateKey)) {\n timeline.set(dateKey, []);\n }\n timeline.get(dateKey)!.push(entry);\n }\n\n // Sort the map by date\n const sortedTimeline = new Map<string, ChangeEntry[]>(\n [...timeline.entries()].sort((a, b) => a[0].localeCompare(b[0]))\n );\n\n return sortedTimeline;\n }\n\n /**\n * Get summary by element type.\n *\n * Groups entries by the type of document element they affect.\n *\n * @param entries - Array of changelog entries\n * @returns Object with entries grouped by element type\n */\n static getSummaryByElement(entries: ChangeEntry[]): {\n paragraphs: ChangeEntry[];\n tables: ChangeEntry[];\n sections: ChangeEntry[];\n runs: ChangeEntry[];\n hyperlinks: ChangeEntry[];\n } {\n return {\n paragraphs: entries.filter(\n (e) =>\n e.revisionType === 'paragraphPropertiesChange' ||\n e.revisionType === 'numberingChange' ||\n (e.revisionType === 'insert' && !e.location.runIndex) ||\n (e.revisionType === 'delete' && !e.location.runIndex)\n ),\n tables: entries.filter((e) =>\n [\n 'tablePropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableCellInsert',\n 'tableCellDelete',\n 'tableCellMerge',\n ].includes(e.revisionType)\n ),\n sections: entries.filter((e) => e.revisionType === 'sectionPropertiesChange'),\n runs: entries.filter(\n (e) =>\n e.revisionType === 'runPropertiesChange' ||\n (e.revisionType === 'insert' && e.location.runIndex !== undefined) ||\n (e.revisionType === 'delete' && e.location.runIndex !== undefined)\n ),\n hyperlinks: entries.filter((e) => e.revisionType === 'hyperlinkChange'),\n };\n }\n\n // ============================================================\n // Helper Methods\n // ============================================================\n\n /**\n * Sort entries by specified field.\n * @internal\n */\n private static sortEntries(\n entries: ChangeEntry[],\n sortBy: 'date' | 'author' | 'type' | 'category',\n order: 'asc' | 'desc'\n ): ChangeEntry[] {\n const sorted = [...entries].sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'date':\n comparison = a.date.getTime() - b.date.getTime();\n break;\n case 'author':\n comparison = a.author.localeCompare(b.author);\n break;\n case 'type':\n comparison = a.revisionType.localeCompare(b.revisionType);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n }\n\n return order === 'desc' ? -comparison : comparison;\n });\n\n return sorted;\n }\n\n /**\n * Get CSS badge class for revision type.\n * @internal\n */\n private static getBadgeClass(type: RevisionType): string {\n switch (type) {\n case 'insert':\n case 'moveTo':\n case 'tableCellInsert':\n return 'badge-insert';\n case 'delete':\n case 'moveFrom':\n case 'tableCellDelete':\n return 'badge-delete';\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'numberingChange':\n return 'badge-formatting';\n case 'sectionPropertiesChange':\n return 'badge-structural';\n case 'tablePropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'tableCellMerge':\n return 'badge-table';\n default:\n return 'badge-formatting';\n }\n }\n\n /**\n * Escape HTML special characters.\n * @internal\n */\n private static escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n\n /**\n * Escape CSV special characters.\n * @internal\n */\n private static escapeCSV(str: string): string {\n // If string contains delimiter, newline, or quotes, wrap in quotes\n if (str.includes(',') || str.includes('\\n') || str.includes('\"')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CompatibilityUpgrader.d.ts","sourceRoot":"","sources":["../../src/utils/CompatibilityUpgrader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,CAAC;IAGhB,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,aAAa,EAAE,MAAM,EAAE,CAAC;IAGxB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBAAa,qBAAqB;IAchC,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,YAAY,SAAK,GAChB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE;IA4IzC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAyBD,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAMtC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CompatibilityUpgrader.js","sourceRoot":"","sources":["../../src/utils/CompatibilityUpgrader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompatibilityUpgrader — Upgrades w:compat block in settings.xml to modern format.\n *\n * Equivalent to Word's File > Info > Convert operation for the compatibility\n * settings portion. Removes legacy boolean compat flags, updates compatSetting\n * entries, and manages modern namespaces.\n *\n * @module\n */\n\nimport {\n LEGACY_COMPAT_ELEMENT_NAMES,\n MODERN_COMPAT_SETTINGS,\n MS_WORD_COMPAT_URI,\n} from '../constants/legacyCompatFlags';\nimport type { CompatSetting } from '../types/compatibility-types';\n\n/**\n * Report of what changed during an upgrade operation.\n */\nexport interface UpgradeReport {\n /** Previous compatibility mode value (11, 12, 14, or 15) */\n previousMode: number;\n\n /** New compatibility mode (always 15 after upgrade) */\n newMode: number;\n\n /** Legacy compat flags that were removed (without w: prefix) */\n removedFlags: string[];\n\n /** Modern settings that were added (setting names) */\n addedSettings: string[];\n\n /** Whether namespaces were expanded */\n namespacesExpanded: boolean;\n\n /** Whether any changes were actually made (false if already mode 15 with no legacy flags) */\n changed: boolean;\n}\n\n/**\n * Upgrades w:compat blocks in settings.xml to modern Word 2013+ format.\n */\nexport class CompatibilityUpgrader {\n /**\n * Upgrades the w:compat block in settings.xml to mode 15.\n *\n * Operations performed:\n * 1. Remove all legacy boolean compat elements\n * 2. Remove existing Microsoft-URI w:compatSetting entries\n * 3. Insert modern w:compatSetting entries\n * 4. Preserve non-Microsoft w:compatSetting entries (custom URIs)\n *\n * @param settingsXml - The raw settings.xml content\n * @param previousMode - The current compatibility mode value (for the report)\n * @returns Object with upgraded XML and an UpgradeReport\n */\n static upgradeCompatBlock(\n settingsXml: string,\n previousMode = 12\n ): { xml: string; report: UpgradeReport } {\n const removedFlags: string[] = [];\n const addedSettings: string[] = [];\n\n // Check if already mode 15 with no legacy flags\n const compatBlockMatch = /<w:compat>([\\s\\S]*?)<\\/w:compat>/.exec(settingsXml);\n const selfClosingCompat = /<w:compat\\s*\\/>/.exec(settingsXml);\n\n if (!compatBlockMatch && !selfClosingCompat) {\n // No w:compat block — insert a full modern block before </w:settings>\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<\\/w:settings>/, modernBlock + '\\n</w:settings>');\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Handle self-closing <w:compat/>\n if (selfClosingCompat) {\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(MODERN_COMPAT_SETTINGS);\n const xml = settingsXml.replace(/<w:compat\\s*\\/>/, modernBlock);\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n addedSettings.push(s.name);\n }\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed: true,\n },\n };\n }\n\n // Process existing w:compat block\n const compatBlock = compatBlockMatch![1] ?? '';\n\n // 1. Find and record legacy flags that will be removed\n const legacyFlagRegex = /<w:(\\w+)(?:\\s[^>]*)?\\/?>/g;\n let flagMatch;\n while ((flagMatch = legacyFlagRegex.exec(compatBlock)) !== null) {\n const tagName = flagMatch[1];\n if (tagName && tagName !== 'compatSetting' && LEGACY_COMPAT_ELEMENT_NAMES.has(tagName)) {\n removedFlags.push(tagName);\n }\n }\n\n // 2. Collect non-Microsoft compatSetting entries to preserve\n const preservedSettings: CompatSetting[] = [];\n const settingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let settingMatch;\n while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {\n const attrs = settingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const valMatch = /w:val\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n\n if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {\n // Preserve settings with non-Microsoft URIs\n if (uriMatch[1] !== MS_WORD_COMPAT_URI) {\n preservedSettings.push({\n name: nameMatch[1],\n uri: uriMatch[1],\n val: valMatch[1],\n });\n }\n }\n }\n\n // 3. Determine which modern settings are actually new\n const existingMsSettings = new Set<string>();\n const existingSettingRegex = /<w:compatSetting\\s+([^>]*)\\/?\\s*>/g;\n let existingMatch;\n while ((existingMatch = existingSettingRegex.exec(compatBlock)) !== null) {\n const attrs = existingMatch[1] ?? '';\n const nameMatch = /w:name\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n const uriMatch = /w:uri\\s*=\\s*\"([^\"]*)\"/.exec(attrs);\n if (nameMatch?.[1] && uriMatch?.[1] && uriMatch[1] === MS_WORD_COMPAT_URI) {\n existingMsSettings.add(nameMatch[1]);\n }\n }\n\n for (const s of MODERN_COMPAT_SETTINGS) {\n if (!existingMsSettings.has(s.name)) {\n addedSettings.push(s.name);\n }\n }\n // compatibilityMode value change counts as \"added\" if it existed but with different val\n if (existingMsSettings.has('compatibilityMode') && previousMode !== 15) {\n if (!addedSettings.includes('compatibilityMode')) {\n addedSettings.push('compatibilityMode');\n }\n }\n\n // 4. Build the new compat block\n const allSettings = [...MODERN_COMPAT_SETTINGS, ...preservedSettings];\n const modernBlock = CompatibilityUpgrader.buildModernCompatBlock(allSettings);\n\n // 5. Replace the old block\n const changed = removedFlags.length > 0 || addedSettings.length > 0 || previousMode !== 15;\n const xml = settingsXml.replace(/<w:compat>[\\s\\S]*?<\\/w:compat>/, modernBlock);\n\n return {\n xml,\n report: {\n previousMode,\n newMode: 15,\n removedFlags,\n addedSettings,\n namespacesExpanded: false,\n changed,\n },\n };\n }\n\n /**\n * Ensures namespace declarations include all modern extended namespaces\n * (w14, w15, w16se, w16cid, etc.) and returns the expanded set.\n *\n * @param namespaces - Current namespace record from document\n * @returns Updated namespace record with modern namespaces added\n */\n static ensureModernNamespaces(namespaces: Record<string, string>): {\n namespaces: Record<string, string>;\n expanded: boolean;\n } {\n const result = { ...namespaces };\n let expanded = false;\n\n const modernNamespaces: Record<string, string> = {\n 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',\n 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',\n 'xmlns:w16se': 'http://schemas.microsoft.com/office/word/2015/wordml/symex',\n 'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n };\n\n for (const [key, value] of Object.entries(modernNamespaces)) {\n if (!result[key]) {\n result[key] = value;\n expanded = true;\n }\n }\n\n return { namespaces: result, expanded };\n }\n\n /**\n * Builds a <w:compat> block XML string from an array of compat settings.\n * Does not include legacy boolean flags (they are stripped during upgrade).\n */\n private static buildModernCompatBlock(settings: CompatSetting[]): string {\n const entries = settings.map(\n (s) => ` <w:compatSetting w:name=\"${s.name}\" w:uri=\"${s.uri}\" w:val=\"${s.val}\"/>`\n );\n return `<w:compat>\\n${entries.join('\\n')}\\n </w:compat>`;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"InMemoryRevisionAcceptor.d.ts","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAgB9D,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,qBAAqB;IAEpC,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AA+BD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkEzD;AAaD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CA2PvB;AAuLD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWnE;AAKD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAG1E;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAa7E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"InMemoryRevisionAcceptor.js","sourceRoot":"","sources":["../../src/utils/InMemoryRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * InMemoryRevisionAcceptor - Accept revisions by transforming the in-memory object model\n *\n * This approach follows the industry standard (OpenXML PowerTools, Aspose.Words):\n * - Transforms Revision objects in paragraph.content[] to their \"accepted\" state\n * - For insertions: Unwrap - extract child Runs/Hyperlinks into parent paragraph\n * - For deletions: Remove - delete the revision and its content from the model\n * - For property changes: Remove the change metadata, keep the current formatting\n *\n * Unlike the raw XML approach (acceptRevisions.ts), this allows subsequent modifications\n * to the in-memory model to be correctly serialized on save().\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138(v=office.12)\n */\n\nimport type { Document } from '../core/Document';\nimport { Paragraph } from '../elements/Paragraph';\nimport type { ParagraphContent } from '../elements/Paragraph';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { isRunContent, isHyperlinkContent, isImageRunContent } from '../elements/RevisionContent';\nimport { ComplexField } from '../elements/Field';\nimport { Table } from '../elements/Table';\nimport { getGlobalLogger, createScopedLogger, ILogger } from './logger';\n\n/**\n * Get scoped logger for this module\n */\nfunction getLogger(): ILogger {\n return createScopedLogger(getGlobalLogger(), 'InMemoryRevisionAcceptor');\n}\n\n/**\n * Options for accepting revisions\n */\nexport interface AcceptRevisionsOptions {\n /** Accept insertion revisions (w:ins) - default: true */\n acceptInsertions?: boolean;\n /** Accept deletion revisions (w:del) - default: true */\n acceptDeletions?: boolean;\n /** Accept move operations (w:moveFrom, w:moveTo) - default: true */\n acceptMoves?: boolean;\n /** Accept property change revisions (rPrChange, pPrChange, etc.) - default: true */\n acceptPropertyChanges?: boolean;\n /** Remove empty tables after revision acceptance - default: true */\n cleanupEmptyTables?: boolean;\n}\n\n/**\n * Result of accepting revisions\n */\nexport interface AcceptRevisionsResult {\n /** Number of insertions accepted */\n insertionsAccepted: number;\n /** Number of deletions accepted */\n deletionsAccepted: number;\n /** Number of move operations accepted */\n movesAccepted: number;\n /** Number of property changes accepted */\n propertyChangesAccepted: number;\n /** Total revisions processed */\n totalAccepted: number;\n /** Number of empty tables removed during cleanup */\n emptyTablesRemoved: number;\n}\n\n/**\n * Revision types that represent property/formatting changes\n */\nconst PROPERTY_REVISION_TYPES: RevisionType[] = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n];\n\n/**\n * Strip revision markup from raw XML string.\n * Used for nested tables stored as raw XML that cannot be processed via the in-memory model.\n *\n * Follows the same rules as the main revision acceptor:\n * - Insertions: Keep content, remove wrapper tags\n * - Deletions: Remove entirely (content and tags)\n * - MoveFrom: Remove entirely (source of move)\n * - MoveTo: Keep content, remove wrapper\n * - Property changes: Remove change tracking elements\n * - Range markers: Remove boundary markers\n *\n * @param xml - Raw XML string containing revision markup\n * @returns Cleaned XML with revisions accepted\n */\nexport function stripRevisionsFromXml(xml: string): string {\n let result = xml;\n\n // Step 1: Remove range markers (must be done first)\n const rangePatterns = [\n /<w:moveFromRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeStart>)/gs,\n /<w:moveFromRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveFromRangeEnd>)/gs,\n /<w:moveToRangeStart[^>]*(?:\\/>|>.*?<\\/w:moveToRangeStart>)/gs,\n /<w:moveToRangeEnd[^>]*(?:\\/>|>.*?<\\/w:moveToRangeEnd>)/gs,\n /<w:customXmlInsRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeStart>)/gs,\n /<w:customXmlInsRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlInsRangeEnd>)/gs,\n /<w:customXmlDelRangeStart[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeStart>)/gs,\n /<w:customXmlDelRangeEnd[^>]*(?:\\/>|>.*?<\\/w:customXmlDelRangeEnd>)/gs,\n ];\n for (const pattern of rangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 2: Remove property change elements\n const propChangePatterns = [\n /<w:rPrChange[^>]*>[\\s\\S]*?<\\/w:rPrChange>/g,\n /<w:pPrChange[^>]*>[\\s\\S]*?<\\/w:pPrChange>/g,\n /<w:tblPrChange[^>]*>[\\s\\S]*?<\\/w:tblPrChange>/g,\n /<w:tblPrExChange[^>]*>[\\s\\S]*?<\\/w:tblPrExChange>/g,\n /<w:tcPrChange[^>]*>[\\s\\S]*?<\\/w:tcPrChange>/g,\n /<w:trPrChange[^>]*>[\\s\\S]*?<\\/w:trPrChange>/g,\n /<w:sectPrChange[^>]*>[\\s\\S]*?<\\/w:sectPrChange>/g,\n /<w:tblGridChange[^>]*>[\\s\\S]*?<\\/w:tblGridChange>/g,\n /<w:numberingChange[^>]*>[\\s\\S]*?<\\/w:numberingChange>/g,\n ];\n for (const pattern of propChangePatterns) {\n result = result.replace(pattern, '');\n }\n\n // Step 3: Remove deletions entirely (including content)\n // Iterate until no more deletions (handles nested cases)\n let prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:del\\b[^>]*>[\\s\\S]*?<\\/w:del>/g, '');\n }\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n\n // Step 4: Remove moveFrom entirely (source of moved content)\n prevLen = 0;\n while (result.length !== prevLen) {\n prevLen = result.length;\n result = result.replace(/<w:moveFrom\\b[^>]*>[\\s\\S]*?<\\/w:moveFrom>/g, '');\n }\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n\n // Step 5: Unwrap moveTo (keep content, remove wrapper)\n result = result.replace(/<\\/w:moveTo>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*>/g, '');\n\n // Step 6: Unwrap insertions (keep content, remove wrapper)\n result = result.replace(/<\\/w:ins>/g, '');\n result = result.replace(/<w:ins\\b[^>]*>/g, '');\n\n // Step 7: Clean up orphaned tags\n result = result.replace(/<w:ins\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:del\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveFrom\\b[^>]*\\/>/g, '');\n result = result.replace(/<w:moveTo\\b[^>]*\\/>/g, '');\n\n return result;\n}\n\n/**\n * Accept all revisions in the document by transforming the in-memory model.\n *\n * This is the industry-standard approach used by OpenXML PowerTools, Aspose.Words,\n * and other production DOCX libraries. It allows subsequent modifications to the\n * document to work correctly.\n *\n * @param doc - Document to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nexport function acceptRevisionsInMemory(\n doc: Document,\n options: AcceptRevisionsOptions = {}\n): AcceptRevisionsResult {\n const logger = getLogger();\n const opts: Required<AcceptRevisionsOptions> = {\n acceptInsertions: options.acceptInsertions ?? true,\n acceptDeletions: options.acceptDeletions ?? true,\n acceptMoves: options.acceptMoves ?? true,\n acceptPropertyChanges: options.acceptPropertyChanges ?? true,\n cleanupEmptyTables: options.cleanupEmptyTables ?? true,\n };\n\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n logger.info('Accepting revisions in-memory', { options: opts });\n\n // Validate move pairs before accepting if moves are being accepted\n // Orphaned moves could result in content loss (moveFrom without moveTo = content deleted)\n if (opts.acceptMoves) {\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const movePairValidation = revisionManager.validateMovePairs();\n if (!movePairValidation.valid) {\n if (movePairValidation.orphanedMoveFrom.length > 0) {\n logger.warn(\n 'Orphaned moveFrom revisions detected - accepting these will DELETE content permanently ' +\n '(content was moved from here but no moveTo destination exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveFrom }\n );\n }\n if (movePairValidation.orphanedMoveTo.length > 0) {\n logger.warn(\n 'Orphaned moveTo revisions detected - content may be duplicated ' +\n '(content moved to here but no moveFrom source exists)',\n { orphanedMoveIds: movePairValidation.orphanedMoveTo }\n );\n }\n }\n }\n }\n\n // Process all paragraphs in the document body\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process paragraphs in tables and clear table/row/cell property changes\n const tables = doc.getTables();\n for (const table of tables) {\n // Clear tblPrChange on table\n if (opts.acceptPropertyChanges && table.getTblPrChange()) {\n table.clearTblPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const row of table.getRows()) {\n // Clear trPrChange on row\n if (opts.acceptPropertyChanges && row.getTrPrChange()) {\n row.clearTrPrChange();\n result.propertyChangesAccepted++;\n }\n\n for (const cell of row.getCells()) {\n // Clear tcPrChange on cell\n if (opts.acceptPropertyChanges && cell.getTcPrChange()) {\n cell.clearTcPrChange();\n result.propertyChangesAccepted++;\n }\n\n // Clear cell structural revision markers (cellIns/cellDel/cellMerge)\n if (opts.acceptPropertyChanges && cell.getCellRevision()) {\n cell.clearCellRevision();\n result.propertyChangesAccepted++;\n }\n\n // Process paragraphs in the cell\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n\n // Process raw nested content (nested tables stored as XML)\n // These cannot be processed via the in-memory model, so we use XML-based stripping\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n // Count revisions stripped from nested content\n // We can't distinguish types in raw XML, so count as property changes\n result.propertyChangesAccepted++;\n logger.debug('Stripped revisions from nested content', {\n type: item.type,\n position: item.position,\n originalLength: item.xml.length,\n cleanedLength: cleanedXml.length,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in headers\n const headerFooterManager = doc.getHeaderFooterManager();\n if (headerFooterManager) {\n const headers = headerFooterManager.getAllHeaders();\n for (const headerEntry of headers) {\n const elements = headerEntry.header.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in header tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Process paragraphs in footers\n const footers = headerFooterManager.getAllFooters();\n for (const footerEntry of footers) {\n const elements = footerEntry.footer.getElements();\n for (const element of elements) {\n // Element can be Paragraph or Table - use instanceof for type safety\n if (element instanceof Paragraph) {\n const paragraphResult = acceptRevisionsInParagraph(element, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n } else if (element instanceof Table) {\n // It's a Table - process its cells\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n const paragraphResult = acceptRevisionsInParagraph(paragraph, opts);\n result.insertionsAccepted += paragraphResult.insertionsAccepted;\n result.deletionsAccepted += paragraphResult.deletionsAccepted;\n result.movesAccepted += paragraphResult.movesAccepted;\n result.propertyChangesAccepted += paragraphResult.propertyChangesAccepted;\n }\n // Process raw nested content in footer tables\n if (cell.hasRawNestedContent()) {\n const rawContent = cell.getRawNestedContent();\n for (let i = 0; i < rawContent.length; i++) {\n const item = rawContent[i];\n if (item) {\n const cleanedXml = stripRevisionsFromXml(item.xml);\n if (cleanedXml !== item.xml) {\n cell.updateRawNestedContent(i, cleanedXml);\n result.propertyChangesAccepted++;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Clear sectPrChange on document section\n if (opts.acceptPropertyChanges) {\n const section = doc.getSection();\n if (section?.getSectPrChange()) {\n section.clearSectPrChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear revision manager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n revisionManager.clear();\n }\n\n // Disable track changes setting\n doc.disableTrackChanges();\n\n // Cleanup empty tables if enabled\n // This removes tables that have no visible content after revision acceptance\n // (e.g., tables where all content was deleted via tracked changes)\n if (opts.cleanupEmptyTables) {\n result.emptyTablesRemoved = cleanupEmptyTables(doc, logger);\n }\n\n result.totalAccepted =\n result.insertionsAccepted +\n result.deletionsAccepted +\n result.movesAccepted +\n result.propertyChangesAccepted;\n\n logger.info('Revisions accepted in-memory', {\n insertions: result.insertionsAccepted,\n deletions: result.deletionsAccepted,\n moves: result.movesAccepted,\n propertyChanges: result.propertyChangesAccepted,\n total: result.totalAccepted,\n emptyTablesRemoved: result.emptyTablesRemoved,\n });\n\n return result;\n}\n\n/**\n * Accept revisions in a single paragraph by transforming its content array.\n *\n * The transformation follows these rules:\n * - Insertions (w:ins): Unwrap - extract child content into parent position\n * - Deletions (w:del): Remove - delete revision and its content\n * - MoveFrom (w:moveFrom): Remove - content exists at moveTo destination\n * - MoveTo (w:moveTo): Unwrap - keep content, remove wrapper\n * - Property changes: Remove from model (current formatting is kept)\n *\n * @param paragraph - Paragraph to process\n * @param options - Options for which revision types to accept\n * @returns Result with counts of accepted revisions\n */\nfunction acceptRevisionsInParagraph(\n paragraph: Paragraph,\n options: Required<AcceptRevisionsOptions>\n): AcceptRevisionsResult {\n const result: AcceptRevisionsResult = {\n insertionsAccepted: 0,\n deletionsAccepted: 0,\n movesAccepted: 0,\n propertyChangesAccepted: 0,\n totalAccepted: 0,\n emptyTablesRemoved: 0,\n };\n\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionType = item.getType();\n\n // Handle insertion revisions (w:ins)\n if (revisionType === 'insert' && options.acceptInsertions) {\n // Unwrap: Extract child content into parent position\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.insertionsAccepted++;\n continue;\n }\n\n // Handle deletion revisions (w:del)\n if (revisionType === 'delete' && options.acceptDeletions) {\n // Remove: Don't add to newContent - content is deleted\n result.deletionsAccepted++;\n continue;\n }\n\n // Handle moveFrom revisions (source of moved content)\n if (revisionType === 'moveFrom' && options.acceptMoves) {\n // Remove: Content exists at moveTo destination\n result.movesAccepted++;\n continue;\n }\n\n // Handle moveTo revisions (destination of moved content)\n if (revisionType === 'moveTo' && options.acceptMoves) {\n // Unwrap: Keep content, remove wrapper\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.movesAccepted++;\n continue;\n }\n\n // Handle property change revisions\n if (PROPERTY_REVISION_TYPES.includes(revisionType) && options.acceptPropertyChanges) {\n // For property changes, the revision is metadata attached to runs\n // The current formatting (newProperties) is already applied to the run\n // We just need to remove the change tracking metadata\n // The content inside should be preserved\n const childContent = item.getContent();\n for (const child of childContent) {\n // Check ImageRun FIRST since ImageRun extends Run\n if (isImageRunContent(child)) {\n newContent.push(child);\n } else if (isRunContent(child)) {\n newContent.push(child);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n result.propertyChangesAccepted++;\n continue;\n }\n\n // If we reach here, this revision type is not being accepted\n // Keep it in the content\n newContent.push(item);\n } else if (item instanceof ComplexField && item.hasResultRevisions()) {\n // Accept revisions nested inside ComplexField result sections\n const fieldRevisions = item.getResultRevisions();\n const revisionsToKeep: Revision[] = [];\n\n for (const rev of fieldRevisions) {\n const revType = rev.getType();\n if (revType === 'insert' && options.acceptInsertions) {\n result.insertionsAccepted++;\n } else if (revType === 'delete' && options.acceptDeletions) {\n result.deletionsAccepted++;\n } else if (revType === 'moveTo' && options.acceptMoves) {\n result.movesAccepted++;\n } else if (revType === 'moveFrom' && options.acceptMoves) {\n result.movesAccepted++;\n } else {\n revisionsToKeep.push(rev);\n }\n }\n\n if (revisionsToKeep.length < fieldRevisions.length) {\n // Some revisions were accepted — use getAcceptedResultText() for correct interleaved ordering\n item.setResult(item.getAcceptedResultText());\n if (revisionsToKeep.length > 0) {\n item.setResultRevisions(revisionsToKeep);\n }\n }\n newContent.push(item);\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Clear paragraph property change tracking (pPrChange) if accepting property changes\n // This removes the w:pPrChange element from the paragraph's formatting\n if (options.acceptPropertyChanges) {\n const formatting = paragraph.getFormatting();\n if (formatting.pPrChange) {\n paragraph.clearParagraphPropertiesChange();\n result.propertyChangesAccepted++;\n }\n }\n\n // Clear paragraph mark deletion tracking if accepting deletions\n // This removes the w:del element from w:pPr/w:rPr\n if (options.acceptDeletions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n paragraph.clearParagraphMarkDeletion();\n result.deletionsAccepted++;\n }\n }\n\n // Clear paragraph mark insertion tracking if accepting insertions\n // This removes the w:ins element from w:pPr/w:rPr\n if (options.acceptInsertions) {\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkInsertion) {\n paragraph.clearParagraphMarkInsertion();\n result.insertionsAccepted++;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a paragraph has any revisions\n */\nexport function paragraphHasRevisions(paragraph: Paragraph): boolean {\n const content = paragraph.getContent();\n if (content.some((item) => item instanceof Revision)) {\n return true;\n }\n // Also check paragraph mark revision markers in w:pPr/w:rPr\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion || formatting.paragraphMarkInsertion) {\n return true;\n }\n return false;\n}\n\n/**\n * Get all revisions from a paragraph\n */\nexport function getRevisionsFromParagraph(paragraph: Paragraph): Revision[] {\n const content = paragraph.getContent();\n return content.filter((item): item is Revision => item instanceof Revision);\n}\n\n/**\n * Count revisions by type in a document\n */\nexport function countRevisionsByType(doc: Document): Map<RevisionType, number> {\n const counts = new Map<RevisionType, number>();\n\n const paragraphs = doc.getAllParagraphs();\n for (const paragraph of paragraphs) {\n const revisions = getRevisionsFromParagraph(paragraph);\n for (const revision of revisions) {\n const type = revision.getType();\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Remove tables that have no visible content after revision acceptance.\n *\n * A table is considered empty if ALL cells in ALL rows have no text content.\n * This handles cases where all table content was deleted via tracked changes -\n * the deletion markers are stripped but the empty table structure remains.\n *\n * @param doc - Document to clean up\n * @param logger - Logger instance for debug output\n * @returns Number of empty tables removed\n */\nfunction cleanupEmptyTables(doc: Document, logger: ILogger): number {\n const tables = doc.getTables();\n let removedCount = 0;\n const tablesToRemove: number[] = [];\n\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\n const table = tables[tableIndex];\n if (!table) continue;\n\n let hasContent = false;\n const rows = table.getRows();\n\n for (const row of rows) {\n const cells = row.getCells();\n for (const cell of cells) {\n const paragraphs = cell.getParagraphs();\n for (const para of paragraphs) {\n const text = para.getText().trim();\n if (text.length > 0) {\n hasContent = true;\n break;\n }\n }\n if (hasContent) break;\n }\n if (hasContent) break;\n }\n\n if (!hasContent) {\n // Mark this table for removal (store index)\n tablesToRemove.push(tableIndex);\n logger.debug('Found empty table for removal', { tableIndex });\n }\n }\n\n // Remove tables in reverse order to preserve indices\n for (let i = tablesToRemove.length - 1; i >= 0; i--) {\n const tableIndex = tablesToRemove[i];\n if (tableIndex !== undefined && doc.removeTable(tableIndex)) {\n removedCount++;\n logger.debug('Removed empty table', { tableIndex });\n }\n }\n\n if (removedCount > 0) {\n logger.info('Empty table cleanup complete', { tablesRemoved: removedCount });\n }\n\n return removedCount;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MoveOperationHelper.d.ts","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAKtC,MAAM,WAAW,oBAAoB;IAEnC,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAE1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,mBAAmB;IAElC,MAAM,EAAE;QAEN,UAAU,EAAE,WAAW,CAAC;QAExB,QAAQ,EAAE,QAAQ,CAAC;QAEnB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,WAAW,EAAE;QAEX,UAAU,EAAE,WAAW,CAAC;QAExB,MAAM,EAAE,QAAQ,CAAC;QAEjB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,mBAAmB;IA+B9B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;IAmF9E,MAAM,CAAC,gBAAgB,CACrB,eAAe,EAAE,OAAO,uBAAuB,EAAE,SAAS,EAC1D,aAAa,EAAE,OAAO,uBAAuB,EAAE,SAAS,EACxD,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB;IAoBtB,MAAM,CAAC,eAAe,IAAI,IAAI;CAI/B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MoveOperationHelper.js","sourceRoot":"","sources":["../../src/utils/MoveOperationHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MoveOperationHelper - Creates complete move operations with range markers\n *\n * Per ECMA-376, move operations in tracked changes require:\n * 1. w:moveFromRangeStart (marks start of source region)\n * 2. w:moveFrom (contains the moved content)\n * 3. w:moveFromRangeEnd (marks end of source region)\n * 4. w:moveToRangeStart (marks start of destination region)\n * 5. w:moveTo (contains the moved content copy)\n * 6. w:moveToRangeEnd (marks end of destination region)\n *\n * The range markers and move elements share a common 'name' (for range markers)\n * and 'moveId' (for move elements) that links them together.\n *\n * @example\n * ```typescript\n * // Create a complete move operation\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: [new Run('moved text')],\n * idProvider: () => document.getIdManager().getNextId(),\n * });\n *\n * // Add to source paragraph\n * sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n * sourceParagraph.addRevision(moveOp.source.moveFrom);\n * sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph\n * destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n * destParagraph.addRevision(moveOp.destination.moveTo);\n * destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n\nimport { Revision } from '../elements/Revision';\nimport { RangeMarker } from '../elements/RangeMarker';\nimport { Run } from '../elements/Run';\n\n/**\n * Options for creating a move operation\n */\nexport interface MoveOperationOptions {\n /** Author who made the move */\n author: string;\n /** Content being moved (Run or array of Runs) */\n content: Run | Run[];\n /** Date of the move (defaults to now) */\n date?: Date;\n /** ID provider function - returns the next available annotation ID */\n idProvider?: () => number;\n /** Optional move ID (auto-generated if not provided) */\n moveId?: string;\n}\n\n/**\n * Result of creating a move operation\n */\nexport interface MoveOperationResult {\n /** Elements to add to the source paragraph (where content was moved FROM) */\n source: {\n /** Range start marker (w:moveFromRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveFrom) */\n moveFrom: Revision;\n /** Range end marker (w:moveFromRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** Elements to add to the destination paragraph (where content was moved TO) */\n destination: {\n /** Range start marker (w:moveToRangeStart) */\n rangeStart: RangeMarker;\n /** Move revision (w:moveTo) */\n moveTo: Revision;\n /** Range end marker (w:moveToRangeEnd) */\n rangeEnd: RangeMarker;\n };\n /** The move ID linking all elements together */\n moveId: string;\n}\n\n/**\n * Simple ID counter for when no provider is specified\n */\nlet globalMoveIdCounter = 0;\nlet globalAnnotationIdCounter = 1000; // Start high to avoid conflicts\n\n/**\n * Helper class for creating complete move operations\n */\nexport class MoveOperationHelper {\n /**\n * Creates a complete move operation with all required elements.\n *\n * This generates:\n * - Source: w:moveFromRangeStart, w:moveFrom, w:moveFromRangeEnd\n * - Destination: w:moveToRangeStart, w:moveTo, w:moveToRangeEnd\n *\n * All elements are linked by the moveId (for revisions) and name (for range markers).\n *\n * @param options - Move operation options\n * @returns Complete move operation with all elements\n *\n * @example\n * ```typescript\n * const moveOp = MoveOperationHelper.createMoveOperation({\n * author: 'John Doe',\n * content: new Run('text to move'),\n * });\n *\n * // Add to source paragraph (where text was)\n * sourcePara.addRangeMarker(moveOp.source.rangeStart);\n * sourcePara.addRevision(moveOp.source.moveFrom);\n * sourcePara.addRangeMarker(moveOp.source.rangeEnd);\n *\n * // Add to destination paragraph (where text moved to)\n * destPara.addRangeMarker(moveOp.destination.rangeStart);\n * destPara.addRevision(moveOp.destination.moveTo);\n * destPara.addRangeMarker(moveOp.destination.rangeEnd);\n * ```\n */\n static createMoveOperation(options: MoveOperationOptions): MoveOperationResult {\n const { author, content, date = new Date() } = options;\n\n // Generate move ID if not provided\n const moveId = options.moveId || `move-${++globalMoveIdCounter}`;\n\n // Get IDs from provider or use simple counter\n const getNextId = options.idProvider || (() => ++globalAnnotationIdCounter);\n\n // Allocate IDs for all elements\n // Range markers use same ID for start/end pairs\n const moveFromRangeId = getNextId();\n const moveFromId = getNextId();\n const moveToRangeId = getNextId();\n const moveToId = getNextId();\n\n // Create source elements\n const moveFromRangeStart = RangeMarker.createMoveFromStart(\n moveFromRangeId,\n moveId,\n author,\n date\n );\n\n const moveFrom = Revision.createMoveFrom(author, content, moveId, date);\n moveFrom.setId(moveFromId);\n\n const moveFromRangeEnd = RangeMarker.createMoveFromEnd(moveFromRangeId);\n\n // Create destination elements (clone content for moveTo)\n const contentArray = Array.isArray(content) ? content : [content];\n const clonedContent = contentArray.map((run) => {\n // Clone the run to have independent content at destination\n const cloned = new Run(run.getText(), { ...run.getFormatting() });\n return cloned;\n });\n\n const moveToRangeStart = RangeMarker.createMoveToStart(moveToRangeId, moveId, author, date);\n\n const moveTo = Revision.createMoveTo(author, clonedContent, moveId, date);\n moveTo.setId(moveToId);\n\n const moveToRangeEnd = RangeMarker.createMoveToEnd(moveToRangeId);\n\n return {\n source: {\n rangeStart: moveFromRangeStart,\n moveFrom,\n rangeEnd: moveFromRangeEnd,\n },\n destination: {\n rangeStart: moveToRangeStart,\n moveTo,\n rangeEnd: moveToRangeEnd,\n },\n moveId,\n };\n }\n\n /**\n * Adds a complete move operation to source and destination paragraphs.\n *\n * This is a convenience method that creates the move operation and adds\n * all elements to the appropriate paragraphs in the correct order.\n *\n * @param sourceParagraph - Paragraph where content was moved FROM\n * @param destParagraph - Paragraph where content was moved TO\n * @param options - Move operation options\n * @returns The move operation result for reference\n *\n * @example\n * ```typescript\n * import { Paragraph } from 'docxmlater';\n *\n * const sourcePara = document.getParagraphs()[0];\n * const destPara = document.getParagraphs()[5];\n *\n * MoveOperationHelper.addMoveOperation(sourcePara, destPara, {\n * author: 'John Doe',\n * content: new Run('moved text'),\n * });\n * ```\n */\n static addMoveOperation(\n sourceParagraph: import('../elements/Paragraph').Paragraph,\n destParagraph: import('../elements/Paragraph').Paragraph,\n options: MoveOperationOptions\n ): MoveOperationResult {\n const moveOp = this.createMoveOperation(options);\n\n // Add to source paragraph in order\n sourceParagraph.addRangeMarker(moveOp.source.rangeStart);\n sourceParagraph.addRevision(moveOp.source.moveFrom);\n sourceParagraph.addRangeMarker(moveOp.source.rangeEnd);\n\n // Add to destination paragraph in order\n destParagraph.addRangeMarker(moveOp.destination.rangeStart);\n destParagraph.addRevision(moveOp.destination.moveTo);\n destParagraph.addRangeMarker(moveOp.destination.rangeEnd);\n\n return moveOp;\n }\n\n /**\n * Resets the global ID counters (for testing purposes).\n * @internal\n */\n static resetIdCounters(): void {\n globalMoveIdCounter = 0;\n globalAnnotationIdCounter = 1000;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RevisionAwareProcessor.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RevisionAwareProcessor.js","sourceRoot":"","sources":["../../src/utils/RevisionAwareProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionAwareProcessor - Handles document revisions before and during processing\n *\n * Provides three modes for handling existing Word tracked changes:\n * - accept_all: Accept all revisions before processing (default)\n * - preserve: Preserve revisions, skip conflicting operations\n * - preserve_and_wrap: Preserve revisions, wrap conflicts in new revisions\n *\n * Implements ECMA-376 compliant revision handling.\n *\n * @module RevisionAwareProcessor\n */\n\nimport type { Document } from '../core/Document';\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { ChangeCategory, ChangeLocation } from './ChangelogGenerator';\n\n/**\n * Revision handling modes for document processing.\n */\nexport type RevisionHandlingMode =\n | 'accept_all' // Accept all revisions before processing\n | 'preserve' // Preserve revisions, skip conflicting operations\n | 'preserve_and_wrap'; // Preserve revisions, wrap conflicts in new revisions\n\n/**\n * Options for revision-aware processing.\n */\nexport interface RevisionProcessingOptions {\n /** How to handle existing revisions */\n mode: RevisionHandlingMode;\n /** Author name for new revisions (required for 'preserve_and_wrap' mode) */\n author?: string;\n /** Selective acceptance criteria (optional, for partial acceptance) */\n acceptCriteria?: SelectionCriteria;\n}\n\n/**\n * Criteria for selecting specific revisions.\n */\nexport interface SelectionCriteria {\n /** Specific revision IDs */\n ids?: number[];\n /** Filter by revision types */\n types?: RevisionType[];\n /** Filter by authors */\n authors?: string[];\n /** Filter by date range */\n dateRange?: { start: Date; end: Date };\n /** Filter by category */\n categories?: ChangeCategory[];\n /** Custom filter function */\n custom?: (revision: Revision) => boolean;\n}\n\n/**\n * Result of revision-aware processing.\n */\nexport interface RevisionProcessingResult {\n /** Whether processing completed successfully */\n success: boolean;\n /** IDs of revisions that were accepted */\n acceptedRevisions: string[];\n /** IDs of revisions that were preserved */\n preservedRevisions: string[];\n /** IDs of new revisions created (preserve_and_wrap mode) */\n newRevisions: string[];\n /** Conflicts encountered during processing */\n conflicts: ConflictInfo[];\n /** Processing log entries */\n log: ProcessingLogEntry[];\n}\n\n/**\n * Information about a conflict between an operation and a revision.\n */\nexport interface ConflictInfo {\n /** Description of the operation that conflicted */\n operation: string;\n /** ID of the conflicting revision */\n revisionId: string;\n /** How the conflict was resolved */\n resolution: 'accepted' | 'skipped' | 'wrapped';\n /** Location of the conflict */\n location: ChangeLocation;\n}\n\n/**\n * Log entry for processing actions.\n */\nexport interface ProcessingLogEntry {\n timestamp: Date;\n action: string;\n details: string;\n revisionId?: string;\n}\n\n/**\n * Handles document revisions before and during processing.\n * Implements ECMA-376 compliant revision handling.\n */\nexport class RevisionAwareProcessor {\n /**\n * Prepare document for processing by handling revisions.\n * Call this before applying any document modifications.\n *\n * @param doc - Document to prepare\n * @param options - Processing options\n * @returns Processing result with details of actions taken\n */\n static async prepare(\n doc: Document,\n options: RevisionProcessingOptions\n ): Promise<RevisionProcessingResult> {\n const log: ProcessingLogEntry[] = [];\n const acceptedRevisions: string[] = [];\n const preservedRevisions: string[] = [];\n const newRevisions: string[] = [];\n const conflicts: ConflictInfo[] = [];\n\n const addLog = (action: string, details: string, revisionId?: string) => {\n log.push({\n timestamp: new Date(),\n action,\n details,\n revisionId,\n });\n };\n\n addLog('start', `Starting revision processing with mode: ${options.mode}`);\n\n try {\n const revisionManager = doc.getRevisionManager();\n const hasInMemoryRevisions = revisionManager?.hasRevisions() ?? false;\n const hasRawXmlRevisions = doc.hasRawXmlRevisions();\n\n // Check both in-memory model AND raw XML for revisions\n // Raw XML may contain revisions that weren't fully parsed into memory\n if (!hasInMemoryRevisions && !hasRawXmlRevisions) {\n addLog('complete', 'No revisions found in document');\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n const allRevisions = revisionManager?.getAllRevisions() ?? [];\n const inMemoryCount = allRevisions.length;\n const rawXmlNote = hasRawXmlRevisions ? ' (raw XML contains revision markup)' : '';\n addLog('info', `Found ${inMemoryCount} parsed revisions in document${rawXmlNote}`);\n\n switch (options.mode) {\n case 'accept_all':\n // Accept all revisions\n await this.acceptAllRevisions(doc, allRevisions, acceptedRevisions, addLog);\n break;\n\n case 'preserve':\n // Preserve all revisions by preventing document.xml regeneration\n // This keeps the original XML with w:ins/w:del elements intact\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'complete',\n `Preserved ${preservedRevisions.length} revisions (raw XML preservation enabled)`\n );\n break;\n\n case 'preserve_and_wrap':\n // Preserve all revisions, track for later wrapping\n // Also enable raw XML preservation to keep existing revisions\n for (const rev of allRevisions) {\n preservedRevisions.push(rev.getId().toString());\n }\n doc.preserveRawXml();\n addLog(\n 'info',\n `Will preserve and wrap conflicts for ${preservedRevisions.length} revisions`\n );\n addLog('info', `New revisions will be authored by: ${options.author || 'Unknown'}`);\n break;\n\n default:\n addLog('error', `Unknown processing mode: ${options.mode}`);\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n\n addLog('complete', 'Revision processing completed successfully');\n\n return {\n success: true,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n addLog('error', `Processing failed: ${errorMessage}`);\n\n return {\n success: false,\n acceptedRevisions,\n preservedRevisions,\n newRevisions,\n conflicts,\n log,\n };\n }\n }\n\n /**\n * Accept all revisions in the document using Document.acceptAllRevisions().\n *\n * This delegates to Document.acceptAllRevisions() which uses in-memory DOM transformation\n * (the industry-standard approach used by OpenXML PowerTools, Aspose.Words, etc.):\n *\n * 1. Transforms Revision objects in paragraph.content arrays\n * 2. Insertions (w:ins): Unwraps content - keeps Runs/Hyperlinks, removes Revision wrapper\n * 3. Deletions (w:del): Removes content entirely from the model\n * 4. Move operations: moveFrom removed, moveTo unwrapped\n * 5. Property changes: Removes change metadata, keeps current formatting\n *\n * This approach allows subsequent modifications to be saved correctly because the\n * in-memory model is transformed (not raw XML), so save() regenerates document.xml\n * with both the accepted changes AND any subsequent modifications.\n *\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n * @see https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee836138\n */\n private static async acceptAllRevisions(\n doc: Document,\n revisions: Revision[],\n acceptedIds: string[],\n addLog: (action: string, details: string, revisionId?: string) => void\n ): Promise<void> {\n addLog('info', 'Accepting all revisions using in-memory DOM transformation');\n\n // Track accepted revision IDs before acceptance (for logging)\n for (const rev of revisions) {\n acceptedIds.push(rev.getId().toString());\n }\n\n // Use Document.acceptAllRevisions() which uses in-memory transformation\n // This allows subsequent modifications to be saved correctly\n await doc.acceptAllRevisions();\n\n // Log each accepted revision\n for (const id of acceptedIds) {\n addLog('accept', `Accepted revision ${id}`, id);\n }\n\n addLog('complete', `Accepted ${acceptedIds.length} revisions (in-memory transformation)`);\n }\n\n /**\n * Accept revisions matching the given criteria.\n * Uses existing RevisionAcceptor under the hood.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Array of accepted revision IDs\n */\n static acceptSelective(doc: Document, criteria: SelectionCriteria): string[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n const allRevisions = revisionManager.getAllRevisions();\n const matchingRevisions = this.filterRevisions(allRevisions, criteria);\n\n const acceptedIds: string[] = [];\n for (const rev of matchingRevisions) {\n acceptedIds.push(rev.getId().toString());\n // Note: Actual acceptance would require XML manipulation\n // For now, this returns which revisions WOULD be accepted\n }\n\n return acceptedIds;\n }\n\n /**\n * Filter revisions based on criteria.\n */\n private static filterRevisions(revisions: Revision[], criteria: SelectionCriteria): Revision[] {\n return revisions.filter((rev) => {\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(rev.getId())) {\n return false;\n }\n\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 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 // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(rev);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(rev)) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\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 return 'content';\n }\n\n /**\n * Check if an operation at the given location would conflict with any revision.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Conflicting revision or null\n */\n static checkConflict(doc: Document, paragraphIndex: number, _runIndex?: number): Revision | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n // Get revisions that might affect this paragraph\n const revisions = revisionManager.getRevisionsForParagraph(paragraphIndex);\n\n // For now, return the first revision at this location\n // In a more complete implementation, we would check run-level conflicts\n return revisions.length > 0 ? revisions[0]! : null;\n }\n\n /**\n * Get all revisions that would be affected by an operation.\n *\n * @param doc - Document to check\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Optional run index\n * @returns Array of affected revisions\n */\n static getAffectedRevisions(\n doc: Document,\n paragraphIndex: number,\n _runIndex?: number\n ): Revision[] {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return [];\n }\n\n return revisionManager.getRevisionsForParagraph(paragraphIndex);\n }\n\n /**\n * Wrap content in a new revision (for preserve_and_wrap mode).\n * Creates a new revision tracking the change.\n *\n * @param doc - Document to modify\n * @param paragraphIndex - Paragraph index\n * @param runIndex - Run index\n * @param author - Author for the new revision\n * @param type - Type of revision to create\n * @returns ID of the new revision\n */\n static wrapInRevision(\n doc: Document,\n paragraphIndex: number,\n runIndex: number,\n author: string,\n type: 'insert' | 'delete'\n ): string {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n throw new Error('Document does not have a revision manager');\n }\n\n // Get the paragraphs from the document\n const paragraphs = doc.getParagraphs();\n if (paragraphIndex < 0 || paragraphIndex >= paragraphs.length) {\n throw new Error(`Invalid paragraph index: ${paragraphIndex}`);\n }\n\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) {\n throw new Error(`Paragraph at index ${paragraphIndex} not found`);\n }\n\n const runs = paragraph.getRuns();\n if (runIndex < 0 || runIndex >= runs.length) {\n throw new Error(`Invalid run index: ${runIndex}`);\n }\n\n const run = runs[runIndex];\n if (!run) {\n throw new Error(`Run at index ${runIndex} not found`);\n }\n\n // Create new revision\n const revision = new Revision({\n author,\n type,\n content: run,\n date: new Date(),\n });\n\n // Register with manager\n revisionManager.register(revision);\n\n return revision.getId().toString();\n }\n\n /**\n * Check if document has any tracked changes.\n *\n * @param doc - Document to check\n * @returns True if document has tracked changes\n */\n static hasTrackedChanges(doc: Document): boolean {\n const revisionManager = doc.getRevisionManager();\n return revisionManager ? revisionManager.hasRevisions() : false;\n }\n\n /**\n * Get summary of tracked changes in document.\n *\n * @param doc - Document to summarize\n * @returns Summary object or null if no revision manager\n */\n static getTrackedChangesSummary(doc: Document): {\n total: number;\n insertions: number;\n deletions: number;\n formatting: number;\n moves: number;\n authors: string[];\n } | null {\n const revisionManager = doc.getRevisionManager();\n if (!revisionManager) {\n return null;\n }\n\n const summary = revisionManager.getSummary();\n return {\n total: summary.total,\n insertions: summary.byType.insertions,\n deletions: summary.byType.deletions,\n formatting: summary.byType.propertyChanges,\n moves: summary.byType.moves,\n authors: summary.authors,\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RevisionWalker.d.ts","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,qBAAqB;IAEpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAaD,QAAA,MAAM,iBAAiB;;;;;CAmCtB,CAAC;AAcF,qBAAa,cAAc;IAczB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,eAAe;IAoB1F,OAAO,CAAC,MAAM,CAAC,SAAS;IAoBxB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IA8B/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsB/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B,OAAO,CAAC,MAAM,CAAC,YAAY;IA4B3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA+HhC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmBhC,OAAO,CAAC,MAAM,CAAC,eAAe;IAoB9B,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAY9C,MAAM,CAAC,4BAA4B,IAAI,OAAO,iBAAiB;CAGhE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RevisionWalker.js","sourceRoot":"","sources":["../../src/utils/RevisionWalker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionWalker - DOM-based tree walker for accepting tracked changes\n *\n * Replaces the fragile RegEx-based revision acceptance with a robust\n * DOM-based approach that properly handles nested elements and preserves\n * element ordering.\n *\n * @module RevisionWalker\n */\n\nimport { ParsedXMLObject } from '../xml/XMLParser';\n\n/**\n * Options for controlling which revision types to accept\n */\nexport interface RevisionWalkerOptions {\n /** Keep content, remove w:ins wrapper (default: true) */\n acceptInsertions?: boolean;\n /** Remove w:del and content entirely (default: true) */\n acceptDeletions?: boolean;\n /** Handle w:moveFrom/w:moveTo (default: true) */\n acceptMoves?: boolean;\n /** Remove *Change elements (default: true) */\n acceptPropertyChanges?: boolean;\n}\n\n/**\n * Structure for tracking element order\n */\ninterface OrderedChildInfo {\n type: string;\n index: number;\n}\n\n/**\n * Revision element categories\n */\nconst REVISION_ELEMENTS = {\n /** Elements to unwrap (keep content, remove wrapper) */\n UNWRAP: ['w:ins', 'w:moveTo'],\n\n /** Elements to remove entirely (with content) */\n REMOVE: ['w:del', 'w:moveFrom'],\n\n /** Property change tracking elements */\n PROPERTY_CHANGES: [\n 'w:rPrChange',\n 'w:pPrChange',\n 'w:tblPrChange',\n 'w:tcPrChange',\n 'w:trPrChange',\n 'w:sectPrChange',\n 'w:tblGridChange',\n 'w:numberingChange',\n 'w:tblPrExChange',\n ],\n\n /** Range marker elements */\n RANGE_MARKERS: [\n 'w:moveFromRangeStart',\n 'w:moveFromRangeEnd',\n 'w:moveToRangeStart',\n 'w:moveToRangeEnd',\n 'w:customXmlInsRangeStart',\n 'w:customXmlInsRangeEnd',\n 'w:customXmlDelRangeStart',\n 'w:customXmlDelRangeEnd',\n 'w:customXmlMoveFromRangeStart',\n 'w:customXmlMoveFromRangeEnd',\n 'w:customXmlMoveToRangeStart',\n 'w:customXmlMoveToRangeEnd',\n ],\n};\n\n/**\n * DOM-based tree walker for accepting Word document revisions\n *\n * This class processes a parsed XML object tree (from XMLParser.parseToObject())\n * and accepts all tracked changes by:\n * - Unwrapping insertions (w:ins, w:moveTo) - keeping content\n * - Removing deletions (w:del, w:moveFrom) - discarding content\n * - Removing property changes (*Change elements)\n * - Removing range markers\n *\n * Element order is preserved using the _orderedChildren metadata.\n */\nexport class RevisionWalker {\n /**\n * Process a parsed XML object tree and accept all revisions\n *\n * @param obj - Parsed XML object from XMLParser.parseToObject()\n * @param options - Options controlling which revisions to accept\n * @returns New object tree with revisions accepted\n *\n * @example\n * ```typescript\n * const parsed = XMLParser.parseToObject(documentXml);\n * const clean = RevisionWalker.processTree(parsed);\n * ```\n */\n static processTree(obj: ParsedXMLObject, options?: RevisionWalkerOptions): ParsedXMLObject {\n const opts: Required<RevisionWalkerOptions> = {\n acceptInsertions: options?.acceptInsertions ?? true,\n acceptDeletions: options?.acceptDeletions ?? true,\n acceptMoves: options?.acceptMoves ?? true,\n acceptPropertyChanges: options?.acceptPropertyChanges ?? true,\n };\n\n // Deep clone the object to avoid mutating the original\n const clone = RevisionWalker.deepClone(obj);\n\n // Walk and transform the tree\n RevisionWalker.walkAndTransform(clone, opts);\n\n return clone;\n }\n\n /**\n * Deep clone an object\n */\n private static deepClone(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => RevisionWalker.deepClone(item));\n }\n\n const clone: any = {};\n for (const key of Object.keys(obj)) {\n clone[key] = RevisionWalker.deepClone(obj[key]);\n }\n return clone;\n }\n\n /**\n * Recursively walk and transform the object tree\n * Processes children first (depth-first) to handle nested revisions\n */\n private static walkAndTransform(obj: any, options: Required<RevisionWalkerOptions>): void {\n if (obj === null || typeof obj !== 'object') {\n return;\n }\n\n // Get keys to process (excluding metadata keys)\n const keys = Object.keys(obj).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n // First pass: recurse into children (depth-first)\n for (const key of keys) {\n const value = obj[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n RevisionWalker.walkAndTransform(item, options);\n }\n } else if (typeof value === 'object' && value !== null) {\n RevisionWalker.walkAndTransform(value, options);\n }\n }\n\n // Second pass: process revision elements at this level\n // We need to iterate carefully because we're modifying the object\n RevisionWalker.processRevisions(obj, options);\n }\n\n /**\n * Process revision elements at the current level\n */\n private static processRevisions(parent: any, options: Required<RevisionWalkerOptions>): void {\n if (!parent || typeof parent !== 'object') {\n return;\n }\n\n const keysToProcess = Object.keys(parent).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const key of keysToProcess) {\n // Check if this is a revision element\n if (RevisionWalker.shouldUnwrap(key, options)) {\n RevisionWalker.unwrapAllElements(parent, key);\n } else if (RevisionWalker.shouldRemove(key, options)) {\n RevisionWalker.removeAllElements(parent, key);\n }\n }\n }\n\n /**\n * Check if an element should be unwrapped (content kept)\n */\n private static shouldUnwrap(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.UNWRAP.includes(key)) {\n if (key === 'w:ins' && !options.acceptInsertions) return false;\n if (key === 'w:moveTo' && !options.acceptMoves) return false;\n return true;\n }\n return false;\n }\n\n /**\n * Check if an element should be removed (content discarded)\n */\n private static shouldRemove(key: string, options: Required<RevisionWalkerOptions>): boolean {\n if (REVISION_ELEMENTS.REMOVE.includes(key)) {\n if (key === 'w:del' && !options.acceptDeletions) return false;\n if (key === 'w:moveFrom' && !options.acceptMoves) return false;\n return true;\n }\n if (REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key)) {\n return options.acceptPropertyChanges;\n }\n if (REVISION_ELEMENTS.RANGE_MARKERS.includes(key)) {\n return true; // Always remove range markers\n }\n return false;\n }\n\n /**\n * Unwrap all elements of a given type, promoting their children to parent\n *\n * This is the most complex operation in RevisionWalker. When we unwrap a\n * revision element like w:ins, we need to:\n * 1. Extract the children from inside w:ins\n * 2. Insert them at the correct position in the parent's element arrays\n * 3. Update _orderedChildren to reflect the new structure\n *\n * The key challenge is maintaining correct element order. For example:\n * Before: <w:tbl><w:tr>Row1</w:tr><w:ins><w:tr>Row2</w:tr></w:ins><w:tr>Row3</w:tr></w:tbl>\n * After: <w:tbl><w:tr>Row1</w:tr><w:tr>Row2</w:tr><w:tr>Row3</w:tr></w:tbl>\n */\n private static unwrapAllElements(parent: any, key: string): void {\n const elements = parent[key];\n if (!elements) return;\n\n const elementArray = Array.isArray(elements) ? elements : [elements];\n\n // Build a complete ordered list of child elements by walking _orderedChildren\n // This captures the intended order before we modify anything\n const orderedElements: { type: string; element: any }[] = [];\n\n if (parent._orderedChildren) {\n // Track how many of each type we've seen to get correct array index\n const typeCounters = new Map<string, number>();\n let unwrappedIndex = 0;\n\n for (const entry of parent._orderedChildren) {\n const { type } = entry;\n\n if (type === key) {\n // This is a revision element - extract its children in order\n const revElement = elementArray[unwrappedIndex];\n unwrappedIndex++;\n\n if (revElement && typeof revElement === 'object') {\n if (revElement._orderedChildren) {\n // Use the revision element's _orderedChildren for correct order\n const childCounters = new Map<string, number>();\n for (const childEntry of revElement._orderedChildren) {\n const childType = childEntry.type;\n const childIdx = childCounters.get(childType) || 0;\n childCounters.set(childType, childIdx + 1);\n\n const childElements = revElement[childType];\n if (childElements) {\n const childArray = Array.isArray(childElements) ? childElements : [childElements];\n if (childIdx < childArray.length) {\n orderedElements.push({\n type: childType,\n element: childArray[childIdx],\n });\n }\n }\n }\n } else {\n // No _orderedChildren, extract children in object key order\n const childKeys = Object.keys(revElement).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n for (const childKey of childKeys) {\n const childValue = revElement[childKey];\n const childArray = Array.isArray(childValue) ? childValue : [childValue];\n for (const child of childArray) {\n orderedElements.push({ type: childKey, element: child });\n }\n }\n }\n }\n } else {\n // Regular element - get it from the parent\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n\n const parentElements = parent[type];\n if (parentElements) {\n const parentArray = Array.isArray(parentElements) ? parentElements : [parentElements];\n if (idx < parentArray.length) {\n orderedElements.push({ type, element: parentArray[idx] });\n }\n }\n }\n }\n }\n\n // Remove the revision wrapper\n delete parent[key];\n\n // If we have ordered elements, rebuild the arrays in correct order\n if (orderedElements.length > 0) {\n // Group elements by type\n const rebuiltArrays = new Map<string, any[]>();\n\n for (const { type, element } of orderedElements) {\n if (!rebuiltArrays.has(type)) {\n rebuiltArrays.set(type, []);\n }\n rebuiltArrays.get(type)!.push(element);\n }\n\n // Update parent with rebuilt arrays\n for (const [type, elements] of rebuiltArrays) {\n if (elements.length === 1) {\n parent[type] = elements[0];\n } else {\n parent[type] = elements;\n }\n }\n\n // Rebuild _orderedChildren\n const newOrderedChildren: OrderedChildInfo[] = [];\n const typeCounters = new Map<string, number>();\n\n for (const { type } of orderedElements) {\n const idx = typeCounters.get(type) || 0;\n typeCounters.set(type, idx + 1);\n newOrderedChildren.push({ type, index: idx });\n }\n\n parent._orderedChildren = newOrderedChildren;\n } else {\n // Fallback for when there's no _orderedChildren - just merge\n for (const element of elementArray) {\n if (!element || typeof element !== 'object') continue;\n\n const elementKeys = Object.keys(element).filter(\n (k) => !k.startsWith('@_') && k !== '#text' && k !== '_orderedChildren'\n );\n\n for (const childKey of elementKeys) {\n RevisionWalker.mergeIntoParent(parent, childKey, element[childKey]);\n }\n }\n }\n }\n\n /**\n * Remove all elements of a given type (including their content)\n */\n private static removeAllElements(parent: any, key: string): void {\n if (!parent[key]) return;\n\n // Update _orderedChildren before removing\n if (parent._orderedChildren) {\n parent._orderedChildren = parent._orderedChildren.filter(\n (c: OrderedChildInfo) => c.type !== key\n );\n // Re-index remaining elements of same types\n RevisionWalker.reindexOrderedChildren(parent._orderedChildren);\n }\n\n // Remove the element\n delete parent[key];\n }\n\n /**\n * Merge a child value into the parent, handling arrays properly\n */\n private static mergeIntoParent(parent: any, childKey: string, childValue: any): void {\n if (parent[childKey] === undefined) {\n // No existing value, just assign\n parent[childKey] = childValue;\n } else {\n // Existing value, need to merge\n const existing = parent[childKey];\n const incoming = Array.isArray(childValue) ? childValue : [childValue];\n\n if (Array.isArray(existing)) {\n parent[childKey] = [...existing, ...incoming];\n } else {\n parent[childKey] = [existing, ...incoming];\n }\n }\n }\n\n /**\n * Re-index _orderedChildren to ensure indices are sequential per type\n */\n private static reindexOrderedChildren(orderedChildren: OrderedChildInfo[]): void {\n const typeCounters = new Map<string, number>();\n\n for (const entry of orderedChildren) {\n const currentIndex = typeCounters.get(entry.type) || 0;\n entry.index = currentIndex;\n typeCounters.set(entry.type, currentIndex + 1);\n }\n }\n\n /**\n * Check if an element is a revision-related element (any type)\n */\n static isRevisionElement(key: string): boolean {\n return (\n REVISION_ELEMENTS.UNWRAP.includes(key) ||\n REVISION_ELEMENTS.REMOVE.includes(key) ||\n REVISION_ELEMENTS.PROPERTY_CHANGES.includes(key) ||\n REVISION_ELEMENTS.RANGE_MARKERS.includes(key)\n );\n }\n\n /**\n * Get revision element categories (for external use/testing)\n */\n static getRevisionElementCategories(): typeof REVISION_ELEMENTS {\n return { ...REVISION_ELEMENTS };\n }\n}\n"]}