docxmlater 10.1.4 → 10.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/README.md +759 -754
  2. package/dist/constants/legacyCompatFlags.js +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.js.map +1 -1
  5. package/dist/core/Document.d.ts +51 -50
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +486 -471
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +9 -9
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +1 -1
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentGenerator.d.ts +11 -11
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +251 -251
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.js.map +1 -1
  18. package/dist/core/DocumentParser.d.ts +15 -15
  19. package/dist/core/DocumentParser.d.ts.map +1 -1
  20. package/dist/core/DocumentParser.js +2123 -2155
  21. package/dist/core/DocumentParser.js.map +1 -1
  22. package/dist/core/DocumentValidator.d.ts.map +1 -1
  23. package/dist/core/DocumentValidator.js +2 -5
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.js.map +1 -1
  26. package/dist/core/RelationshipManager.d.ts.map +1 -1
  27. package/dist/core/RelationshipManager.js +3 -3
  28. package/dist/core/RelationshipManager.js.map +1 -1
  29. package/dist/elements/AlternateContent.js.map +1 -1
  30. package/dist/elements/Bookmark.d.ts.map +1 -1
  31. package/dist/elements/Bookmark.js +3 -1
  32. package/dist/elements/Bookmark.js.map +1 -1
  33. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  34. package/dist/elements/BookmarkManager.js.map +1 -1
  35. package/dist/elements/Comment.d.ts.map +1 -1
  36. package/dist/elements/Comment.js +9 -6
  37. package/dist/elements/Comment.js.map +1 -1
  38. package/dist/elements/CommentManager.d.ts.map +1 -1
  39. package/dist/elements/CommentManager.js +18 -17
  40. package/dist/elements/CommentManager.js.map +1 -1
  41. package/dist/elements/CommonTypes.d.ts +21 -21
  42. package/dist/elements/CommonTypes.d.ts.map +1 -1
  43. package/dist/elements/CommonTypes.js +56 -56
  44. package/dist/elements/CommonTypes.js.map +1 -1
  45. package/dist/elements/CustomXml.js.map +1 -1
  46. package/dist/elements/Endnote.d.ts.map +1 -1
  47. package/dist/elements/Endnote.js +6 -6
  48. package/dist/elements/Endnote.js.map +1 -1
  49. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  50. package/dist/elements/EndnoteManager.js +6 -7
  51. package/dist/elements/EndnoteManager.js.map +1 -1
  52. package/dist/elements/Field.d.ts.map +1 -1
  53. package/dist/elements/Field.js +82 -25
  54. package/dist/elements/Field.js.map +1 -1
  55. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  56. package/dist/elements/FieldHelpers.js.map +1 -1
  57. package/dist/elements/FontManager.d.ts.map +1 -1
  58. package/dist/elements/FontManager.js +1 -1
  59. package/dist/elements/FontManager.js.map +1 -1
  60. package/dist/elements/Footer.js +2 -2
  61. package/dist/elements/Footer.js.map +1 -1
  62. package/dist/elements/Footnote.d.ts.map +1 -1
  63. package/dist/elements/Footnote.js +6 -6
  64. package/dist/elements/Footnote.js.map +1 -1
  65. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  66. package/dist/elements/FootnoteManager.js +6 -7
  67. package/dist/elements/FootnoteManager.js.map +1 -1
  68. package/dist/elements/Header.js +2 -2
  69. package/dist/elements/Header.js.map +1 -1
  70. package/dist/elements/HeaderFooterManager.js.map +1 -1
  71. package/dist/elements/Hyperlink.d.ts +5 -3
  72. package/dist/elements/Hyperlink.d.ts.map +1 -1
  73. package/dist/elements/Hyperlink.js +134 -76
  74. package/dist/elements/Hyperlink.js.map +1 -1
  75. package/dist/elements/Image.d.ts.map +1 -1
  76. package/dist/elements/Image.js +238 -106
  77. package/dist/elements/Image.js.map +1 -1
  78. package/dist/elements/ImageManager.d.ts.map +1 -1
  79. package/dist/elements/ImageManager.js +1 -1
  80. package/dist/elements/ImageManager.js.map +1 -1
  81. package/dist/elements/ImageRun.js +1 -1
  82. package/dist/elements/ImageRun.js.map +1 -1
  83. package/dist/elements/MathElement.js.map +1 -1
  84. package/dist/elements/Paragraph.d.ts +24 -24
  85. package/dist/elements/Paragraph.d.ts.map +1 -1
  86. package/dist/elements/Paragraph.js +181 -188
  87. package/dist/elements/Paragraph.js.map +1 -1
  88. package/dist/elements/PreservedElement.js.map +1 -1
  89. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  90. package/dist/elements/PropertyChangeTypes.js +6 -6
  91. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  92. package/dist/elements/RangeMarker.d.ts.map +1 -1
  93. package/dist/elements/RangeMarker.js.map +1 -1
  94. package/dist/elements/Revision.d.ts.map +1 -1
  95. package/dist/elements/Revision.js +4 -5
  96. package/dist/elements/Revision.js.map +1 -1
  97. package/dist/elements/RevisionContent.js.map +1 -1
  98. package/dist/elements/RevisionManager.d.ts.map +1 -1
  99. package/dist/elements/RevisionManager.js +40 -48
  100. package/dist/elements/RevisionManager.js.map +1 -1
  101. package/dist/elements/Run.d.ts +16 -16
  102. package/dist/elements/Run.d.ts.map +1 -1
  103. package/dist/elements/Run.js +256 -238
  104. package/dist/elements/Run.js.map +1 -1
  105. package/dist/elements/Section.d.ts.map +1 -1
  106. package/dist/elements/Section.js +36 -11
  107. package/dist/elements/Section.js.map +1 -1
  108. package/dist/elements/Shape.d.ts.map +1 -1
  109. package/dist/elements/Shape.js.map +1 -1
  110. package/dist/elements/StructuredDocumentTag.d.ts +6 -6
  111. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  112. package/dist/elements/StructuredDocumentTag.js +99 -104
  113. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  114. package/dist/elements/Table.d.ts +11 -11
  115. package/dist/elements/Table.d.ts.map +1 -1
  116. package/dist/elements/Table.js +102 -107
  117. package/dist/elements/Table.js.map +1 -1
  118. package/dist/elements/TableCell.d.ts +10 -10
  119. package/dist/elements/TableCell.d.ts.map +1 -1
  120. package/dist/elements/TableCell.js +105 -106
  121. package/dist/elements/TableCell.js.map +1 -1
  122. package/dist/elements/TableGridChange.d.ts.map +1 -1
  123. package/dist/elements/TableGridChange.js.map +1 -1
  124. package/dist/elements/TableOfContents.d.ts.map +1 -1
  125. package/dist/elements/TableOfContents.js +4 -4
  126. package/dist/elements/TableOfContents.js.map +1 -1
  127. package/dist/elements/TableOfContentsElement.js.map +1 -1
  128. package/dist/elements/TableRow.d.ts.map +1 -1
  129. package/dist/elements/TableRow.js +13 -6
  130. package/dist/elements/TableRow.js.map +1 -1
  131. package/dist/elements/TextBox.d.ts.map +1 -1
  132. package/dist/elements/TextBox.js +3 -5
  133. package/dist/elements/TextBox.js.map +1 -1
  134. package/dist/formatting/AbstractNumbering.d.ts +4 -4
  135. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  136. package/dist/formatting/AbstractNumbering.js +54 -49
  137. package/dist/formatting/AbstractNumbering.js.map +1 -1
  138. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  139. package/dist/formatting/NumberingInstance.js +1 -3
  140. package/dist/formatting/NumberingInstance.js.map +1 -1
  141. package/dist/formatting/NumberingLevel.d.ts +5 -5
  142. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  143. package/dist/formatting/NumberingLevel.js +119 -125
  144. package/dist/formatting/NumberingLevel.js.map +1 -1
  145. package/dist/formatting/NumberingManager.d.ts +1 -0
  146. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  147. package/dist/formatting/NumberingManager.js +27 -9
  148. package/dist/formatting/NumberingManager.js.map +1 -1
  149. package/dist/formatting/Style.d.ts +11 -11
  150. package/dist/formatting/Style.d.ts.map +1 -1
  151. package/dist/formatting/Style.js +219 -247
  152. package/dist/formatting/Style.js.map +1 -1
  153. package/dist/formatting/StylesManager.d.ts +2 -2
  154. package/dist/formatting/StylesManager.d.ts.map +1 -1
  155. package/dist/formatting/StylesManager.js +96 -102
  156. package/dist/formatting/StylesManager.js.map +1 -1
  157. package/dist/helpers/CleanupHelper.d.ts +1 -1
  158. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  159. package/dist/helpers/CleanupHelper.js +6 -6
  160. package/dist/helpers/CleanupHelper.js.map +1 -1
  161. package/dist/images/ImageOptimizer.js +7 -7
  162. package/dist/images/ImageOptimizer.js.map +1 -1
  163. package/dist/index.d.ts +9 -9
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js.map +1 -1
  166. package/dist/managers/DrawingManager.js.map +1 -1
  167. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  168. package/dist/tracking/DocumentTrackingContext.js +23 -7
  169. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  170. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  171. package/dist/tracking/TrackingContext.js.map +1 -1
  172. package/dist/types/compatibility-types.js.map +1 -1
  173. package/dist/types/formatting.js.map +1 -1
  174. package/dist/types/list-types.d.ts +6 -6
  175. package/dist/types/list-types.js.map +1 -1
  176. package/dist/types/settings-types.js.map +1 -1
  177. package/dist/types/styleConfig.d.ts +2 -2
  178. package/dist/types/styleConfig.js.map +1 -1
  179. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  180. package/dist/utils/ChangelogGenerator.js +97 -101
  181. package/dist/utils/ChangelogGenerator.js.map +1 -1
  182. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  183. package/dist/utils/CompatibilityUpgrader.js +1 -1
  184. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  185. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  186. package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
  187. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  188. package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
  189. package/dist/utils/MoveOperationHelper.js +1 -1
  190. package/dist/utils/MoveOperationHelper.js.map +1 -1
  191. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  192. package/dist/utils/RevisionAwareProcessor.js +2 -4
  193. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  194. package/dist/utils/RevisionWalker.d.ts.map +1 -1
  195. package/dist/utils/RevisionWalker.js +4 -12
  196. package/dist/utils/RevisionWalker.js.map +1 -1
  197. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  198. package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
  199. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  200. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  201. package/dist/utils/ShadingResolver.js +1 -1
  202. package/dist/utils/ShadingResolver.js.map +1 -1
  203. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  204. package/dist/utils/acceptRevisions.js +23 -12
  205. package/dist/utils/acceptRevisions.js.map +1 -1
  206. package/dist/utils/cnfStyleDecoder.d.ts +1 -1
  207. package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
  208. package/dist/utils/cnfStyleDecoder.js +40 -40
  209. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  210. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  211. package/dist/utils/corruptionDetection.js.map +1 -1
  212. package/dist/utils/dateFormatting.js.map +1 -1
  213. package/dist/utils/deepClone.js +1 -1
  214. package/dist/utils/deepClone.js.map +1 -1
  215. package/dist/utils/diagnostics.d.ts.map +1 -1
  216. package/dist/utils/diagnostics.js +1 -1
  217. package/dist/utils/diagnostics.js.map +1 -1
  218. package/dist/utils/errorHandling.js.map +1 -1
  219. package/dist/utils/formatting.d.ts.map +1 -1
  220. package/dist/utils/formatting.js +10 -2
  221. package/dist/utils/formatting.js.map +1 -1
  222. package/dist/utils/list-detection.d.ts +2 -2
  223. package/dist/utils/list-detection.d.ts.map +1 -1
  224. package/dist/utils/list-detection.js +21 -23
  225. package/dist/utils/list-detection.js.map +1 -1
  226. package/dist/utils/logger.d.ts.map +1 -1
  227. package/dist/utils/logger.js +12 -7
  228. package/dist/utils/logger.js.map +1 -1
  229. package/dist/utils/parsingHelpers.js.map +1 -1
  230. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  231. package/dist/utils/stripTrackedChanges.js +3 -3
  232. package/dist/utils/stripTrackedChanges.js.map +1 -1
  233. package/dist/utils/textDiff.d.ts +1 -1
  234. package/dist/utils/textDiff.js +8 -8
  235. package/dist/utils/textDiff.js.map +1 -1
  236. package/dist/utils/units.js.map +1 -1
  237. package/dist/utils/validation.d.ts.map +1 -1
  238. package/dist/utils/validation.js +24 -7
  239. package/dist/utils/validation.js.map +1 -1
  240. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  241. package/dist/utils/xmlSanitization.js +3 -3
  242. package/dist/utils/xmlSanitization.js.map +1 -1
  243. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  244. package/dist/validation/RevisionAutoFixer.js +5 -5
  245. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  246. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  247. package/dist/validation/RevisionValidator.js +7 -9
  248. package/dist/validation/RevisionValidator.js.map +1 -1
  249. package/dist/validation/ValidationRules.js +3 -3
  250. package/dist/validation/ValidationRules.js.map +1 -1
  251. package/dist/validation/index.js.map +1 -1
  252. package/dist/xml/XMLBuilder.d.ts +1 -1
  253. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  254. package/dist/xml/XMLBuilder.js +98 -100
  255. package/dist/xml/XMLBuilder.js.map +1 -1
  256. package/dist/xml/XMLParser.d.ts.map +1 -1
  257. package/dist/xml/XMLParser.js +61 -66
  258. package/dist/xml/XMLParser.js.map +1 -1
  259. package/dist/zip/ZipHandler.d.ts.map +1 -1
  260. package/dist/zip/ZipHandler.js.map +1 -1
  261. package/dist/zip/ZipReader.d.ts.map +1 -1
  262. package/dist/zip/ZipReader.js +1 -3
  263. package/dist/zip/ZipReader.js.map +1 -1
  264. package/dist/zip/ZipWriter.d.ts +1 -1
  265. package/dist/zip/ZipWriter.d.ts.map +1 -1
  266. package/dist/zip/ZipWriter.js +28 -36
  267. package/dist/zip/ZipWriter.js.map +1 -1
  268. package/dist/zip/types.js +1 -1
  269. package/dist/zip/types.js.map +1 -1
  270. package/package.json +92 -92
  271. package/src/__tests__/helper-methods.test.ts +512 -512
  272. package/src/constants/legacyCompatFlags.ts +138 -138
  273. package/src/constants/limits.ts +50 -50
  274. package/src/core/Document.ts +1010 -1145
  275. package/src/core/DocumentContent.ts +461 -467
  276. package/src/core/DocumentGenerator.ts +1133 -1104
  277. package/src/core/DocumentIdManager.ts +158 -158
  278. package/src/core/DocumentParser.ts +2347 -2716
  279. package/src/core/DocumentValidator.ts +363 -372
  280. package/src/core/Relationship.ts +367 -367
  281. package/src/core/RelationshipManager.ts +429 -428
  282. package/src/elements/AlternateContent.ts +42 -42
  283. package/src/elements/Bookmark.ts +212 -210
  284. package/src/elements/BookmarkManager.ts +247 -250
  285. package/src/elements/Comment.ts +356 -359
  286. package/src/elements/CommentManager.ts +499 -502
  287. package/src/elements/CommonTypes.ts +524 -549
  288. package/src/elements/CustomXml.ts +36 -36
  289. package/src/elements/Endnote.ts +221 -217
  290. package/src/elements/EndnoteManager.ts +246 -249
  291. package/src/elements/Field.ts +1292 -1233
  292. package/src/elements/FieldHelpers.ts +329 -333
  293. package/src/elements/FontManager.ts +336 -339
  294. package/src/elements/Footer.ts +269 -269
  295. package/src/elements/Footnote.ts +221 -217
  296. package/src/elements/FootnoteManager.ts +246 -249
  297. package/src/elements/Header.ts +269 -269
  298. package/src/elements/HeaderFooterManager.ts +219 -219
  299. package/src/elements/Hyperlink.ts +1288 -1193
  300. package/src/elements/Image.ts +1982 -1756
  301. package/src/elements/ImageManager.ts +437 -432
  302. package/src/elements/ImageRun.ts +59 -59
  303. package/src/elements/MathElement.ts +65 -65
  304. package/src/elements/Paragraph.ts +4347 -4287
  305. package/src/elements/PreservedElement.ts +53 -53
  306. package/src/elements/PropertyChangeTypes.ts +458 -442
  307. package/src/elements/RangeMarker.ts +382 -400
  308. package/src/elements/Revision.ts +1198 -1217
  309. package/src/elements/RevisionContent.ts +73 -73
  310. package/src/elements/RevisionManager.ts +1070 -1070
  311. package/src/elements/Run.ts +3103 -3073
  312. package/src/elements/Section.ts +1521 -1421
  313. package/src/elements/Shape.ts +884 -873
  314. package/src/elements/StructuredDocumentTag.ts +1176 -1207
  315. package/src/elements/Table.ts +2468 -2524
  316. package/src/elements/TableCell.ts +1617 -1621
  317. package/src/elements/TableGridChange.ts +149 -151
  318. package/src/elements/TableOfContents.ts +701 -691
  319. package/src/elements/TableOfContentsElement.ts +89 -89
  320. package/src/elements/TableRow.ts +960 -929
  321. package/src/elements/TextBox.ts +766 -768
  322. package/src/formatting/AbstractNumbering.ts +580 -579
  323. package/src/formatting/NumberingInstance.ts +295 -299
  324. package/src/formatting/NumberingLevel.ts +981 -1040
  325. package/src/formatting/NumberingManager.ts +875 -827
  326. package/src/formatting/Style.ts +1785 -1879
  327. package/src/formatting/StylesManager.ts +1090 -1130
  328. package/src/helpers/CleanupHelper.ts +524 -524
  329. package/src/images/ImageOptimizer.ts +274 -274
  330. package/src/index.ts +559 -554
  331. package/src/managers/DrawingManager.ts +319 -319
  332. package/src/tracking/DocumentTrackingContext.ts +687 -674
  333. package/src/tracking/TrackingContext.ts +175 -173
  334. package/src/types/compatibility-types.ts +49 -49
  335. package/src/types/formatting.ts +210 -210
  336. package/src/types/list-types.ts +14 -14
  337. package/src/types/settings-types.ts +59 -59
  338. package/src/types/styleConfig.ts +189 -189
  339. package/src/utils/ChangelogGenerator.ts +1583 -1581
  340. package/src/utils/CompatibilityUpgrader.ts +235 -237
  341. package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
  342. package/src/utils/MoveOperationHelper.ts +233 -238
  343. package/src/utils/RevisionAwareProcessor.ts +518 -526
  344. package/src/utils/RevisionWalker.ts +427 -457
  345. package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
  346. package/src/utils/ShadingResolver.ts +105 -107
  347. package/src/utils/acceptRevisions.ts +723 -714
  348. package/src/utils/cnfStyleDecoder.ts +212 -217
  349. package/src/utils/corruptionDetection.ts +346 -345
  350. package/src/utils/dateFormatting.ts +20 -20
  351. package/src/utils/deepClone.ts +77 -78
  352. package/src/utils/diagnostics.ts +125 -129
  353. package/src/utils/errorHandling.ts +80 -80
  354. package/src/utils/formatting.ts +220 -213
  355. package/src/utils/list-detection.ts +32 -42
  356. package/src/utils/logger.ts +412 -404
  357. package/src/utils/parsingHelpers.ts +190 -190
  358. package/src/utils/stripTrackedChanges.ts +356 -353
  359. package/src/utils/textDiff.ts +100 -100
  360. package/src/utils/units.ts +421 -421
  361. package/src/utils/validation.ts +553 -542
  362. package/src/utils/xmlSanitization.ts +179 -182
  363. package/src/validation/RevisionAutoFixer.ts +541 -542
  364. package/src/validation/RevisionValidator.ts +470 -460
  365. package/src/validation/ValidationRules.ts +338 -338
  366. package/src/validation/index.ts +30 -30
  367. package/src/xml/XMLBuilder.ts +857 -871
  368. package/src/xml/XMLParser.ts +877 -919
  369. package/src/zip/ZipHandler.ts +629 -637
  370. package/src/zip/ZipReader.ts +295 -299
  371. package/src/zip/ZipWriter.ts +374 -390
  372. package/src/zip/types.ts +116 -116
