docxmlater 10.0.2 → 10.0.3

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 (393) hide show
  1. package/README.md +2 -2
  2. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.d.ts +0 -27
  5. package/dist/constants/limits.d.ts.map +1 -1
  6. package/dist/constants/limits.js +13 -13
  7. package/dist/constants/limits.js.map +1 -1
  8. package/dist/core/Document.d.ts +23 -19
  9. package/dist/core/Document.d.ts.map +1 -1
  10. package/dist/core/Document.js +197 -63
  11. package/dist/core/Document.js.map +1 -1
  12. package/dist/core/DocumentContent.d.ts.map +1 -1
  13. package/dist/core/DocumentContent.js.map +1 -1
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +59 -24
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.d.ts.map +1 -1
  18. package/dist/core/DocumentIdManager.js.map +1 -1
  19. package/dist/core/DocumentParser.d.ts +6 -6
  20. package/dist/core/DocumentParser.d.ts.map +1 -1
  21. package/dist/core/DocumentParser.js +60 -54
  22. package/dist/core/DocumentParser.js.map +1 -1
  23. package/dist/core/DocumentValidator.d.ts.map +1 -1
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.d.ts.map +1 -1
  26. package/dist/core/Relationship.js +1 -1
  27. package/dist/core/Relationship.js.map +1 -1
  28. package/dist/core/RelationshipManager.js +3 -3
  29. package/dist/core/RelationshipManager.js.map +1 -1
  30. package/dist/elements/AlternateContent.js.map +1 -1
  31. package/dist/elements/Bookmark.d.ts.map +1 -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.js +1 -1
  36. package/dist/elements/Comment.js.map +1 -1
  37. package/dist/elements/CommentManager.d.ts.map +1 -1
  38. package/dist/elements/CommentManager.js +8 -2
  39. package/dist/elements/CommentManager.js.map +1 -1
  40. package/dist/elements/CommonTypes.d.ts.map +1 -1
  41. package/dist/elements/CommonTypes.js +1 -2
  42. package/dist/elements/CommonTypes.js.map +1 -1
  43. package/dist/elements/CustomXml.js.map +1 -1
  44. package/dist/elements/Endnote.d.ts.map +1 -1
  45. package/dist/elements/Endnote.js.map +1 -1
  46. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  47. package/dist/elements/EndnoteManager.js.map +1 -1
  48. package/dist/elements/Field.d.ts.map +1 -1
  49. package/dist/elements/Field.js +31 -28
  50. package/dist/elements/Field.js.map +1 -1
  51. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  52. package/dist/elements/FieldHelpers.js +6 -6
  53. package/dist/elements/FieldHelpers.js.map +1 -1
  54. package/dist/elements/FontManager.d.ts.map +1 -1
  55. package/dist/elements/FontManager.js.map +1 -1
  56. package/dist/elements/Footer.js.map +1 -1
  57. package/dist/elements/Footnote.d.ts.map +1 -1
  58. package/dist/elements/Footnote.js.map +1 -1
  59. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  60. package/dist/elements/FootnoteManager.js.map +1 -1
  61. package/dist/elements/Header.js.map +1 -1
  62. package/dist/elements/HeaderFooterManager.js.map +1 -1
  63. package/dist/elements/Hyperlink.d.ts.map +1 -1
  64. package/dist/elements/Hyperlink.js +5 -5
  65. package/dist/elements/Hyperlink.js.map +1 -1
  66. package/dist/elements/Image.d.ts +2 -2
  67. package/dist/elements/Image.d.ts.map +1 -1
  68. package/dist/elements/Image.js +21 -5
  69. package/dist/elements/Image.js.map +1 -1
  70. package/dist/elements/ImageManager.d.ts.map +1 -1
  71. package/dist/elements/ImageManager.js +2 -2
  72. package/dist/elements/ImageManager.js.map +1 -1
  73. package/dist/elements/ImageRun.js.map +1 -1
  74. package/dist/elements/MathElement.js.map +1 -1
  75. package/dist/elements/Paragraph.d.ts.map +1 -1
  76. package/dist/elements/Paragraph.js +128 -117
  77. package/dist/elements/Paragraph.js.map +1 -1
  78. package/dist/elements/PreservedElement.js.map +1 -1
  79. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  80. package/dist/elements/RangeMarker.js.map +1 -1
  81. package/dist/elements/Revision.d.ts +1 -0
  82. package/dist/elements/Revision.d.ts.map +1 -1
  83. package/dist/elements/Revision.js +44 -5
  84. package/dist/elements/Revision.js.map +1 -1
  85. package/dist/elements/RevisionContent.js.map +1 -1
  86. package/dist/elements/RevisionManager.d.ts.map +1 -1
  87. package/dist/elements/RevisionManager.js.map +1 -1
  88. package/dist/elements/Run.d.ts.map +1 -1
  89. package/dist/elements/Run.js +1 -3
  90. package/dist/elements/Run.js.map +1 -1
  91. package/dist/elements/Section.d.ts.map +1 -1
  92. package/dist/elements/Section.js +127 -118
  93. package/dist/elements/Section.js.map +1 -1
  94. package/dist/elements/Shape.d.ts.map +1 -1
  95. package/dist/elements/Shape.js +21 -0
  96. package/dist/elements/Shape.js.map +1 -1
  97. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  98. package/dist/elements/StructuredDocumentTag.js +20 -8
  99. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  100. package/dist/elements/Table.d.ts +2 -2
  101. package/dist/elements/Table.d.ts.map +1 -1
  102. package/dist/elements/Table.js +29 -35
  103. package/dist/elements/Table.js.map +1 -1
  104. package/dist/elements/TableCell.d.ts +2 -2
  105. package/dist/elements/TableCell.d.ts.map +1 -1
  106. package/dist/elements/TableCell.js +63 -67
  107. package/dist/elements/TableCell.js.map +1 -1
  108. package/dist/elements/TableGridChange.js.map +1 -1
  109. package/dist/elements/TableOfContents.d.ts +6 -6
  110. package/dist/elements/TableOfContents.d.ts.map +1 -1
  111. package/dist/elements/TableOfContents.js.map +1 -1
  112. package/dist/elements/TableOfContentsElement.js.map +1 -1
  113. package/dist/elements/TableRow.d.ts.map +1 -1
  114. package/dist/elements/TableRow.js +65 -47
  115. package/dist/elements/TableRow.js.map +1 -1
  116. package/dist/elements/TextBox.d.ts.map +1 -1
  117. package/dist/elements/TextBox.js +1 -1
  118. package/dist/elements/TextBox.js.map +1 -1
  119. package/dist/formatting/AbstractNumbering.d.ts +1 -1
  120. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  121. package/dist/formatting/AbstractNumbering.js +11 -11
  122. package/dist/formatting/AbstractNumbering.js.map +1 -1
  123. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  124. package/dist/formatting/NumberingInstance.js +4 -4
  125. package/dist/formatting/NumberingInstance.js.map +1 -1
  126. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  127. package/dist/formatting/NumberingLevel.js +26 -26
  128. package/dist/formatting/NumberingLevel.js.map +1 -1
  129. package/dist/formatting/NumberingManager.d.ts +1 -1
  130. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  131. package/dist/formatting/NumberingManager.js.map +1 -1
  132. package/dist/formatting/Style.d.ts.map +1 -1
  133. package/dist/formatting/Style.js +87 -95
  134. package/dist/formatting/Style.js.map +1 -1
  135. package/dist/formatting/StylesManager.d.ts +3 -3
  136. package/dist/formatting/StylesManager.d.ts.map +1 -1
  137. package/dist/formatting/StylesManager.js.map +1 -1
  138. package/dist/helpers/CleanupHelper.js.map +1 -1
  139. package/dist/images/ImageOptimizer.js.map +1 -1
  140. package/dist/index.js.map +1 -1
  141. package/dist/managers/DrawingManager.d.ts.map +1 -1
  142. package/dist/managers/DrawingManager.js.map +1 -1
  143. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  144. package/dist/tracking/TrackingContext.js.map +1 -1
  145. package/dist/types/compatibility-types.js.map +1 -1
  146. package/dist/types/formatting.js.map +1 -1
  147. package/dist/types/list-types.d.ts +4 -4
  148. package/dist/types/list-types.d.ts.map +1 -1
  149. package/dist/types/list-types.js.map +1 -1
  150. package/dist/types/settings-types.js.map +1 -1
  151. package/dist/types/styleConfig.js.map +1 -1
  152. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  153. package/dist/utils/ChangelogGenerator.js.map +1 -1
  154. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  155. package/dist/utils/CompatibilityUpgrader.js +7 -7
  156. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  157. package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
  158. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  159. package/dist/utils/MoveOperationHelper.js.map +1 -1
  160. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  161. package/dist/utils/RevisionWalker.js.map +1 -1
  162. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  163. package/dist/utils/ShadingResolver.js +1 -1
  164. package/dist/utils/ShadingResolver.js.map +1 -1
  165. package/dist/utils/acceptRevisions.d.ts +0 -28
  166. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  167. package/dist/utils/acceptRevisions.js +5 -7
  168. package/dist/utils/acceptRevisions.js.map +1 -1
  169. package/dist/utils/cnfStyleDecoder.js +1 -1
  170. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  171. package/dist/utils/corruptionDetection.js.map +1 -1
  172. package/dist/utils/dateFormatting.js.map +1 -1
  173. package/dist/utils/deepClone.d.ts +0 -1
  174. package/dist/utils/deepClone.d.ts.map +1 -1
  175. package/dist/utils/deepClone.js +0 -7
  176. package/dist/utils/deepClone.js.map +1 -1
  177. package/dist/utils/diagnostics.d.ts +2 -2
  178. package/dist/utils/diagnostics.d.ts.map +1 -1
  179. package/dist/utils/diagnostics.js.map +1 -1
  180. package/dist/utils/errorHandling.js.map +1 -1
  181. package/dist/utils/formatting.js.map +1 -1
  182. package/dist/utils/list-detection.d.ts +2 -2
  183. package/dist/utils/list-detection.d.ts.map +1 -1
  184. package/dist/utils/list-detection.js +3 -3
  185. package/dist/utils/list-detection.js.map +1 -1
  186. package/dist/utils/logger.d.ts +2 -4
  187. package/dist/utils/logger.d.ts.map +1 -1
  188. package/dist/utils/logger.js +0 -2
  189. package/dist/utils/logger.js.map +1 -1
  190. package/dist/utils/parsingHelpers.js.map +1 -1
  191. package/dist/utils/stripTrackedChanges.d.ts +0 -19
  192. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  193. package/dist/utils/stripTrackedChanges.js +0 -2
  194. package/dist/utils/stripTrackedChanges.js.map +1 -1
  195. package/dist/utils/textDiff.js.map +1 -1
  196. package/dist/utils/units.js.map +1 -1
  197. package/dist/utils/validation.d.ts.map +1 -1
  198. package/dist/utils/validation.js.map +1 -1
  199. package/dist/utils/xmlSanitization.js.map +1 -1
  200. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  201. package/dist/validation/RevisionValidator.js.map +1 -1
  202. package/dist/validation/ValidationRules.js.map +1 -1
  203. package/dist/validation/index.js.map +1 -1
  204. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  205. package/dist/xml/XMLBuilder.js +10 -0
  206. package/dist/xml/XMLBuilder.js.map +1 -1
  207. package/dist/xml/XMLParser.d.ts.map +1 -1
  208. package/dist/xml/XMLParser.js +4 -5
  209. package/dist/xml/XMLParser.js.map +1 -1
  210. package/dist/zip/ZipHandler.js.map +1 -1
  211. package/dist/zip/ZipReader.js.map +1 -1
  212. package/dist/zip/ZipWriter.js.map +1 -1
  213. package/dist/zip/errors.js.map +1 -1
  214. package/dist/zip/types.js.map +1 -1
  215. package/package.json +34 -4
  216. package/src/__tests__/helper-methods.test.ts +512 -0
  217. package/src/constants/legacyCompatFlags.ts +138 -0
  218. package/src/constants/limits.ts +50 -0
  219. package/src/core/CLAUDE.md +109 -0
  220. package/src/core/Document.ts +15569 -0
  221. package/src/core/DocumentContent.ts +467 -0
  222. package/src/core/DocumentGenerator.ts +1104 -0
  223. package/src/core/DocumentIdManager.ts +158 -0
  224. package/src/core/DocumentParser.ts +10107 -0
  225. package/src/core/DocumentValidator.ts +372 -0
  226. package/src/core/Relationship.ts +367 -0
  227. package/src/core/RelationshipManager.ts +428 -0
  228. package/src/elements/AlternateContent.ts +42 -0
  229. package/src/elements/Bookmark.ts +210 -0
  230. package/src/elements/BookmarkManager.ts +250 -0
  231. package/src/elements/CLAUDE.md +126 -0
  232. package/src/elements/Comment.ts +359 -0
  233. package/src/elements/CommentManager.ts +502 -0
  234. package/src/elements/CommonTypes.ts +549 -0
  235. package/src/elements/CustomXml.ts +36 -0
  236. package/src/elements/Endnote.ts +217 -0
  237. package/src/elements/EndnoteManager.ts +249 -0
  238. package/src/elements/Field.ts +1233 -0
  239. package/src/elements/FieldHelpers.ts +333 -0
  240. package/src/elements/FontManager.ts +339 -0
  241. package/src/elements/Footer.ts +269 -0
  242. package/src/elements/Footnote.ts +217 -0
  243. package/src/elements/FootnoteManager.ts +249 -0
  244. package/src/elements/Header.ts +269 -0
  245. package/src/elements/HeaderFooterManager.ts +219 -0
  246. package/src/elements/Hyperlink.ts +1146 -0
  247. package/src/elements/Image.ts +1756 -0
  248. package/src/elements/ImageManager.ts +432 -0
  249. package/src/elements/ImageRun.ts +59 -0
  250. package/src/elements/MathElement.ts +65 -0
  251. package/src/elements/Paragraph.ts +4227 -0
  252. package/src/elements/PreservedElement.ts +53 -0
  253. package/src/elements/PropertyChangeTypes.ts +442 -0
  254. package/src/elements/RangeMarker.ts +400 -0
  255. package/src/elements/Revision.ts +1217 -0
  256. package/src/elements/RevisionContent.ts +73 -0
  257. package/src/elements/RevisionManager.ts +1070 -0
  258. package/src/elements/Run.ts +3068 -0
  259. package/src/elements/Section.ts +1421 -0
  260. package/src/elements/Shape.ts +873 -0
  261. package/src/elements/StructuredDocumentTag.ts +978 -0
  262. package/src/elements/Table.ts +2524 -0
  263. package/src/elements/TableCell.ts +1586 -0
  264. package/src/elements/TableGridChange.ts +151 -0
  265. package/src/elements/TableOfContents.ts +691 -0
  266. package/src/elements/TableOfContentsElement.ts +89 -0
  267. package/src/elements/TableRow.ts +906 -0
  268. package/src/elements/TextBox.ts +768 -0
  269. package/src/formatting/AbstractNumbering.ts +548 -0
  270. package/src/formatting/CLAUDE.md +74 -0
  271. package/src/formatting/NumberingInstance.ts +212 -0
  272. package/src/formatting/NumberingLevel.ts +1006 -0
  273. package/src/formatting/NumberingManager.ts +827 -0
  274. package/src/formatting/Style.ts +1833 -0
  275. package/src/formatting/StylesManager.ts +1005 -0
  276. package/src/helpers/CleanupHelper.ts +524 -0
  277. package/src/images/ImageOptimizer.ts +274 -0
  278. package/src/index.ts +554 -0
  279. package/src/managers/CLAUDE.md +47 -0
  280. package/src/managers/DrawingManager.ts +319 -0
  281. package/src/tracking/DocumentTrackingContext.ts +643 -0
  282. package/src/tracking/TrackingContext.ts +173 -0
  283. package/src/types/compatibility-types.ts +49 -0
  284. package/src/types/formatting.ts +210 -0
  285. package/src/types/list-types.ts +152 -0
  286. package/src/types/settings-types.ts +59 -0
  287. package/src/types/styleConfig.ts +189 -0
  288. package/src/utils/CLAUDE.md +153 -0
  289. package/src/utils/ChangelogGenerator.ts +1581 -0
  290. package/src/utils/CompatibilityUpgrader.ts +237 -0
  291. package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
  292. package/src/utils/MoveOperationHelper.ts +238 -0
  293. package/src/utils/RevisionAwareProcessor.ts +526 -0
  294. package/src/utils/RevisionWalker.ts +457 -0
  295. package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
  296. package/src/utils/ShadingResolver.ts +107 -0
  297. package/src/utils/acceptRevisions.ts +714 -0
  298. package/src/utils/cnfStyleDecoder.ts +217 -0
  299. package/src/utils/corruptionDetection.ts +345 -0
  300. package/src/utils/dateFormatting.ts +20 -0
  301. package/src/utils/deepClone.ts +78 -0
  302. package/src/utils/diagnostics.ts +129 -0
  303. package/src/utils/errorHandling.ts +80 -0
  304. package/src/utils/formatting.ts +213 -0
  305. package/src/utils/list-detection.ts +274 -0
  306. package/src/utils/logger.ts +404 -0
  307. package/src/utils/parsingHelpers.ts +190 -0
  308. package/src/utils/stripTrackedChanges.ts +353 -0
  309. package/src/utils/textDiff.ts +100 -0
  310. package/src/utils/units.ts +421 -0
  311. package/src/utils/validation.ts +542 -0
  312. package/src/utils/xmlSanitization.ts +182 -0
  313. package/src/validation/RevisionAutoFixer.ts +542 -0
  314. package/src/validation/RevisionValidator.ts +460 -0
  315. package/src/validation/ValidationRules.ts +338 -0
  316. package/src/validation/index.ts +30 -0
  317. package/src/xml/CLAUDE.md +65 -0
  318. package/src/xml/XMLBuilder.ts +871 -0
  319. package/src/xml/XMLParser.ts +919 -0
  320. package/src/zip/CLAUDE.md +55 -0
  321. package/src/zip/ZipHandler.ts +637 -0
  322. package/src/zip/ZipReader.ts +299 -0
  323. package/src/zip/ZipWriter.ts +390 -0
  324. package/src/zip/errors.ts +69 -0
  325. package/src/zip/types.ts +116 -0
  326. package/dist/core/ListNormalizer.d.ts +0 -23
  327. package/dist/core/ListNormalizer.d.ts.map +0 -1
  328. package/dist/core/ListNormalizer.js +0 -624
  329. package/dist/core/ListNormalizer.js.map +0 -1
  330. package/dist/images/index.d.ts +0 -2
  331. package/dist/images/index.d.ts.map +0 -1
  332. package/dist/images/index.js +0 -8
  333. package/dist/images/index.js.map +0 -1
  334. package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
  335. package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
  336. package/dist/ms-doc/cfb/CFBReader.js +0 -360
  337. package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
  338. package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
  339. package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
  340. package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
  341. package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
  342. package/dist/ms-doc/fib/FIB.d.ts +0 -18
  343. package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
  344. package/dist/ms-doc/fib/FIB.js +0 -342
  345. package/dist/ms-doc/fib/FIB.js.map +0 -1
  346. package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
  347. package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
  348. package/dist/ms-doc/fields/FieldParser.js +0 -266
  349. package/dist/ms-doc/fields/FieldParser.js.map +0 -1
  350. package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
  351. package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
  352. package/dist/ms-doc/images/PictureExtractor.js +0 -233
  353. package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
  354. package/dist/ms-doc/index.d.ts +0 -20
  355. package/dist/ms-doc/index.d.ts.map +0 -1
  356. package/dist/ms-doc/index.js +0 -59
  357. package/dist/ms-doc/index.js.map +0 -1
  358. package/dist/ms-doc/properties/SPRM.d.ts +0 -210
  359. package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
  360. package/dist/ms-doc/properties/SPRM.js +0 -633
  361. package/dist/ms-doc/properties/SPRM.js.map +0 -1
  362. package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
  363. package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
  364. package/dist/ms-doc/sections/SectionParser.js +0 -214
  365. package/dist/ms-doc/sections/SectionParser.js.map +0 -1
  366. package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
  367. package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
  368. package/dist/ms-doc/styles/StyleSheet.js +0 -268
  369. package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
  370. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
  371. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
  372. package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
  373. package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
  374. package/dist/ms-doc/tables/TableParser.d.ts +0 -29
  375. package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
  376. package/dist/ms-doc/tables/TableParser.js +0 -176
  377. package/dist/ms-doc/tables/TableParser.js.map +0 -1
  378. package/dist/ms-doc/text/PieceTable.d.ts +0 -21
  379. package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
  380. package/dist/ms-doc/text/PieceTable.js +0 -171
  381. package/dist/ms-doc/text/PieceTable.js.map +0 -1
  382. package/dist/ms-doc/types/Constants.d.ts +0 -99
  383. package/dist/ms-doc/types/Constants.d.ts.map +0 -1
  384. package/dist/ms-doc/types/Constants.js +0 -102
  385. package/dist/ms-doc/types/Constants.js.map +0 -1
  386. package/dist/ms-doc/types/DocTypes.d.ts +0 -368
  387. package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
  388. package/dist/ms-doc/types/DocTypes.js +0 -3
  389. package/dist/ms-doc/types/DocTypes.js.map +0 -1
  390. package/dist/tracking/index.d.ts +0 -3
  391. package/dist/tracking/index.d.ts.map +0 -1
  392. package/dist/tracking/index.js +0 -6
  393. package/dist/tracking/index.js.map +0 -1