@@ -1,442 +1,458 @@
1
- /**
2
- * PropertyChangeTypes - Type definitions for property change tracking in revisions
3
- *
4
- * These types represent the parsed data from OOXML property change elements:
5
- * - w:rPrChange (run property changes)
6
- * - w:pPrChange (paragraph property changes)
7
- * - w:tblPrChange, w:trPrChange, w:tcPrChange (table property changes)
8
- * - w:sectPrChange (section property changes)
9
- * - w:numberingChange (numbering property changes)
10
- *
11
- * Per ECMA-376, property change elements track the PREVIOUS state of properties
12
- * before a change was made, allowing Word to show what changed and enabling
13
- * accept/reject functionality.
14
- *
15
- * @module PropertyChangeTypes
16
- */
17
-
18
- import type { RunFormatting } from './Run';
19
- import type { ShadingConfig } from './CommonTypes';
20
-
21
- /**
22
- * Common base for all property change types
23
- */
24
- export interface PropertyChangeBase {
25
- /** Unique revision ID (ST_DecimalNumber) */
26
- id: number;
27
- /** Author who made the change (required) */
28
- author: string;
29
- /** Date when the change was made (ISO 8601) */
30
- date: Date;
31
- }
32
-
33
- /**
34
- * Run property change (w:rPrChange)
35
- *
36
- * Tracks changes to run-level formatting such as:
37
- * - Bold, italic, underline
38
- * - Font name, size, color
39
- * - Highlight, strikethrough
40
- * - Character spacing, subscript/superscript
41
- *
42
- * @example
43
- * ```xml
44
- * <w:rPrChange w:id="1" w:author="John" w:date="2024-01-15T10:30:00Z">
45
- * <w:rPr>
46
- * <w:b/> <!-- Was bold before change -->
47
- * </w:rPr>
48
- * </w:rPrChange>
49
- * ```
50
- */
51
- export interface RunPropertyChange extends PropertyChangeBase {
52
- /** Previous run formatting properties before the change */
53
- previousProperties: Partial<RunFormatting>;
54
- }
55
-
56
- /**
57
- * Border definition for paragraph borders
58
- * Per ECMA-376 Part 1 Section 17.3.1.24
59
- */
60
- export interface ParagraphBorderDef {
61
- /** Border style (single, double, dotted, dashed, etc.) */
62
- val?: string;
63
- /** Border width in eighths of a point */
64
- sz?: number;
65
- /** Space between border and content in points */
66
- space?: number;
67
- /** Border color (hex RGB without #) */
68
- color?: string;
69
- /** Theme color reference */
70
- themeColor?: string;
71
- }
72
-
73
- /**
74
- * Paragraph borders (w:pBdr)
75
- * Per ECMA-376 Part 1 Section 17.3.1.24
76
- */
77
- export interface ParagraphBorders {
78
- /** Top border */
79
- top?: ParagraphBorderDef;
80
- /** Bottom border */
81
- bottom?: ParagraphBorderDef;
82
- /** Left border */
83
- left?: ParagraphBorderDef;
84
- /** Right border */
85
- right?: ParagraphBorderDef;
86
- /** Border between paragraphs with same borders */
87
- between?: ParagraphBorderDef;
88
- /** Bar border (vertical line) */
89
- bar?: ParagraphBorderDef;
90
- }
91
-
92
- /**
93
- * Paragraph shading (w:shd)
94
- * @see ShadingConfig in CommonTypes.ts for the canonical definition
95
- */
96
- export type ParagraphShading = ShadingConfig;
97
-
98
- /**
99
- * Tab stop definition
100
- * Per ECMA-376 Part 1 Section 17.3.1.38
101
- */
102
- export interface TabStopDef {
103
- /** Tab stop type (left, right, center, decimal, bar, clear) */
104
- val?: string;
105
- /** Tab position in twips */
106
- pos?: number;
107
- /** Leader character (none, dot, hyphen, underscore, middleDot) */
108
- leader?: string;
109
- }
110
-
111
- /**
112
- * Paragraph formatting options (subset for type safety)
113
- * Full ParagraphFormatting is in Paragraph.ts but we need a partial here
114
- *
115
- * Per ECMA-376 Part 1 Section 17.3.1, this covers all paragraph properties
116
- * that can be tracked in w:pPrChange revision elements.
117
- */
118
- export interface ParagraphFormattingPartial {
119
- /** Text alignment: left, center, right, justify */
120
- alignment?: 'left' | 'center' | 'right' | 'justify';
121
- /** Left indentation in twips */
122
- leftIndent?: number;
123
- /** Right indentation in twips */
124
- rightIndent?: number;
125
- /** First line indentation in twips */
126
- firstLineIndent?: number;
127
- /** Hanging indentation in twips */
128
- hangingIndent?: number;
129
- /** Spacing before paragraph in twips */
130
- spaceBefore?: number;
131
- /** Spacing after paragraph in twips */
132
- spaceAfter?: number;
133
- /** Line spacing in twips */
134
- lineSpacing?: number;
135
- /** Line spacing rule */
136
- lineSpacingRule?: 'auto' | 'exact' | 'atLeast';
137
- /** Paragraph style ID */
138
- style?: string;
139
- /** Keep with next paragraph */
140
- keepNext?: boolean;
141
- /** Keep lines together */
142
- keepLines?: boolean;
143
- /** Page break before */
144
- pageBreakBefore?: boolean;
145
- /** Widow/orphan control */
146
- widowControl?: boolean;
147
- /** Suppress auto-hyphenation */
148
- suppressAutoHyphens?: boolean;
149
- /** Contextual spacing */
150
- contextualSpacing?: boolean;
151
- /** Mirror indents */
152
- mirrorIndents?: boolean;
153
- /** Outline level (for headings) */
154
- outlineLevel?: number;
155
- /** Right-to-left paragraph */
156
- bidi?: boolean;
157
- /** Numbering properties (list formatting) */
158
- numbering?: {
159
- numId?: number;
160
- level?: number;
161
- };
162
-
163
- // === Extended properties for full ECMA-376 compliance ===
164
-
165
- /**
166
- * Paragraph borders (w:pBdr)
167
- * Per ECMA-376 Part 1 Section 17.3.1.24
168
- */
169
- borders?: ParagraphBorders;
170
-
171
- /**
172
- * Paragraph shading/background (w:shd)
173
- * Per ECMA-376 Part 1 Section 17.3.1.32
174
- */
175
- shading?: ParagraphShading;
176
-
177
- /**
178
- * Custom tab stops (w:tabs)
179
- * Per ECMA-376 Part 1 Section 17.3.1.38
180
- */
181
- tabs?: TabStopDef[];
182
-
183
- /**
184
- * Text direction (w:textDirection)
185
- * Per ECMA-376 Part 1 Section 17.3.1.40
186
- * Values: lrTb, tbRl, btLr, lrTbV, tbRlV, tbLrV
187
- */
188
- textDirection?: string;
189
-
190
- /**
191
- * Text alignment (w:textAlignment)
192
- * Per ECMA-376 Part 1 Section 17.3.1.39
193
- * Values: auto, top, center, baseline, bottom
194
- */
195
- textAlignment?: string;
196
-
197
- /**
198
- * Suppress line numbers (w:suppressLineNumbers)
199
- * Per ECMA-376 Part 1 Section 17.3.1.35
200
- */
201
- suppressLineNumbers?: boolean;
202
-
203
- /**
204
- * Adjust right indent (w:adjustRightInd)
205
- * Per ECMA-376 Part 1 Section 17.3.1.1
206
- */
207
- adjustRightInd?: boolean;
208
-
209
- /**
210
- * Snap to grid (w:snapToGrid)
211
- * Per ECMA-376 Part 1 Section 17.3.1.33
212
- */
213
- snapToGrid?: boolean;
214
-
215
- /**
216
- * Word wrap (w:wordWrap)
217
- * Per ECMA-376 Part 1 Section 17.3.1.44
218
- */
219
- wordWrap?: boolean;
220
-
221
- /**
222
- * Auto space between East Asian and numeric (w:autoSpaceDE)
223
- */
224
- autoSpaceDE?: boolean;
225
-
226
- /**
227
- * Auto space between East Asian and Western (w:autoSpaceDN)
228
- */
229
- autoSpaceDN?: boolean;
230
- }
231
-
232
- /**
233
- * Paragraph property change (w:pPrChange)
234
- *
235
- * Tracks changes to paragraph-level formatting such as:
236
- * - Alignment (left, center, right, justify)
237
- * - Indentation (left, right, first line, hanging)
238
- * - Spacing (before, after, line)
239
- * - Keep with next, keep lines together
240
- * - Paragraph style
241
- * - Numbering/list formatting (numId, ilvl)
242
- *
243
- * @example
244
- * ```xml
245
- * <w:pPrChange w:id="2" w:author="Jane" w:date="2024-01-15T11:00:00Z">
246
- * <w:pPr>
247
- * <w:jc w:val="left"/> <!-- Was left-aligned before change -->
248
- * </w:pPr>
249
- * </w:pPrChange>
250
- * ```
251
- */
252
- export interface ParagraphPropertyChange extends PropertyChangeBase {
253
- /** Previous paragraph formatting properties before the change */
254
- previousProperties: Partial<ParagraphFormattingPartial>;
255
- }
256
-
257
- /**
258
- * Table property change types
259
- */
260
- export type TablePropertyChangeType = 'table' | 'row' | 'cell';
261
-
262
- /**
263
- * Table property change (w:tblPrChange, w:trPrChange, w:tcPrChange)
264
- *
265
- * Tracks changes to table-level properties including:
266
- * - Table: width, alignment, borders, shading
267
- * - Row: height, header row, can't split
268
- * - Cell: width, vertical alignment, borders, shading, merge
269
- *
270
- * @example
271
- * ```xml
272
- * <w:tblPrChange w:id="3" w:author="John" w:date="2024-01-15T12:00:00Z">
273
- * <w:tblPr>
274
- * <w:tblW w:w="5000" w:type="pct"/>
275
- * </w:tblPr>
276
- * </w:tblPrChange>
277
- * ```
278
- */
279
- export interface TablePropertyChange extends PropertyChangeBase {
280
- /** Type of table element (table, row, or cell) */
281
- elementType: TablePropertyChangeType;
282
- /** Previous table properties before the change */
283
- previousProperties: Record<string, any>;
284
- }
285
-
286
- /**
287
- * Section property change (w:sectPrChange)
288
- *
289
- * Tracks changes to section-level properties such as:
290
- * - Page size (width, height)
291
- * - Page margins (top, bottom, left, right, header, footer, gutter)
292
- * - Page orientation (portrait, landscape)
293
- * - Columns configuration
294
- * - Page numbering
295
- *
296
- * @example
297
- * ```xml
298
- * <w:sectPrChange w:id="4" w:author="Jane" w:date="2024-01-15T13:00:00Z">
299
- * <w:sectPr>
300
- * <w:pgSz w:w="12240" w:h="15840"/>
301
- * <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"/>
302
- * </w:sectPr>
303
- * </w:sectPrChange>
304
- * ```
305
- */
306
- export interface SectionPropertyChange extends PropertyChangeBase {
307
- /** Previous section properties before the change */
308
- previousProperties: Record<string, any>;
309
- }
310
-
311
- /**
312
- * Numbering change (w:numberingChange)
313
- *
314
- * Tracks changes to list numbering properties:
315
- * - Numbering definition ID
316
- * - Indentation level
317
- * - Starting number
318
- *
319
- * @example
320
- * ```xml
321
- * <w:numberingChange w:id="5" w:author="John" w:date="2024-01-15T14:00:00Z"
322
- * w:original="1" />
323
- * ```
324
- */
325
- export interface NumberingChange extends PropertyChangeBase {
326
- /** Previous numbering definition ID */
327
- previousNumId?: number;
328
- /** Previous indentation level */
329
- previousIlvl?: number;
330
- /** Original numbering format string */
331
- original?: string;
332
- }
333
-
334
- /**
335
- * Location of a revision within the document structure
336
- * Used for precise change tracking and changelog generation
337
- */
338
- export interface RevisionLocation {
339
- /** Paragraph index within the document body (0-based) */
340
- paragraphIndex?: number;
341
- /** Run index within the paragraph (0-based) */
342
- runIndex?: number;
343
- /** Table row index (0-based) - only for table revisions */
344
- tableRow?: number;
345
- /** Table cell index within row (0-based) - only for table revisions */
346
- tableCell?: number;
347
- /** Section index (0-based) - only for section revisions */
348
- sectionIndex?: number;
349
- /** Header/footer type if revision is in header/footer */
350
- headerFooterType?: 'header' | 'footer' | 'firstHeader' | 'firstFooter' | 'evenHeader' | 'evenFooter';
351
- }
352
-
353
- /**
354
- * Union type for all property change types
355
- */
356
- export type AnyPropertyChange =
357
- | RunPropertyChange
358
- | ParagraphPropertyChange
359
- | TablePropertyChange
360
- | SectionPropertyChange
361
- | NumberingChange;
362
-
363
- /**
364
- * Type guard to check if a property change is a RunPropertyChange
365
- *
366
- * Note: Empty previousProperties cannot be reliably typed - this guard returns
367
- * false for empty objects. Use context-aware typing when the source is known.
368
- */
369
- export function isRunPropertyChange(change: AnyPropertyChange): change is RunPropertyChange {
370
- if (!('previousProperties' in change) || 'elementType' in change || 'previousNumId' in change) {
371
- return false;
372
- }
373
- // Check for typical run properties - must have at least one identifiable property
374
- const props = change.previousProperties as Partial<RunFormatting>;
375
- return props.bold !== undefined ||
376
- props.italic !== undefined ||
377
- props.font !== undefined ||
378
- props.size !== undefined ||
379
- props.color !== undefined ||
380
- props.underline !== undefined ||
381
- props.strike !== undefined ||
382
- props.highlight !== undefined ||
383
- props.smallCaps !== undefined ||
384
- props.allCaps !== undefined ||
385
- props.subscript !== undefined ||
386
- props.superscript !== undefined;
387
- }
388
-
389
- /**
390
- * Type guard to check if a property change is a ParagraphPropertyChange
391
- */
392
- export function isParagraphPropertyChange(change: AnyPropertyChange): change is ParagraphPropertyChange {
393
- return 'previousProperties' in change &&
394
- !('elementType' in change) &&
395
- !('previousNumId' in change) &&
396
- // Check for typical paragraph properties
397
- ((change.previousProperties as ParagraphFormattingPartial).alignment !== undefined ||
398
- (change.previousProperties as ParagraphFormattingPartial).leftIndent !== undefined ||
399
- (change.previousProperties as ParagraphFormattingPartial).spaceBefore !== undefined ||
400
- (change.previousProperties as ParagraphFormattingPartial).style !== undefined);
401
- }
402
-
403
- /**
404
- * Type guard to check if a property change is a TablePropertyChange
405
- */
406
- export function isTablePropertyChange(change: AnyPropertyChange): change is TablePropertyChange {
407
- return 'elementType' in change;
408
- }
409
-
410
- /**
411
- * Type guard to check if a property change is a SectionPropertyChange
412
- *
413
- * Checks for section-specific properties: page size, margins, orientation, columns, etc.
414
- * Per ECMA-376, section properties are distinct from run/paragraph properties.
415
- */
416
- export function isSectionPropertyChange(change: AnyPropertyChange): change is SectionPropertyChange {
417
- if (!('previousProperties' in change) || 'elementType' in change || 'previousNumId' in change) {
418
- return false;
419
- }
420
- // Check for section-specific properties
421
- const props = change.previousProperties as Record<string, any>;
422
- return props.pageWidth !== undefined ||
423
- props.pageHeight !== undefined ||
424
- props.orientation !== undefined ||
425
- props.marginTop !== undefined ||
426
- props.marginBottom !== undefined ||
427
- props.marginLeft !== undefined ||
428
- props.marginRight !== undefined ||
429
- props.columns !== undefined ||
430
- props.headerDistance !== undefined ||
431
- props.footerDistance !== undefined ||
432
- props.gutterMargin !== undefined ||
433
- props.pageNumberStart !== undefined ||
434
- props.sectionType !== undefined;
435
- }
436
-
437
- /**
438
- * Type guard to check if a property change is a NumberingChange
439
- */
440
- export function isNumberingChange(change: AnyPropertyChange): change is NumberingChange {
441
- return 'previousNumId' in change || 'previousIlvl' in change || 'original' in change;
442
- }
1
+ /**
2
+ * PropertyChangeTypes - Type definitions for property change tracking in revisions
3
+ *
4
+ * These types represent the parsed data from OOXML property change elements:
5
+ * - w:rPrChange (run property changes)
6
+ * - w:pPrChange (paragraph property changes)
7
+ * - w:tblPrChange, w:trPrChange, w:tcPrChange (table property changes)
8
+ * - w:sectPrChange (section property changes)
9
+ * - w:numberingChange (numbering property changes)
10
+ *
11
+ * Per ECMA-376, property change elements track the PREVIOUS state of properties
12
+ * before a change was made, allowing Word to show what changed and enabling
13
+ * accept/reject functionality.
14
+ *
15
+ * @module PropertyChangeTypes
16
+ */
17
+
18
+ import type { RunFormatting } from './Run';
19
+ import type { ShadingConfig } from './CommonTypes';
20
+
21
+ /**
22
+ * Common base for all property change types
23
+ */
24
+ export interface PropertyChangeBase {
25
+ /** Unique revision ID (ST_DecimalNumber) */
26
+ id: number;
27
+ /** Author who made the change (required) */
28
+ author: string;
29
+ /** Date when the change was made (ISO 8601) */
30
+ date: Date;
31
+ }
32
+
33
+ /**
34
+ * Run property change (w:rPrChange)
35
+ *
36
+ * Tracks changes to run-level formatting such as:
37
+ * - Bold, italic, underline
38
+ * - Font name, size, color
39
+ * - Highlight, strikethrough
40
+ * - Character spacing, subscript/superscript
41
+ *
42
+ * @example
43
+ * ```xml
44
+ * <w:rPrChange w:id="1" w:author="John" w:date="2024-01-15T10:30:00Z">
45
+ * <w:rPr>
46
+ * <w:b/> <!-- Was bold before change -->
47
+ * </w:rPr>
48
+ * </w:rPrChange>
49
+ * ```
50
+ */
51
+ export interface RunPropertyChange extends PropertyChangeBase {
52
+ /** Previous run formatting properties before the change */
53
+ previousProperties: Partial<RunFormatting>;
54
+ }
55
+
56
+ /**
57
+ * Border definition for paragraph borders
58
+ * Per ECMA-376 Part 1 Section 17.3.1.24
59
+ */
60
+ export interface ParagraphBorderDef {
61
+ /** Border style (single, double, dotted, dashed, etc.) */
62
+ val?: string;
63
+ /** Border width in eighths of a point */
64
+ sz?: number;
65
+ /** Space between border and content in points */
66
+ space?: number;
67
+ /** Border color (hex RGB without #) */
68
+ color?: string;
69
+ /** Theme color reference */
70
+ themeColor?: string;
71
+ }
72
+
73
+ /**
74
+ * Paragraph borders (w:pBdr)
75
+ * Per ECMA-376 Part 1 Section 17.3.1.24
76
+ */
77
+ export interface ParagraphBorders {
78
+ /** Top border */
79
+ top?: ParagraphBorderDef;
80
+ /** Bottom border */
81
+ bottom?: ParagraphBorderDef;
82
+ /** Left border */
83
+ left?: ParagraphBorderDef;
84
+ /** Right border */
85
+ right?: ParagraphBorderDef;
86
+ /** Border between paragraphs with same borders */
87
+ between?: ParagraphBorderDef;
88
+ /** Bar border (vertical line) */
89
+ bar?: ParagraphBorderDef;
90
+ }
91
+
92
+ /**
93
+ * Paragraph shading (w:shd)
94
+ * @see ShadingConfig in CommonTypes.ts for the canonical definition
95
+ */
96
+ export type ParagraphShading = ShadingConfig;
97
+
98
+ /**
99
+ * Tab stop definition
100
+ * Per ECMA-376 Part 1 Section 17.3.1.38
101
+ */
102
+ export interface TabStopDef {
103
+ /** Tab stop type (left, right, center, decimal, bar, clear) */
104
+ val?: string;
105
+ /** Tab position in twips */
106
+ pos?: number;
107
+ /** Leader character (none, dot, hyphen, underscore, middleDot) */
108
+ leader?: string;
109
+ }
110
+
111
+ /**
112
+ * Paragraph formatting options (subset for type safety)
113
+ * Full ParagraphFormatting is in Paragraph.ts but we need a partial here
114
+ *
115
+ * Per ECMA-376 Part 1 Section 17.3.1, this covers all paragraph properties
116
+ * that can be tracked in w:pPrChange revision elements.
117
+ */
118
+ export interface ParagraphFormattingPartial {
119
+ /** Text alignment: left, center, right, justify */
120
+ alignment?: 'left' | 'center' | 'right' | 'justify';
121
+ /** Left indentation in twips */
122
+ leftIndent?: number;
123
+ /** Right indentation in twips */
124
+ rightIndent?: number;
125
+ /** First line indentation in twips */
126
+ firstLineIndent?: number;
127
+ /** Hanging indentation in twips */
128
+ hangingIndent?: number;
129
+ /** Spacing before paragraph in twips */
130
+ spaceBefore?: number;
131
+ /** Spacing after paragraph in twips */
132
+ spaceAfter?: number;
133
+ /** Line spacing in twips */
134
+ lineSpacing?: number;
135
+ /** Line spacing rule */
136
+ lineSpacingRule?: 'auto' | 'exact' | 'atLeast';
137
+ /** Paragraph style ID */
138
+ style?: string;
139
+ /** Keep with next paragraph */
140
+ keepNext?: boolean;
141
+ /** Keep lines together */
142
+ keepLines?: boolean;
143
+ /** Page break before */
144
+ pageBreakBefore?: boolean;
145
+ /** Widow/orphan control */
146
+ widowControl?: boolean;
147
+ /** Suppress auto-hyphenation */
148
+ suppressAutoHyphens?: boolean;
149
+ /** Contextual spacing */
150
+ contextualSpacing?: boolean;
151
+ /** Mirror indents */
152
+ mirrorIndents?: boolean;
153
+ /** Outline level (for headings) */
154
+ outlineLevel?: number;
155
+ /** Right-to-left paragraph */
156
+ bidi?: boolean;
157
+ /** Numbering properties (list formatting) */
158
+ numbering?: {
159
+ numId?: number;
160
+ level?: number;
161
+ };
162
+
163
+ // === Extended properties for full ECMA-376 compliance ===
164
+
165
+ /**
166
+ * Paragraph borders (w:pBdr)
167
+ * Per ECMA-376 Part 1 Section 17.3.1.24
168
+ */
169
+ borders?: ParagraphBorders;
170
+
171
+ /**
172
+ * Paragraph shading/background (w:shd)
173
+ * Per ECMA-376 Part 1 Section 17.3.1.32
174
+ */
175
+ shading?: ParagraphShading;
176
+
177
+ /**
178
+ * Custom tab stops (w:tabs)
179
+ * Per ECMA-376 Part 1 Section 17.3.1.38
180
+ */
181
+ tabs?: TabStopDef[];
182
+
183
+ /**
184
+ * Text direction (w:textDirection)
185
+ * Per ECMA-376 Part 1 Section 17.3.1.40
186
+ * Values: lrTb, tbRl, btLr, lrTbV, tbRlV, tbLrV
187
+ */
188
+ textDirection?: string;
189
+
190
+ /**
191
+ * Text alignment (w:textAlignment)
192
+ * Per ECMA-376 Part 1 Section 17.3.1.39
193
+ * Values: auto, top, center, baseline, bottom
194
+ */
195
+ textAlignment?: string;
196
+
197
+ /**
198
+ * Suppress line numbers (w:suppressLineNumbers)
199
+ * Per ECMA-376 Part 1 Section 17.3.1.35
200
+ */
201
+ suppressLineNumbers?: boolean;
202
+
203
+ /**
204
+ * Adjust right indent (w:adjustRightInd)
205
+ * Per ECMA-376 Part 1 Section 17.3.1.1
206
+ */
207
+ adjustRightInd?: boolean;
208
+
209
+ /**
210
+ * Snap to grid (w:snapToGrid)
211
+ * Per ECMA-376 Part 1 Section 17.3.1.33
212
+ */
213
+ snapToGrid?: boolean;
214
+
215
+ /**
216
+ * Word wrap (w:wordWrap)
217
+ * Per ECMA-376 Part 1 Section 17.3.1.44
218
+ */
219
+ wordWrap?: boolean;
220
+
221
+ /**
222
+ * Auto space between East Asian and numeric (w:autoSpaceDE)
223
+ */
224
+ autoSpaceDE?: boolean;
225
+
226
+ /**
227
+ * Auto space between East Asian and Western (w:autoSpaceDN)
228
+ */
229
+ autoSpaceDN?: boolean;
230
+ }
231
+
232
+ /**
233
+ * Paragraph property change (w:pPrChange)
234
+ *
235
+ * Tracks changes to paragraph-level formatting such as:
236
+ * - Alignment (left, center, right, justify)
237
+ * - Indentation (left, right, first line, hanging)
238
+ * - Spacing (before, after, line)
239
+ * - Keep with next, keep lines together
240
+ * - Paragraph style
241
+ * - Numbering/list formatting (numId, ilvl)
242
+ *
243
+ * @example
244
+ * ```xml
245
+ * <w:pPrChange w:id="2" w:author="Jane" w:date="2024-01-15T11:00:00Z">
246
+ * <w:pPr>
247
+ * <w:jc w:val="left"/> <!-- Was left-aligned before change -->
248
+ * </w:pPr>
249
+ * </w:pPrChange>
250
+ * ```
251
+ */
252
+ export interface ParagraphPropertyChange extends PropertyChangeBase {
253
+ /** Previous paragraph formatting properties before the change */
254
+ previousProperties: Partial<ParagraphFormattingPartial>;
255
+ }
256
+
257
+ /**
258
+ * Table property change types
259
+ */
260
+ export type TablePropertyChangeType = 'table' | 'row' | 'cell';
261
+
262
+ /**
263
+ * Table property change (w:tblPrChange, w:trPrChange, w:tcPrChange)
264
+ *
265
+ * Tracks changes to table-level properties including:
266
+ * - Table: width, alignment, borders, shading
267
+ * - Row: height, header row, can't split
268
+ * - Cell: width, vertical alignment, borders, shading, merge
269
+ *
270
+ * @example
271
+ * ```xml
272
+ * <w:tblPrChange w:id="3" w:author="John" w:date="2024-01-15T12:00:00Z">
273
+ * <w:tblPr>
274
+ * <w:tblW w:w="5000" w:type="pct"/>
275
+ * </w:tblPr>
276
+ * </w:tblPrChange>
277
+ * ```
278
+ */
279
+ export interface TablePropertyChange extends PropertyChangeBase {
280
+ /** Type of table element (table, row, or cell) */
281
+ elementType: TablePropertyChangeType;
282
+ /** Previous table properties before the change */
283
+ previousProperties: Record<string, any>;
284
+ }
285
+
286
+ /**
287
+ * Section property change (w:sectPrChange)
288
+ *
289
+ * Tracks changes to section-level properties such as:
290
+ * - Page size (width, height)
291
+ * - Page margins (top, bottom, left, right, header, footer, gutter)
292
+ * - Page orientation (portrait, landscape)
293
+ * - Columns configuration
294
+ * - Page numbering
295
+ *
296
+ * @example
297
+ * ```xml
298
+ * <w:sectPrChange w:id="4" w:author="Jane" w:date="2024-01-15T13:00:00Z">
299
+ * <w:sectPr>
300
+ * <w:pgSz w:w="12240" w:h="15840"/>
301
+ * <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"/>
302
+ * </w:sectPr>
303
+ * </w:sectPrChange>
304
+ * ```
305
+ */
306
+ export interface SectionPropertyChange extends PropertyChangeBase {
307
+ /** Previous section properties before the change */
308
+ previousProperties: Record<string, any>;
309
+ }
310
+
311
+ /**
312
+ * Numbering change (w:numberingChange)
313
+ *
314
+ * Tracks changes to list numbering properties:
315
+ * - Numbering definition ID
316
+ * - Indentation level
317
+ * - Starting number
318
+ *
319
+ * @example
320
+ * ```xml
321
+ * <w:numberingChange w:id="5" w:author="John" w:date="2024-01-15T14:00:00Z"
322
+ * w:original="1" />
323
+ * ```
324
+ */
325
+ export interface NumberingChange extends PropertyChangeBase {
326
+ /** Previous numbering definition ID */
327
+ previousNumId?: number;
328
+ /** Previous indentation level */
329
+ previousIlvl?: number;
330
+ /** Original numbering format string */
331
+ original?: string;
332
+ }
333
+
334
+ /**
335
+ * Location of a revision within the document structure
336
+ * Used for precise change tracking and changelog generation
337
+ */
338
+ export interface RevisionLocation {
339
+ /** Paragraph index within the document body (0-based) */
340
+ paragraphIndex?: number;
341
+ /** Run index within the paragraph (0-based) */
342
+ runIndex?: number;
343
+ /** Table row index (0-based) - only for table revisions */
344
+ tableRow?: number;
345
+ /** Table cell index within row (0-based) - only for table revisions */
346
+ tableCell?: number;
347
+ /** Section index (0-based) - only for section revisions */
348
+ sectionIndex?: number;
349
+ /** Header/footer type if revision is in header/footer */
350
+ headerFooterType?:
351
+ | 'header'
352
+ | 'footer'
353
+ | 'firstHeader'
354
+ | 'firstFooter'
355
+ | 'evenHeader'
356
+ | 'evenFooter';
357
+ }
358
+
359
+ /**
360
+ * Union type for all property change types
361
+ */
362
+ export type AnyPropertyChange =
363
+ | RunPropertyChange
364
+ | ParagraphPropertyChange
365
+ | TablePropertyChange
366
+ | SectionPropertyChange
367
+ | NumberingChange;
368
+
369
+ /**
370
+ * Type guard to check if a property change is a RunPropertyChange
371
+ *
372
+ * Note: Empty previousProperties cannot be reliably typed - this guard returns
373
+ * false for empty objects. Use context-aware typing when the source is known.
374
+ */
375
+ export function isRunPropertyChange(change: AnyPropertyChange): change is RunPropertyChange {
376
+ if (!('previousProperties' in change) || 'elementType' in change || 'previousNumId' in change) {
377
+ return false;
378
+ }
379
+ // Check for typical run properties - must have at least one identifiable property
380
+ const props = change.previousProperties as Partial<RunFormatting>;
381
+ return (
382
+ props.bold !== undefined ||
383
+ props.italic !== undefined ||
384
+ props.font !== undefined ||
385
+ props.size !== undefined ||
386
+ props.color !== undefined ||
387
+ props.underline !== undefined ||
388
+ props.strike !== undefined ||
389
+ props.highlight !== undefined ||
390
+ props.smallCaps !== undefined ||
391
+ props.allCaps !== undefined ||
392
+ props.subscript !== undefined ||
393
+ props.superscript !== undefined
394
+ );
395
+ }
396
+
397
+ /**
398
+ * Type guard to check if a property change is a ParagraphPropertyChange
399
+ */
400
+ export function isParagraphPropertyChange(
401
+ change: AnyPropertyChange
402
+ ): change is ParagraphPropertyChange {
403
+ return (
404
+ 'previousProperties' in change &&
405
+ !('elementType' in change) &&
406
+ !('previousNumId' in change) &&
407
+ // Check for typical paragraph properties
408
+ ((change.previousProperties as ParagraphFormattingPartial).alignment !== undefined ||
409
+ (change.previousProperties as ParagraphFormattingPartial).leftIndent !== undefined ||
410
+ (change.previousProperties as ParagraphFormattingPartial).spaceBefore !== undefined ||
411
+ (change.previousProperties as ParagraphFormattingPartial).style !== undefined)
412
+ );
413
+ }
414
+
415
+ /**
416
+ * Type guard to check if a property change is a TablePropertyChange
417
+ */
418
+ export function isTablePropertyChange(change: AnyPropertyChange): change is TablePropertyChange {
419
+ return 'elementType' in change;
420
+ }
421
+
422
+ /**
423
+ * Type guard to check if a property change is a SectionPropertyChange
424
+ *
425
+ * Checks for section-specific properties: page size, margins, orientation, columns, etc.
426
+ * Per ECMA-376, section properties are distinct from run/paragraph properties.
427
+ */
428
+ export function isSectionPropertyChange(
429
+ change: AnyPropertyChange
430
+ ): change is SectionPropertyChange {
431
+ if (!('previousProperties' in change) || 'elementType' in change || 'previousNumId' in change) {
432
+ return false;
433
+ }
434
+ // Check for section-specific properties
435
+ const props = change.previousProperties as Record<string, any>;
436
+ return (
437
+ props.pageWidth !== undefined ||
438
+ props.pageHeight !== undefined ||
439
+ props.orientation !== undefined ||
440
+ props.marginTop !== undefined ||
441
+ props.marginBottom !== undefined ||
442
+ props.marginLeft !== undefined ||
443
+ props.marginRight !== undefined ||
444
+ props.columns !== undefined ||
445
+ props.headerDistance !== undefined ||
446
+ props.footerDistance !== undefined ||
447
+ props.gutterMargin !== undefined ||
448
+ props.pageNumberStart !== undefined ||
449
+ props.sectionType !== undefined
450
+ );
451
+ }
452
+
453
+ /**
454
+ * Type guard to check if a property change is a NumberingChange
455
+ */
456
+ export function isNumberingChange(change: AnyPropertyChange): change is NumberingChange {
457
+ return 'previousNumId' in change || 'previousIlvl' in change || 'original' in change;
458
+ }