@@ -0,0 +1,643 @@
1
+ /**
2
+ * DocumentTrackingContext - Implementation of automatic change tracking
3
+ *
4
+ * Manages pending changes and creates Revision objects when flushed.
5
+ * Supports consolidation of similar changes within a time window.
6
+ *
7
+ * @module DocumentTrackingContext
8
+ */
9
+
10
+ import { Revision, RevisionType } from '../elements/Revision';
11
+ import { RevisionManager } from '../elements/RevisionManager';
12
+ import { Run, type RunFormatting } from '../elements/Run';
13
+ import { Paragraph } from '../elements/Paragraph';
14
+ import { Table } from '../elements/Table';
15
+ import { TableRow } from '../elements/TableRow';
16
+ import { TableCell } from '../elements/TableCell';
17
+ import { Section } from '../elements/Section';
18
+ import type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext';
19
+ import { formatDateForXml } from '../utils/dateFormatting';
20
+
21
+ /**
22
+ * Enable options for tracking context
23
+ */
24
+ export interface TrackingEnableOptions {
25
+ /** Author name for new revisions (default: 'DocHub') */
26
+ author?: string;
27
+ /** Whether to track formatting changes (default: true) */
28
+ trackFormatting?: boolean;
29
+ }
30
+
31
+ /**
32
+ * Implementation of TrackingContext for Document
33
+ */
34
+ export class DocumentTrackingContext implements TrackingContext {
35
+ private enabled = false;
36
+ private trackFormatting = true;
37
+ private author = 'DocHub';
38
+ private revisionManager: RevisionManager;
39
+
40
+ /** Counter for assigning stable element IDs */
41
+ private elementIdCounter = 0;
42
+ /** Stable element identity map (WeakMap so elements can be GC'd) */
43
+ private elementIdMap = new WeakMap<object, number>();
44
+
45
+ /** Pending changes waiting to be flushed */
46
+ private pendingChanges = new Map<string, PendingChange>();
47
+
48
+ /** Properties considered "formatting" (vs structural) */
49
+ private static readonly FORMATTING_PROPERTIES = new Set([
50
+ 'bold',
51
+ 'italic',
52
+ 'underline',
53
+ 'strike',
54
+ 'dstrike',
55
+ 'subscript',
56
+ 'superscript',
57
+ 'font',
58
+ 'size',
59
+ 'color',
60
+ 'highlight',
61
+ 'smallCaps',
62
+ 'allCaps',
63
+ 'characterSpacing',
64
+ 'scaling',
65
+ 'position',
66
+ 'emphasis',
67
+ 'shadow',
68
+ 'emboss',
69
+ 'imprint',
70
+ 'outline',
71
+ 'vanish',
72
+ ]);
73
+
74
+ /**
75
+ * Creates a new DocumentTrackingContext
76
+ * @param revisionManager - RevisionManager to register revisions with
77
+ */
78
+ constructor(revisionManager: RevisionManager) {
79
+ this.revisionManager = revisionManager;
80
+ }
81
+
82
+ /**
83
+ * Enable change tracking
84
+ * @param options - Enable options
85
+ */
86
+ enable(options?: TrackingEnableOptions): void {
87
+ this.enabled = true;
88
+ if (options?.author) {
89
+ this.author = options.author;
90
+ }
91
+ if (options?.trackFormatting !== undefined) {
92
+ this.trackFormatting = options.trackFormatting;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Disable change tracking and flush pending changes
98
+ */
99
+ disable(): void {
100
+ this.flushPendingChanges();
101
+ this.enabled = false;
102
+ }
103
+
104
+ /**
105
+ * Set the author for new revisions
106
+ * Flushes any pending changes before switching to prevent mixed authorship
107
+ * @param author - Author name
108
+ */
109
+ setAuthor(author: string): void {
110
+ // Flush pending changes before switching authors to prevent mixed authorship
111
+ if (this.enabled && this.pendingChanges.size > 0) {
112
+ this.flushPendingChanges();
113
+ }
114
+ this.author = author;
115
+ }
116
+
117
+ // ═══════════════════════════════════════════════════════════════════════════
118
+ // TrackingContext Interface Implementation
119
+ // ═══════════════════════════════════════════════════════════════════════════
120
+
121
+ isEnabled(): boolean {
122
+ return this.enabled;
123
+ }
124
+
125
+ getAuthor(): string {
126
+ return this.author;
127
+ }
128
+
129
+ getRevisionManager(): RevisionManager {
130
+ return this.revisionManager;
131
+ }
132
+
133
+ isTrackFormattingEnabled(): boolean {
134
+ return this.trackFormatting;
135
+ }
136
+
137
+ trackRunPropertyChange(
138
+ run: Run,
139
+ property: string,
140
+ oldValue: unknown,
141
+ newValue: unknown
142
+ ): void {
143
+ if (!this.enabled) return;
144
+ if (this.valuesEqual(oldValue, newValue)) return;
145
+
146
+ // Skip formatting changes if not tracking them
147
+ if (
148
+ !this.trackFormatting &&
149
+ DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)
150
+ ) {
151
+ return;
152
+ }
153
+
154
+ // Create consolidation key with element identity
155
+ const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;
156
+
157
+ this.addPendingChange(key, {
158
+ type: 'runPropertiesChange',
159
+ property,
160
+ previousValue: oldValue,
161
+ newValue,
162
+ element: run,
163
+ timestamp: Date.now(),
164
+ });
165
+ }
166
+
167
+ trackParagraphPropertyChange(
168
+ paragraph: TrackableElement,
169
+ property: string,
170
+ oldValue: unknown,
171
+ newValue: unknown
172
+ ): void {
173
+ if (!this.enabled) return;
174
+ if (this.valuesEqual(oldValue, newValue)) return;
175
+
176
+ const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;
177
+
178
+ this.addPendingChange(key, {
179
+ type: 'paragraphPropertiesChange',
180
+ property,
181
+ previousValue: oldValue,
182
+ newValue,
183
+ element: paragraph,
184
+ timestamp: Date.now(),
185
+ });
186
+ }
187
+
188
+ trackHyperlinkChange(
189
+ hyperlink: TrackableElement,
190
+ changeType: string,
191
+ oldValue: unknown,
192
+ newValue: unknown
193
+ ): void {
194
+ if (!this.enabled) return;
195
+ if (this.valuesEqual(oldValue, newValue)) return;
196
+
197
+ // Hyperlink changes use dedicated type for proper categorization
198
+ const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;
199
+
200
+ this.addPendingChange(key, {
201
+ type: 'hyperlinkChange',
202
+ property: changeType,
203
+ previousValue: oldValue,
204
+ newValue,
205
+ element: hyperlink,
206
+ timestamp: Date.now(),
207
+ });
208
+ }
209
+
210
+ trackTableChange(
211
+ element: TrackableElement,
212
+ property: string,
213
+ oldValue: unknown,
214
+ newValue: unknown
215
+ ): void {
216
+ if (!this.enabled) return;
217
+ if (this.valuesEqual(oldValue, newValue)) return;
218
+
219
+ // Determine revision type based on element type using instanceof (minification-safe)
220
+ let type: RevisionType = 'tablePropertiesChange';
221
+ let elementType = 'Table';
222
+
223
+ if (element instanceof TableRow) {
224
+ type = 'tableRowPropertiesChange';
225
+ elementType = 'TableRow';
226
+ } else if (element instanceof TableCell) {
227
+ type = 'tableCellPropertiesChange';
228
+ elementType = 'TableCell';
229
+ }
230
+
231
+ const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;
232
+
233
+ this.addPendingChange(key, {
234
+ type,
235
+ property,
236
+ previousValue: oldValue,
237
+ newValue,
238
+ element,
239
+ timestamp: Date.now(),
240
+ });
241
+ }
242
+
243
+ trackSectionChange(
244
+ section: TrackableElement,
245
+ property: string,
246
+ oldValue: unknown,
247
+ newValue: unknown
248
+ ): void {
249
+ if (!this.enabled) return;
250
+ if (this.valuesEqual(oldValue, newValue)) return;
251
+
252
+ const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;
253
+
254
+ this.addPendingChange(key, {
255
+ type: 'sectionPropertiesChange',
256
+ property,
257
+ previousValue: oldValue,
258
+ newValue,
259
+ element: section,
260
+ timestamp: Date.now(),
261
+ });
262
+ }
263
+
264
+ trackInsertion(element: TrackableElement, text: string): void {
265
+ if (!this.enabled) return;
266
+ if (!text) return;
267
+
268
+ const key = `insert:${Date.now()}:${text.substring(0, 20)}`;
269
+
270
+ this.addPendingChange(key, {
271
+ type: 'insert',
272
+ property: 'text',
273
+ previousValue: undefined,
274
+ newValue: text,
275
+ element,
276
+ timestamp: Date.now(),
277
+ });
278
+ }
279
+
280
+ trackDeletion(element: TrackableElement, text: string): void {
281
+ if (!this.enabled) return;
282
+ if (!text) return;
283
+
284
+ const key = `delete:${Date.now()}:${text.substring(0, 20)}`;
285
+
286
+ this.addPendingChange(key, {
287
+ type: 'delete',
288
+ property: 'text',
289
+ previousValue: text,
290
+ newValue: undefined,
291
+ element,
292
+ timestamp: Date.now(),
293
+ });
294
+ }
295
+
296
+ flushPendingChanges(): Revision[] {
297
+ const revisions: Revision[] = [];
298
+
299
+ // Group pending changes by element for consolidation
300
+ const paragraphChanges = new Map<Paragraph, PendingChange[]>();
301
+ const tableChanges = new Map<Table, PendingChange[]>();
302
+ const rowChanges = new Map<TableRow, PendingChange[]>();
303
+ const cellChanges = new Map<TableCell, PendingChange[]>();
304
+ const sectionChanges = new Map<Section, PendingChange[]>();
305
+ const runChanges = new Map<Run, PendingChange[]>();
306
+
307
+ for (const [, pending] of this.pendingChanges) {
308
+ const revision = this.createRevision(pending);
309
+ this.revisionManager.register(revision);
310
+ revisions.push(revision);
311
+
312
+ // Collect changes by element type for *PrChange application
313
+ if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {
314
+ const changes = paragraphChanges.get(pending.element) || [];
315
+ changes.push(pending);
316
+ paragraphChanges.set(pending.element, changes);
317
+ } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {
318
+ const changes = tableChanges.get(pending.element) || [];
319
+ changes.push(pending);
320
+ tableChanges.set(pending.element, changes);
321
+ } else if (pending.type === 'tableRowPropertiesChange' && pending.element instanceof TableRow) {
322
+ const changes = rowChanges.get(pending.element) || [];
323
+ changes.push(pending);
324
+ rowChanges.set(pending.element, changes);
325
+ } else if (pending.type === 'tableCellPropertiesChange' && pending.element instanceof TableCell) {
326
+ const changes = cellChanges.get(pending.element) || [];
327
+ changes.push(pending);
328
+ cellChanges.set(pending.element, changes);
329
+ } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {
330
+ const changes = sectionChanges.get(pending.element) || [];
331
+ changes.push(pending);
332
+ sectionChanges.set(pending.element, changes);
333
+ } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {
334
+ const changes = runChanges.get(pending.element) || [];
335
+ changes.push(pending);
336
+ runChanges.set(pending.element, changes);
337
+ }
338
+ }
339
+
340
+ // Apply pPrChange to each paragraph that has property changes
341
+ for (const [paragraph, changes] of paragraphChanges) {
342
+ this.applyParagraphPrChange(paragraph, changes);
343
+ }
344
+
345
+ // Apply tblPrChange to each Table
346
+ for (const [table, changes] of tableChanges) {
347
+ this.applyElementPrChange(changes, (prevProps, getNextId, date) => {
348
+ const existing = table.getTblPrChange();
349
+ if (existing) {
350
+ const merged = { ...(existing.previousProperties || {}), ...prevProps };
351
+ table.setTblPrChange({ ...existing, previousProperties: merged });
352
+ } else {
353
+ table.setTblPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });
354
+ }
355
+ });
356
+ }
357
+
358
+ // Apply trPrChange to each TableRow
359
+ for (const [row, changes] of rowChanges) {
360
+ this.applyElementPrChange(changes, (prevProps, getNextId, date) => {
361
+ const existing = row.getTrPrChange();
362
+ if (existing) {
363
+ const merged = { ...(existing.previousProperties || {}), ...prevProps };
364
+ row.setTrPrChange({ ...existing, previousProperties: merged });
365
+ } else {
366
+ row.setTrPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });
367
+ }
368
+ });
369
+ }
370
+
371
+ // Apply tcPrChange to each TableCell
372
+ for (const [cell, changes] of cellChanges) {
373
+ this.applyElementPrChange(changes, (prevProps, getNextId, date) => {
374
+ const existing = cell.getTcPrChange();
375
+ if (existing) {
376
+ const merged = { ...(existing.previousProperties || {}), ...prevProps };
377
+ cell.setTcPrChange({ ...existing, previousProperties: merged });
378
+ } else {
379
+ cell.setTcPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });
380
+ }
381
+ });
382
+ }
383
+
384
+ // Apply sectPrChange to each Section
385
+ for (const [section, changes] of sectionChanges) {
386
+ this.applyElementPrChange(changes, (prevProps, getNextId, date) => {
387
+ const existing = section.getSectPrChange();
388
+ if (existing) {
389
+ const merged = { ...(existing.previousProperties || {}), ...prevProps };
390
+ section.setSectPrChange({ ...existing, previousProperties: merged });
391
+ } else {
392
+ section.setSectPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });
393
+ }
394
+ });
395
+ }
396
+
397
+ // Apply rPrChange to each Run that has property changes
398
+ for (const [run, changes] of runChanges) {
399
+ this.applyRunPrChange(run, changes);
400
+ }
401
+
402
+ this.pendingChanges.clear();
403
+ return revisions;
404
+ }
405
+
406
+ // ═══════════════════════════════════════════════════════════════════════════
407
+ // Private Methods
408
+ // ═══════════════════════════════════════════════════════════════════════════
409
+
410
+ /**
411
+ * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)
412
+ */
413
+ private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {
414
+ const newPreviousProperties: Record<string, unknown> = {};
415
+ let latestTimestamp = 0;
416
+
417
+ for (const change of changes) {
418
+ // Record previous value even if undefined (property wasn't set before)
419
+ newPreviousProperties[change.property] = change.previousValue;
420
+ if (change.timestamp > latestTimestamp) {
421
+ latestTimestamp = change.timestamp;
422
+ }
423
+ }
424
+
425
+ const existingChange = paragraph.formatting.pPrChange;
426
+
427
+ if (existingChange) {
428
+ const mergedPreviousProperties: Record<string, unknown> = {
429
+ ...(existingChange.previousProperties || {}),
430
+ };
431
+ for (const [prop, value] of Object.entries(newPreviousProperties)) {
432
+ mergedPreviousProperties[prop] = value;
433
+ }
434
+ paragraph.formatting.pPrChange = {
435
+ author: existingChange.author,
436
+ date: existingChange.date,
437
+ id: existingChange.id,
438
+ previousProperties: mergedPreviousProperties,
439
+ };
440
+ } else {
441
+ const revisionId = this.revisionManager.consumeNextId();
442
+ paragraph.formatting.pPrChange = {
443
+ author: this.author,
444
+ date: formatDateForXml(new Date(latestTimestamp)),
445
+ id: String(revisionId),
446
+ previousProperties: newPreviousProperties,
447
+ };
448
+ }
449
+ }
450
+
451
+ /**
452
+ * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)
453
+ */
454
+ private applyRunPrChange(run: Run, changes: PendingChange[]): void {
455
+ const newPreviousProperties: Partial<RunFormatting> = {};
456
+ let latestTimestamp = 0;
457
+
458
+ for (const change of changes) {
459
+ (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;
460
+ if (change.timestamp > latestTimestamp) {
461
+ latestTimestamp = change.timestamp;
462
+ }
463
+ }
464
+
465
+ const existingChange = run.getPropertyChangeRevision();
466
+
467
+ if (existingChange) {
468
+ // Merge with existing rPrChange — preserve original author/date,
469
+ // add new previous properties
470
+ const mergedPreviousProperties: Partial<RunFormatting> = {
471
+ ...(existingChange.previousProperties || {}),
472
+ ...newPreviousProperties,
473
+ };
474
+ run.setPropertyChangeRevision({
475
+ ...existingChange,
476
+ previousProperties: mergedPreviousProperties,
477
+ });
478
+ } else {
479
+ const revisionId = this.revisionManager.consumeNextId();
480
+ run.setPropertyChangeRevision({
481
+ id: revisionId,
482
+ author: this.author,
483
+ date: new Date(latestTimestamp),
484
+ previousProperties: newPreviousProperties,
485
+ });
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Generic helper to apply *PrChange to table/row/cell/section elements
491
+ */
492
+ private applyElementPrChange(
493
+ changes: PendingChange[],
494
+ applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void
495
+ ): void {
496
+ const prevProps: Record<string, unknown> = {};
497
+ let latestTimestamp = 0;
498
+
499
+ for (const change of changes) {
500
+ // Record previous value even if undefined (property wasn't set before)
501
+ prevProps[change.property] = change.previousValue;
502
+ if (change.timestamp > latestTimestamp) {
503
+ latestTimestamp = change.timestamp;
504
+ }
505
+ }
506
+
507
+ const date = formatDateForXml(new Date(latestTimestamp));
508
+ applier(prevProps, () => this.revisionManager.consumeNextId(), date);
509
+ }
510
+
511
+ /**
512
+ * Add a pending change, consolidating with existing if same key
513
+ */
514
+ private addPendingChange(key: string, change: PendingChange): void {
515
+ const existing = this.pendingChanges.get(key);
516
+ if (existing) {
517
+ existing.count = (existing.count || 1) + 1;
518
+ // Keep the first previousValue for consolidated changes
519
+ } else {
520
+ this.pendingChanges.set(key, { ...change, count: 1 });
521
+ }
522
+ }
523
+
524
+ /**
525
+ * Create a Revision from a pending change
526
+ */
527
+ private createRevision(pending: PendingChange): Revision {
528
+ const previousProps: Record<string, any> = {};
529
+ const newProps: Record<string, any> = {};
530
+
531
+ if (pending.previousValue !== undefined) {
532
+ previousProps[pending.property] = pending.previousValue;
533
+ }
534
+ if (pending.newValue !== undefined) {
535
+ newProps[pending.property] = pending.newValue;
536
+ }
537
+
538
+ // Get or create a Run for the revision content
539
+ const run = this.getRunFromElement(pending.element);
540
+
541
+ return new Revision({
542
+ author: this.author,
543
+ type: pending.type,
544
+ content: run,
545
+ previousProperties:
546
+ Object.keys(previousProps).length > 0 ? previousProps : undefined,
547
+ newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,
548
+ date: new Date(pending.timestamp),
549
+ });
550
+ }
551
+
552
+ /**
553
+ * Get or create a Run from an element for revision content
554
+ */
555
+ private getRunFromElement(element: TrackableElement): Run {
556
+ if (element instanceof Run) {
557
+ return element;
558
+ }
559
+
560
+ // Use instanceof for type-safe element identification (minification-safe)
561
+ if (element instanceof Table) return new Run('Table');
562
+ if (element instanceof TableRow) return new Run('TableRow');
563
+ if (element instanceof TableCell) return new Run('TableCell');
564
+ if (element instanceof Section) return new Run('Section');
565
+ if (element instanceof Paragraph) return new Run('Paragraph');
566
+
567
+ // Fallback for other elements (e.g., Hyperlink)
568
+ const hasGetText = 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';
569
+ const text = hasGetText
570
+ ? (element as { getText: () => string }).getText()
571
+ : element?.constructor?.name || 'Unknown element';
572
+ return new Run(typeof text === 'string' ? text : String(text));
573
+ }
574
+
575
+ /**
576
+ * Get a stable unique ID for an element (used in consolidation keys)
577
+ */
578
+ private getElementId(element: TrackableElement): number {
579
+ let id = this.elementIdMap.get(element as object);
580
+ if (id === undefined) {
581
+ id = this.elementIdCounter++;
582
+ this.elementIdMap.set(element as object, id);
583
+ }
584
+ return id;
585
+ }
586
+
587
+ /**
588
+ * Deep equality check for tracking values (handles objects, primitives, null/undefined)
589
+ */
590
+ private valuesEqual(a: unknown, b: unknown): boolean {
591
+ if (a === b) return true;
592
+ if (a == null || b == null) return false;
593
+ if (typeof a !== 'object' || typeof b !== 'object') return false;
594
+ return JSON.stringify(a) === JSON.stringify(b);
595
+ }
596
+
597
+ /**
598
+ * Stringify a value for use in consolidation key
599
+ */
600
+ private stringifyValue(value: unknown): string {
601
+ if (value === undefined) return 'undefined';
602
+ if (value === null) return 'null';
603
+ if (typeof value === 'object') {
604
+ return JSON.stringify(value);
605
+ }
606
+ return String(value);
607
+ }
608
+
609
+ /**
610
+ * Create an insertion revision (factory to avoid circular dependency in Run)
611
+ */
612
+ createInsertion(content: Run, date?: Date): Revision {
613
+ return Revision.createInsertion(this.author, content, date);
614
+ }
615
+
616
+ /**
617
+ * Create a deletion revision (factory to avoid circular dependency in Run)
618
+ */
619
+ createDeletion(content: Run, date?: Date): Revision {
620
+ return Revision.createDeletion(this.author, content, date);
621
+ }
622
+
623
+ /**
624
+ * Get count of pending changes
625
+ */
626
+ getPendingCount(): number {
627
+ return this.pendingChanges.size;
628
+ }
629
+
630
+ /**
631
+ * Check if there are pending changes
632
+ */
633
+ hasPendingChanges(): boolean {
634
+ return this.pendingChanges.size > 0;
635
+ }
636
+
637
+ /**
638
+ * Clear all pending changes without creating revisions
639
+ */
640
+ clearPendingChanges(): void {
641
+ this.pendingChanges.clear();
642
+ }
643
+ }