docxmlater 10.4.0 → 11.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +75 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +618 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2100 -1076
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +478 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2235 -620
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -3,31 +3,32 @@
3
3
  * Provides a simple interface for creating DOCX files without managing ZIP and XML manually
4
4
  */
5
5
 
6
- import { Bookmark } from '../elements/Bookmark';
7
- import { BookmarkManager } from '../elements/BookmarkManager';
8
- import { Comment } from '../elements/Comment';
9
- import { PreservedElement } from '../elements/PreservedElement';
10
- import { CommentManager } from '../elements/CommentManager';
11
- import { Endnote } from '../elements/Endnote';
12
- import { EndnoteManager } from '../elements/EndnoteManager';
13
- import { Field, ComplexField } from '../elements/Field';
14
- import { Footnote } from '../elements/Footnote';
15
- import { FootnoteManager } from '../elements/FootnoteManager';
16
- import { Footer } from '../elements/Footer';
17
- import { Header } from '../elements/Header';
18
- import { HeaderFooterManager } from '../elements/HeaderFooterManager';
19
- import { Hyperlink } from '../elements/Hyperlink';
20
- import { Image } from '../elements/Image';
21
- import { ImageManager } from '../elements/ImageManager';
22
- import { ImageRun } from '../elements/ImageRun';
23
- import { Paragraph, ParagraphContent, FieldLike } from '../elements/Paragraph';
24
- import { RangeMarker } from '../elements/RangeMarker';
25
- import { Revision, RevisionType } from '../elements/Revision';
26
- import { RevisionManager } from '../elements/RevisionManager';
27
- import { RevisionLocation } from '../elements/PropertyChangeTypes';
28
- import { Run, RunFormatting } from '../elements/Run';
29
- import { Shape } from '../elements/Shape';
30
- import { TextBox } from '../elements/TextBox';
6
+ import { parseOnOffAttribute } from '../utils/parsingHelpers.js';
7
+ import { Bookmark } from '../elements/Bookmark.js';
8
+ import { BookmarkManager } from '../elements/BookmarkManager.js';
9
+ import { Comment } from '../elements/Comment.js';
10
+ import { PreservedElement } from '../elements/PreservedElement.js';
11
+ import { CommentManager } from '../elements/CommentManager.js';
12
+ import { Endnote } from '../elements/Endnote.js';
13
+ import { EndnoteManager } from '../elements/EndnoteManager.js';
14
+ import { Field, ComplexField } from '../elements/Field.js';
15
+ import { Footnote } from '../elements/Footnote.js';
16
+ import { FootnoteManager } from '../elements/FootnoteManager.js';
17
+ import { Footer } from '../elements/Footer.js';
18
+ import { Header } from '../elements/Header.js';
19
+ import { HeaderFooterManager } from '../elements/HeaderFooterManager.js';
20
+ import { Hyperlink } from '../elements/Hyperlink.js';
21
+ import { Image } from '../elements/Image.js';
22
+ import { ImageManager } from '../elements/ImageManager.js';
23
+ import { ImageRun } from '../elements/ImageRun.js';
24
+ import { Paragraph, ParagraphContent, FieldLike } from '../elements/Paragraph.js';
25
+ import { RangeMarker } from '../elements/RangeMarker.js';
26
+ import { Revision, RevisionType } from '../elements/Revision.js';
27
+ import { RevisionManager } from '../elements/RevisionManager.js';
28
+ import { RevisionLocation } from '../elements/PropertyChangeTypes.js';
29
+ import { Run, RunFormatting } from '../elements/Run.js';
30
+ import { Shape } from '../elements/Shape.js';
31
+ import { TextBox } from '../elements/TextBox.js';
31
32
  import {
32
33
  RevisionValidator,
33
34
  RevisionAutoFixer,
@@ -35,25 +36,33 @@ import {
35
36
  AutoFixOptions,
36
37
  ValidationResult,
37
38
  AutoFixResult,
38
- } from '../validation';
39
- import { Section } from '../elements/Section';
40
- import { StructuredDocumentTag } from '../elements/StructuredDocumentTag';
41
- import { Table, TableBorder } from '../elements/Table';
42
- import { TableCell } from '../elements/TableCell';
43
- import { TableOfContentsElement } from '../elements/TableOfContentsElement';
44
- import { resolveCellShading } from '../utils/ShadingResolver';
39
+ } from '../validation/index.js';
40
+ import { Section } from '../elements/Section.js';
41
+ import { StructuredDocumentTag } from '../elements/StructuredDocumentTag.js';
42
+ import { Table, TableBorder } from '../elements/Table.js';
43
+ import { TableCell } from '../elements/TableCell.js';
44
+ import { TableOfContentsElement } from '../elements/TableOfContentsElement.js';
45
+ import { resolveCellShading } from '../processors/ShadingResolver.js';
45
46
  import {
46
47
  NumberingManager,
47
48
  NumberingConsolidationOptions,
48
49
  NumberingConsolidationResult,
49
- } from '../formatting/NumberingManager';
50
- import { Style, StyleProperties } from '../formatting/Style';
51
- import { StylesManager } from '../formatting/StylesManager';
52
- import { FormatOptions, StyleApplyOptions } from '../types/formatting';
53
- import { CompatibilityMode, CompatibilityInfo, CompatSetting } from '../types/compatibility-types';
54
- import { DocumentProtection, RevisionViewSettings, WebSettingsInfo } from '../types/settings-types';
55
- import { CompatibilityUpgrader, UpgradeReport } from '../utils/CompatibilityUpgrader';
56
- import { MODERN_COMPAT_SETTINGS } from '../constants/legacyCompatFlags';
50
+ } from '../formatting/NumberingManager.js';
51
+ import { Style, StyleProperties } from '../formatting/Style.js';
52
+ import { StylesManager } from '../formatting/StylesManager.js';
53
+ import { FormatOptions, StyleApplyOptions } from '../types/formatting.js';
54
+ import {
55
+ CompatibilityMode,
56
+ CompatibilityInfo,
57
+ CompatSetting,
58
+ } from '../types/compatibility-types.js';
59
+ import {
60
+ DocumentProtection,
61
+ RevisionViewSettings,
62
+ WebSettingsInfo,
63
+ } from '../types/settings-types.js';
64
+ import { CompatibilityUpgrader, UpgradeReport } from '../processors/CompatibilityUpgrader.js';
65
+ import { MODERN_COMPAT_SETTINGS } from '../constants/legacyCompatFlags.js';
57
66
  // ListNormalizationOptions and ListNormalizationReport removed - normalizeTableLists moved to consumer
58
67
  import {
59
68
  ApplyStylesOptions,
@@ -61,10 +70,10 @@ import {
61
70
  StyleConfig,
62
71
  StyleRunFormatting,
63
72
  StyleParagraphFormatting,
64
- } from '../types/styleConfig';
73
+ } from '../types/styleConfig.js';
65
74
  // ListNormalizer import removed - moved to consumer
66
- import { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger';
67
- import { UNITS } from '../utils/units';
75
+ import { defaultLogger, ILogger, getGlobalLogger, createScopedLogger } from '../utils/logger.js';
76
+ import { UNITS } from '../utils/units.js';
68
77
 
69
78
  // Create scoped logger for Document operations
70
79
  function getLogger(): ILogger {
@@ -72,71 +81,36 @@ function getLogger(): ILogger {
72
81
  }
73
82
  // Raw XML revision acceptance - used at load time BEFORE parsing
74
83
  // cleanupRevisionMetadata - cleanup metadata files after in-memory acceptance
75
- import { acceptAllRevisions, cleanupRevisionMetadata } from '../utils/acceptRevisions';
84
+ import { acceptAllRevisions, cleanupRevisionMetadata } from '../processors/acceptRevisions.js';
76
85
  // In-memory revision acceptance - used AFTER parsing, allows subsequent modifications
77
- import { acceptRevisionsInMemory } from '../utils/InMemoryRevisionAcceptor';
78
- import { stripTrackedChanges } from '../utils/stripTrackedChanges';
79
- import { diffText, diffHasUnchangedParts } from '../utils/textDiff';
80
- import { XMLBuilder } from '../xml/XMLBuilder';
81
- import { XMLParser } from '../xml/XMLParser';
82
- import { DocumentTrackingContext } from '../tracking/DocumentTrackingContext';
83
- import type { TrackingContext } from '../tracking/TrackingContext';
84
- import { ZipHandler } from '../zip/ZipHandler';
85
- import { DOCX_PATHS } from '../zip/types';
86
- import { DocumentGenerator } from './DocumentGenerator';
87
- import { DocumentIdManager } from './DocumentIdManager';
88
- import { DocumentParser } from './DocumentParser';
89
- import { DocumentValidator } from './DocumentValidator';
90
- import { RelationshipManager } from './RelationshipManager';
91
- import { RelationshipType } from './Relationship';
92
- import { BodyElement } from './DocumentContent';
93
- import { optimizeImage, ImageOptimizationResult } from '../images/ImageOptimizer';
94
-
95
- /**
96
- * Document properties (core and extended)
97
- */
98
- export interface DocumentProperties {
99
- // Core Properties (docProps/core.xml)
100
- title?: string;
101
- subject?: string;
102
- creator?: string;
103
- keywords?: string;
104
- description?: string;
105
- lastModifiedBy?: string;
106
- revision?: number;
107
- created?: Date;
108
- modified?: Date;
109
- language?: string;
110
- category?: string;
111
- contentStatus?: string;
112
-
113
- // Extended Properties (docProps/app.xml)
114
- application?: string;
115
- appVersion?: string;
116
- company?: string;
117
- manager?: string;
118
- version?: string;
119
-
120
- // Custom Properties (docProps/custom.xml)
121
- customProperties?: Record<string, string | number | boolean | Date>;
122
- }
123
-
124
- /**
125
- * Document part representation
126
- * Represents any part within a DOCX package (XML, binary, etc.)
127
- */
128
- export interface DocumentPart {
129
- /** Part name/path within the package */
130
- name: string;
131
- /** Part content (string for XML/text, Buffer for binary) */
132
- content: string | Buffer;
133
- /** MIME content type */
134
- contentType?: string;
135
- /** Whether the part is binary */
136
- isBinary?: boolean;
137
- /** Part size in bytes */
138
- size?: number;
139
- }
86
+ import { acceptRevisionsInMemory } from '../processors/InMemoryRevisionAcceptor.js';
87
+ import { stripTrackedChanges } from '../processors/stripTrackedChanges.js';
88
+ import { diffText, diffHasUnchangedParts } from '../utils/textDiff.js';
89
+ import { XMLBuilder } from '../xml/XMLBuilder.js';
90
+ import { XMLParser } from '../xml/XMLParser.js';
91
+ import { DocumentTrackingContext } from '../tracking/DocumentTrackingContext.js';
92
+ import type { TrackingContext } from '../tracking/TrackingContext.js';
93
+ import { ZipHandler } from '../zip/ZipHandler.js';
94
+ import { DOCX_PATHS } from '../zip/types.js';
95
+ import { DocumentGenerator } from './DocumentGenerator.js';
96
+ import { DocumentIdManager } from './DocumentIdManager.js';
97
+ import { DocumentParser } from './DocumentParser.js';
98
+ import { DocumentValidator } from './DocumentValidator.js';
99
+ import {
100
+ DocumentEventEmitter,
101
+ type DocumentEventListener,
102
+ type DocumentEventType,
103
+ } from './DocumentEvents.js';
104
+ import { RelationshipManager } from './RelationshipManager.js';
105
+ import { RelationshipType } from './Relationship.js';
106
+ import { BodyElement } from './DocumentContent.js';
107
+ import { optimizeImage, ImageOptimizationResult } from '../images/ImageOptimizer.js';
108
+
109
+ // DocumentProperties / DocumentPart now live in `src/types/document-types.ts`
110
+ // to break the Document ↔ DocumentParser/Generator/Validator cycle.
111
+ // They are re-exported below for backward compat.
112
+ export type { DocumentProperties, DocumentPart } from '../types/document-types.js';
113
+ import type { DocumentProperties, DocumentPart } from '../types/document-types.js';
140
114
 
141
115
  /**
142
116
  * Document creation options
@@ -355,6 +329,23 @@ export class Document {
355
329
  private _originalCommentsXml?: string;
356
330
  private _commentsModified = false;
357
331
  private _originalCommentCompanionFiles = new Map<string, string>();
332
+
333
+ /** Event emitter for lifecycle and mutation events. */
334
+ private _events = new DocumentEventEmitter();
335
+
336
+ /**
337
+ * Serialization queue for save / toBuffer operations.
338
+ *
339
+ * Document is single-threaded by design — `prepareSave()` mutates shared
340
+ * managers (StylesManager, NumberingManager, ImageManager) without
341
+ * locking, so two concurrent saves would race on those managers and on
342
+ * the shared `zipHandler` files. The lock chains save / toBuffer calls
343
+ * onto a serial Promise so callers can fire `Promise.all([save(a),
344
+ * save(b)])` without corrupting state. Errors do not poison the queue —
345
+ * a failed save still releases the next waiter.
346
+ */
347
+ private _saveQueue: Promise<unknown> = Promise.resolve();
348
+
358
349
  /** Parts explicitly removed via removePart() — skip regeneration during save */
359
350
  private _removedParts = new Set<string>();
360
351
 
@@ -796,7 +787,9 @@ export class Document {
796
787
  const zipHandler = new ZipHandler();
797
788
  await zipHandler.load(filePath);
798
789
 
799
- return Document.initializeFromZip(zipHandler, options);
790
+ const doc = await Document.initializeFromZip(zipHandler, options);
791
+ doc._events.emit('afterLoad', { source: 'file', path: filePath });
792
+ return doc;
800
793
  }
801
794
 
802
795
  /**
@@ -834,7 +827,9 @@ export class Document {
834
827
  const zipHandler = new ZipHandler();
835
828
  await zipHandler.loadFromBuffer(buffer);
836
829
 
837
- return Document.initializeFromZip(zipHandler, options);
830
+ const doc = await Document.initializeFromZip(zipHandler, options);
831
+ doc._events.emit('afterLoad', { source: 'buffer' });
832
+ return doc;
838
833
  }
839
834
 
840
835
  /**
@@ -975,32 +970,67 @@ export class Document {
975
970
  }
976
971
  }
977
972
 
978
- // Parse w:doNotTrackFormatting - presence means formatting tracking is disabled
979
- const hasDoNotTrackFormatting = /<w:doNotTrackFormatting\b[^>]*\/?>/.test(settingsXml);
980
- if (hasDoNotTrackFormatting) {
973
+ // Helper: parse a settings-level CT_OnOff flag. Returns undefined when the
974
+ // element is absent, or the actual boolean (respecting w:val's ST_OnOff
975
+ // value — "0"/"1"/"true"/"false"/"on"/"off") when present. A bare element
976
+ // without w:val defaults to true per ECMA-376 §17.17.4.
977
+ const parseSettingCtOnOff = (tagName: string): boolean | undefined => {
978
+ const re = new RegExp(`<${tagName}\\b([^>]*)\\/?>`);
979
+ const m = re.exec(settingsXml);
980
+ if (!m) return undefined;
981
+ const attrs = m[1] ?? '';
982
+ const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
983
+ if (!valMatch || valMatch[1] === undefined) return true;
984
+ const v = valMatch[1].toLowerCase();
985
+ return v !== '0' && v !== 'false' && v !== 'off';
986
+ };
987
+
988
+ // Parse w:doNotTrackFormatting - CT_OnOff; when true, formatting tracking
989
+ // is disabled. (Previously tested presence only, so `<w:doNotTrackFormatting
990
+ // w:val="0"/>` was silently taken to disable tracking even though it means
991
+ // "do not [do not track formatting]" = track formatting normally.)
992
+ const doNotTrackFormattingVal = parseSettingCtOnOff('w:doNotTrackFormatting');
993
+ if (doNotTrackFormattingVal === true) {
981
994
  this.trackFormatting = false;
982
- }
983
- // Parse w:trackFormatting - explicit presence means formatting tracking is enabled
984
- const hasTrackFormatting = /<w:trackFormatting\b[^>]*\/?>/.test(settingsXml);
985
- if (hasTrackFormatting) {
995
+ } else if (doNotTrackFormattingVal === false) {
986
996
  this.trackFormatting = true;
987
997
  }
998
+ // Parse w:trackFormatting - CT_OnOff; explicit true enables formatting tracking.
999
+ const trackFormattingVal = parseSettingCtOnOff('w:trackFormatting');
1000
+ if (trackFormattingVal !== undefined) {
1001
+ this.trackFormatting = trackFormattingVal;
1002
+ }
988
1003
 
989
- // Parse w:revisionView
1004
+ // Parse w:revisionView per ECMA-376 §17.15.1.77 (CT_TrackChangesView).
1005
+ // @w:insDel / @w:formatting / @w:inkAnnotations are ST_OnOff attributes;
1006
+ // accept every literal (1/0/true/false/on/off). Prior code used `!== '0'`
1007
+ // which flipped "false" and "off" to true, silently misreporting the
1008
+ // tracked-changes display configuration.
990
1009
  const revisionViewMatch = /<w:revisionView\b([^>]*)\/?>/.exec(settingsXml);
991
1010
  if (revisionViewMatch) {
992
1011
  const attrs = revisionViewMatch[1] || '';
993
1012
  const insDelMatch = /w:insDel\s*=\s*"([^"]*)"/.exec(attrs);
994
1013
  const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
995
1014
  const inkMatch = /w:inkAnnotations\s*=\s*"([^"]*)"/.exec(attrs);
1015
+ // CT_TrackChangesView also carries w:markup (all revision markup)
1016
+ // and w:comments (balloon visibility). Both were previously dropped
1017
+ // on the parser even though the element was already extracted.
1018
+ const markupMatch = /w:markup\s*=\s*"([^"]*)"/.exec(attrs);
1019
+ const commentsMatch = /w:comments\s*=\s*"([^"]*)"/.exec(attrs);
996
1020
  if (insDelMatch?.[1] !== undefined) {
997
- this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1] !== '0';
1021
+ this.revisionViewSettings.showInsertionsAndDeletions = parseOnOffAttribute(insDelMatch[1]);
998
1022
  }
999
1023
  if (formattingMatch?.[1] !== undefined) {
1000
- this.revisionViewSettings.showFormatting = formattingMatch[1] !== '0';
1024
+ this.revisionViewSettings.showFormatting = parseOnOffAttribute(formattingMatch[1]);
1001
1025
  }
1002
1026
  if (inkMatch?.[1] !== undefined) {
1003
- this.revisionViewSettings.showInkAnnotations = inkMatch[1] !== '0';
1027
+ this.revisionViewSettings.showInkAnnotations = parseOnOffAttribute(inkMatch[1]);
1028
+ }
1029
+ if (markupMatch?.[1] !== undefined) {
1030
+ this.revisionViewSettings.showMarkup = parseOnOffAttribute(markupMatch[1]);
1031
+ }
1032
+ if (commentsMatch?.[1] !== undefined) {
1033
+ this.revisionViewSettings.showComments = parseOnOffAttribute(commentsMatch[1]);
1004
1034
  }
1005
1035
  }
1006
1036
 
@@ -1012,9 +1042,19 @@ export class Document {
1012
1042
  const enforcementMatch = /w:enforcement\s*=\s*"([^"]*)"/.exec(attrs);
1013
1043
  if (editMatch?.[1]) {
1014
1044
  const edit = editMatch[1] as 'readOnly' | 'comments' | 'trackedChanges' | 'forms';
1015
- const enforcement = enforcementMatch?.[1] ? enforcementMatch[1] !== '0' : true;
1045
+ // @w:enforcement is ST_OnOff honour every literal. Default true when absent
1046
+ // per ECMA-376 §17.15.1.29. Prior `!== '0'` missed "false" and "off".
1047
+ const enforcement = enforcementMatch?.[1] ? parseOnOffAttribute(enforcementMatch[1]) : true;
1016
1048
  this.documentProtection = { edit, enforcement };
1017
1049
 
1050
+ // `w:formatting` per CT_DocProtect §17.15.1.29 — ST_OnOff. When true,
1051
+ // formatting changes are allowed even under edit protection. Parse
1052
+ // with parseOnOffAttribute so every ST_OnOff literal maps correctly.
1053
+ const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
1054
+ if (formattingMatch?.[1] !== undefined) {
1055
+ this.documentProtection.formatting = parseOnOffAttribute(formattingMatch[1]);
1056
+ }
1057
+
1018
1058
  // Parse optional crypto attributes
1019
1059
  const cryptProviderMatch = /w:cryptProviderType\s*=\s*"([^"]*)"/.exec(attrs);
1020
1060
  const cryptAlgClassMatch = /w:cryptAlgorithmClass\s*=\s*"([^"]*)"/.exec(attrs);
@@ -1036,6 +1076,20 @@ export class Document {
1036
1076
  this.documentProtection.cryptSpinCount = parseInt(cryptSpinMatch[1], 10);
1037
1077
  if (hashMatch?.[1]) this.documentProtection.hash = hashMatch[1];
1038
1078
  if (saltMatch?.[1]) this.documentProtection.salt = saltMatch[1];
1079
+
1080
+ // Modern Word 2013+ crypto attributes (ISO/IEC 29500-4 §13).
1081
+ // Previously dropped on parse — a password-protected document
1082
+ // saved by modern Word lost its hash/salt on any programmatic
1083
+ // resave because the legacy `hash`/`salt` regex no longer matches
1084
+ // the modern `hashValue`/`saltValue` attribute names.
1085
+ const algorithmNameMatch = /w:algorithmName\s*=\s*"([^"]*)"/.exec(attrs);
1086
+ const hashValueMatch = /w:hashValue\s*=\s*"([^"]*)"/.exec(attrs);
1087
+ const saltValueMatch = /w:saltValue\s*=\s*"([^"]*)"/.exec(attrs);
1088
+ if (algorithmNameMatch?.[1]) {
1089
+ this.documentProtection.algorithmName = algorithmNameMatch[1];
1090
+ }
1091
+ if (hashValueMatch?.[1]) this.documentProtection.hashValue = hashValueMatch[1];
1092
+ if (saltValueMatch?.[1]) this.documentProtection.saltValue = saltValueMatch[1];
1039
1093
  }
1040
1094
  }
1041
1095
 
@@ -1069,30 +1123,25 @@ export class Document {
1069
1123
  this._documentView = viewMatch[1];
1070
1124
  }
1071
1125
 
1072
- // Parse w:evenAndOddHeaders per ECMA-376 Part 1 §17.15.1.28
1073
- if (/<w:evenAndOddHeaders\b[^>]*\/?>/.test(settingsXml)) {
1074
- this._evenAndOddHeaders = true;
1075
- }
1126
+ // CT_OnOff settings flags (ECMA-376 §17.15.1). Each honours w:val via the
1127
+ // parseSettingCtOnOff helper defined above — previously these used a simple
1128
+ // presence-detect regex and silently flipped explicit `<w:X w:val="0"/>` to
1129
+ // true, corrupting any source document that recorded an explicit-off state.
1130
+ const evenAndOddHeadersVal = parseSettingCtOnOff('w:evenAndOddHeaders');
1131
+ if (evenAndOddHeadersVal !== undefined) this._evenAndOddHeaders = evenAndOddHeadersVal;
1076
1132
 
1077
- // Parse w:mirrorMargins per ECMA-376 Part 1 §17.15.1.57
1078
- if (/<w:mirrorMargins\b[^>]*\/?>/.test(settingsXml)) {
1079
- this._mirrorMargins = true;
1080
- }
1133
+ const mirrorMarginsVal = parseSettingCtOnOff('w:mirrorMargins');
1134
+ if (mirrorMarginsVal !== undefined) this._mirrorMargins = mirrorMarginsVal;
1081
1135
 
1082
- // Parse w:autoHyphenation per ECMA-376 Part 1 §17.15.1.10
1083
- if (/<w:autoHyphenation\b[^>]*\/?>/.test(settingsXml)) {
1084
- this._autoHyphenation = true;
1085
- }
1136
+ const autoHyphenationVal = parseSettingCtOnOff('w:autoHyphenation');
1137
+ if (autoHyphenationVal !== undefined) this._autoHyphenation = autoHyphenationVal;
1086
1138
 
1087
- // Parse w:hideSpellingErrors per ECMA-376 Part 1 §17.15.1.43
1088
- if (/<w:hideSpellingErrors\b[^>]*\/?>/.test(settingsXml)) {
1089
- this._hideSpellingErrors = true;
1090
- }
1139
+ const hideSpellingErrorsVal = parseSettingCtOnOff('w:hideSpellingErrors');
1140
+ if (hideSpellingErrorsVal !== undefined) this._hideSpellingErrors = hideSpellingErrorsVal;
1091
1141
 
1092
- // Parse w:hideGrammaticalErrors per ECMA-376 Part 1 §17.15.1.42
1093
- if (/<w:hideGrammaticalErrors\b[^>]*\/?>/.test(settingsXml)) {
1094
- this._hideGrammaticalErrors = true;
1095
- }
1142
+ const hideGrammaticalErrorsVal = parseSettingCtOnOff('w:hideGrammaticalErrors');
1143
+ if (hideGrammaticalErrorsVal !== undefined)
1144
+ this._hideGrammaticalErrors = hideGrammaticalErrorsVal;
1096
1145
 
1097
1146
  // Parse w:defaultTabStop per ECMA-376 Part 1 §17.15.1.25
1098
1147
  const defaultTabStopMatch = /<w:defaultTabStop\s+w:val\s*=\s*"(\d+)"\s*\/?>/.exec(settingsXml);
@@ -1100,25 +1149,18 @@ export class Document {
1100
1149
  this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);
1101
1150
  }
1102
1151
 
1103
- // Parse w:updateFields per ECMA-376 Part 1 §17.15.1.85
1104
- if (/<w:updateFields\b[^>]*\/?>/.test(settingsXml)) {
1105
- this._updateFields = true;
1106
- }
1152
+ const updateFieldsVal = parseSettingCtOnOff('w:updateFields');
1153
+ if (updateFieldsVal !== undefined) this._updateFields = updateFieldsVal;
1107
1154
 
1108
- // Parse w:embedTrueTypeFonts per ECMA-376 Part 1 §17.15.1.24
1109
- if (/<w:embedTrueTypeFonts\b[^>]*\/?>/.test(settingsXml)) {
1110
- this._embedTrueTypeFonts = true;
1111
- }
1155
+ const embedTrueTypeFontsVal = parseSettingCtOnOff('w:embedTrueTypeFonts');
1156
+ if (embedTrueTypeFontsVal !== undefined) this._embedTrueTypeFonts = embedTrueTypeFontsVal;
1112
1157
 
1113
- // Parse w:saveSubsetFonts per ECMA-376 Part 1 §17.15.1.78
1114
- if (/<w:saveSubsetFonts\b[^>]*\/?>/.test(settingsXml)) {
1115
- this._saveSubsetFonts = true;
1116
- }
1158
+ const saveSubsetFontsVal = parseSettingCtOnOff('w:saveSubsetFonts');
1159
+ if (saveSubsetFontsVal !== undefined) this._saveSubsetFonts = saveSubsetFontsVal;
1117
1160
 
1118
- // Parse w:doNotTrackMoves per ECMA-376 Part 1 §17.15.1.35
1119
- if (/<w:doNotTrackMoves\b[^>]*\/?>/.test(settingsXml)) {
1120
- this._doNotTrackMoves = true;
1121
- }
1161
+ // w:doNotTrackMoves tracked-changes-specific CT_OnOff flag.
1162
+ const doNotTrackMovesVal = parseSettingCtOnOff('w:doNotTrackMoves');
1163
+ if (doNotTrackMovesVal !== undefined) this._doNotTrackMoves = doNotTrackMovesVal;
1122
1164
 
1123
1165
  // Parse w:decimalSymbol per ECMA-376 Part 1 §17.15.1.23
1124
1166
  const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
@@ -1615,6 +1657,7 @@ export class Document {
1615
1657
  }
1616
1658
 
1617
1659
  this.bodyElements.push(paragraph);
1660
+ this._emitElementAdded(paragraph, this.bodyElements.length - 1);
1618
1661
  return this;
1619
1662
  }
1620
1663
 
@@ -1656,7 +1699,10 @@ export class Document {
1656
1699
  if (text) {
1657
1700
  para.addText(text);
1658
1701
  }
1702
+ // Apply global defaults (font / size) if registered.
1703
+ Document.applyGlobalDefaultsToParagraph(para);
1659
1704
  this.bodyElements.push(para);
1705
+ this._emitElementAdded(para, this.bodyElements.length - 1);
1660
1706
  return para;
1661
1707
  }
1662
1708
 
@@ -1762,6 +1808,7 @@ export class Document {
1762
1808
  }
1763
1809
 
1764
1810
  this.bodyElements.push(table);
1811
+ this._emitElementAdded(table, this.bodyElements.length - 1);
1765
1812
  return this;
1766
1813
  }
1767
1814
 
@@ -1783,6 +1830,7 @@ export class Document {
1783
1830
  */
1784
1831
  addStructuredDocumentTag(sdt: StructuredDocumentTag): this {
1785
1832
  this.bodyElements.push(sdt);
1833
+ this._emitElementAdded(sdt, this.bodyElements.length - 1);
1786
1834
  return this;
1787
1835
  }
1788
1836
 
@@ -1818,6 +1866,7 @@ export class Document {
1818
1866
  const table = new Table(rows, columns);
1819
1867
  table._setStylesManager(this.stylesManager);
1820
1868
  this.bodyElements.push(table);
1869
+ this._emitElementAdded(table, this.bodyElements.length - 1);
1821
1870
  return table;
1822
1871
  }
1823
1872
 
@@ -1844,6 +1893,7 @@ export class Document {
1844
1893
  const table = Table.fromCSV(csv, delimiter);
1845
1894
  table._setStylesManager(this.stylesManager);
1846
1895
  this.bodyElements.push(table);
1896
+ this._emitElementAdded(table, this.bodyElements.length - 1);
1847
1897
  return table;
1848
1898
  }
1849
1899
 
@@ -1949,6 +1999,75 @@ export class Document {
1949
1999
  return result;
1950
2000
  }
1951
2001
 
2002
+ /**
2003
+ * Lazy iterator over every paragraph in the document. Yields the same
2004
+ * set as `getAllParagraphs()` (including paragraphs inside table cells
2005
+ * and nested SDTs) without materialising the full array — for memory
2006
+ * pipelines over very large documents.
2007
+ *
2008
+ * Mutations during iteration are not protected — callers must not
2009
+ * structurally mutate the document while iterating.
2010
+ */
2011
+ *iterateParagraphs(): IterableIterator<Paragraph> {
2012
+ yield* Document.walkParagraphs(this.bodyElements);
2013
+ }
2014
+
2015
+ private static *walkParagraphs(elements: BodyElement[]): IterableIterator<Paragraph> {
2016
+ for (const element of elements) {
2017
+ if (element instanceof Paragraph) {
2018
+ yield element;
2019
+ } else if (element instanceof Table) {
2020
+ for (const row of element.getRows()) {
2021
+ for (const cell of row.getCells()) {
2022
+ for (const cellPara of cell.getParagraphs()) {
2023
+ yield cellPara;
2024
+ }
2025
+ }
2026
+ }
2027
+ } else if (element instanceof StructuredDocumentTag) {
2028
+ yield* Document.walkParagraphs(element.getContent() as BodyElement[]);
2029
+ }
2030
+ }
2031
+ }
2032
+
2033
+ /**
2034
+ * Lazy iterator over the top-level body elements (paragraphs, tables,
2035
+ * SDTs, custom XML blocks) in document order. Use this when table or
2036
+ * SDT boundaries matter to your pipeline.
2037
+ */
2038
+ *iterateBodyElements(): IterableIterator<BodyElement> {
2039
+ for (const element of this.bodyElements) {
2040
+ yield element;
2041
+ }
2042
+ }
2043
+
2044
+ /**
2045
+ * Lazy iterator that yields each section in the document along with
2046
+ * the body elements belonging to it. A section break is identified by
2047
+ * a paragraph carrying its own `sectPr` (CT_SectPr); the document's
2048
+ * root `Section` closes the final group.
2049
+ *
2050
+ * @yields `{ sectPr, elements }` where `sectPr` is the raw section-
2051
+ * properties marker (string or parsed object) for inline section
2052
+ * breaks, or the document's root `Section` for the trailing group.
2053
+ */
2054
+ *iterateSections(): IterableIterator<{
2055
+ sectPr: string | Record<string, unknown> | Section | null;
2056
+ elements: BodyElement[];
2057
+ }> {
2058
+ let current: BodyElement[] = [];
2059
+ for (const element of this.bodyElements) {
2060
+ current.push(element);
2061
+ if (element instanceof Paragraph && element.formatting.sectPr) {
2062
+ yield { sectPr: element.formatting.sectPr, elements: current };
2063
+ current = [];
2064
+ }
2065
+ }
2066
+ if (current.length > 0) {
2067
+ yield { sectPr: this.section ?? null, elements: current };
2068
+ }
2069
+ }
2070
+
1952
2071
  /**
1953
2072
  * Gets all paragraphs in the document (alias for getAllParagraphs)
1954
2073
  * @returns Array of all paragraphs recursively
@@ -2065,6 +2184,7 @@ export class Document {
2065
2184
  */
2066
2185
  addBodyElement(element: BodyElement): this {
2067
2186
  this.bodyElements.push(element);
2187
+ this._emitElementAdded(element, this.bodyElements.length - 1);
2068
2188
  return this;
2069
2189
  }
2070
2190
 
@@ -2510,8 +2630,25 @@ export class Document {
2510
2630
  * ```
2511
2631
  */
2512
2632
  async save(filePath: string): Promise<void> {
2633
+ return this.withSaveLock(() => this.saveImpl(filePath));
2634
+ }
2635
+
2636
+ /**
2637
+ * Chains an operation onto the serial save queue. Concurrent callers
2638
+ * (e.g., `Promise.all([doc.save(a), doc.save(b)])`) are serialised so
2639
+ * `prepareSave()` and the underlying ZIP cannot race. The chain
2640
+ * survives errors — a failed operation releases the next waiter.
2641
+ */
2642
+ private withSaveLock<T>(operation: () => Promise<T>): Promise<T> {
2643
+ const next = this._saveQueue.then(operation, operation);
2644
+ this._saveQueue = next.catch(() => undefined);
2645
+ return next;
2646
+ }
2647
+
2648
+ private async saveImpl(filePath: string): Promise<void> {
2513
2649
  const logger = getLogger();
2514
2650
  logger.info('Saving document', { path: filePath, paragraphs: this.getParagraphCount() });
2651
+ this._events.emit('beforeSave', { filePath });
2515
2652
 
2516
2653
  // Use atomic save pattern: save to temp file, then rename
2517
2654
  // This prevents partial/corrupted saves if operation fails mid-way
@@ -2542,6 +2679,7 @@ export class Document {
2542
2679
  saveSucceeded = true;
2543
2680
  this.clearSaveStateSnapshot();
2544
2681
  logger.info('Document saved', { path: filePath });
2682
+ this._events.emit('afterSave', { filePath });
2545
2683
  } catch (error: unknown) {
2546
2684
  // Restore state snapshot on failure - allows retry without data loss
2547
2685
  this.restoreSaveStateSnapshot();
@@ -2592,8 +2730,13 @@ export class Document {
2592
2730
  * ```
2593
2731
  */
2594
2732
  async toBuffer(): Promise<Buffer> {
2733
+ return this.withSaveLock(() => this.toBufferImpl());
2734
+ }
2735
+
2736
+ private async toBufferImpl(): Promise<Buffer> {
2595
2737
  const logger = getLogger();
2596
2738
  logger.info('Generating document buffer', { paragraphs: this.getParagraphCount() });
2739
+ this._events.emit('beforeSave', {});
2597
2740
 
2598
2741
  // Track whether generation succeeded for proper cleanup
2599
2742
  let generateSucceeded = false;
@@ -2621,6 +2764,7 @@ export class Document {
2621
2764
  generateSucceeded = true;
2622
2765
  this.clearSaveStateSnapshot();
2623
2766
  logger.info('Document buffer generated', { bufferSize: buffer.length });
2767
+ this._events.emit('afterSave', { bufferSize: buffer.length });
2624
2768
  return buffer;
2625
2769
  } catch (error: unknown) {
2626
2770
  // Restore state snapshot on failure - allows retry without data loss
@@ -3335,17 +3479,46 @@ export class Document {
3335
3479
  if (!this._originalWebSettingsXml) {
3336
3480
  return 0;
3337
3481
  }
3338
- const matches = this._originalWebSettingsXml.match(/<w:div\b/g);
3482
+ const original = this._originalWebSettingsXml;
3483
+ const matches = original.match(/<w:div\b/g);
3339
3484
  const count = matches ? matches.length : 0;
3340
3485
  if (count === 0) {
3341
3486
  return 0;
3342
3487
  }
3343
- this._originalWebSettingsXml = this._originalWebSettingsXml.replace(
3344
- /<w:divs>[\s\S]*?<\/w:divs>/g,
3345
- ''
3346
- );
3347
- this._webSettingsModified = true;
3348
- return count;
3488
+ // Mutate via try/catch + post-mutation validation. If the regex match
3489
+ // accidentally produces malformed XML (e.g., a partial `<w:divs>` open
3490
+ // tag with no close), revert to the pre-mutation snapshot rather than
3491
+ // persisting corruption.
3492
+ try {
3493
+ const mutated = original.replace(/<w:divs>[\s\S]*?<\/w:divs>/g, '');
3494
+ // Sanity check: result must still parse as well-formed root XML.
3495
+ // `<?xml ...?>` prologue must survive, and tag balance must match.
3496
+ if (!Document.isWellFormedXml(mutated)) {
3497
+ getLogger().warn('stripWebDivs produced malformed XML; reverting');
3498
+ return 0;
3499
+ }
3500
+ this._originalWebSettingsXml = mutated;
3501
+ this._webSettingsModified = true;
3502
+ return count;
3503
+ } catch (err) {
3504
+ getLogger().warn('stripWebDivs failed; reverting', { error: String(err) });
3505
+ this._originalWebSettingsXml = original;
3506
+ return 0;
3507
+ }
3508
+ }
3509
+
3510
+ /**
3511
+ * Lightweight well-formedness check for in-place XML mutations.
3512
+ * Verifies tag balance (open/close counts match for each element name)
3513
+ * and that any XML prologue remains intact. Sufficient for catching
3514
+ * regex string.replace() failures that bisect a tag.
3515
+ */
3516
+ private static isWellFormedXml(xml: string): boolean {
3517
+ if (xml.length === 0) return true;
3518
+ // Count opening and closing tags. Self-closing tags don't need a closer.
3519
+ const openTags = xml.match(/<([a-zA-Z_][^\s/>]*)\b[^>]*[^/]>/g) || [];
3520
+ const closeTags = xml.match(/<\/([a-zA-Z_][^\s>]*)\s*>/g) || [];
3521
+ return openTags.length === closeTags.length;
3349
3522
  }
3350
3523
 
3351
3524
  /**
@@ -4137,7 +4310,7 @@ export class Document {
4137
4310
  table: Table,
4138
4311
  row: number,
4139
4312
  col: number
4140
- ): import('../elements/CommonTypes').ShadingConfig | undefined {
4313
+ ): import('../elements/CommonTypes.js').ShadingConfig | undefined {
4141
4314
  const tableRow = table.getRow(row);
4142
4315
  if (!tableRow) return undefined;
4143
4316
  const cell = tableRow.getCell(col);
@@ -6835,6 +7008,15 @@ export class Document {
6835
7008
  * });
6836
7009
  * ```
6837
7010
  */
7011
+ private static stripThemeFontsIfExplicitFont(runConfig: any): void {
7012
+ if (runConfig?.font) {
7013
+ delete runConfig.fontAsciiTheme;
7014
+ delete runConfig.fontHAnsiTheme;
7015
+ delete runConfig.fontEastAsiaTheme;
7016
+ delete runConfig.fontCsTheme;
7017
+ }
7018
+ }
7019
+
6838
7020
  public applyStyles(options?: ApplyStylesOptions): {
6839
7021
  heading1: boolean;
6840
7022
  heading2: boolean;
@@ -6915,6 +7097,14 @@ export class Document {
6915
7097
  },
6916
7098
  };
6917
7099
 
7100
+ // Strip theme font attributes when an explicit font is provided,
7101
+ // because Word prioritizes theme fonts over explicit font names.
7102
+ Document.stripThemeFontsIfExplicitFont(h1Config.run);
7103
+ Document.stripThemeFontsIfExplicitFont(h2Config.run);
7104
+ Document.stripThemeFontsIfExplicitFont(h3Config.run);
7105
+ Document.stripThemeFontsIfExplicitFont(normalConfig.run);
7106
+ Document.stripThemeFontsIfExplicitFont(listParaConfig.run);
7107
+
6918
7108
  // Extract preserve blank lines option (defaults to true)
6919
7109
  const preserveBlankLines = options?.preserveBlankLinesAfterHeading2Tables ?? true;
6920
7110
 
@@ -13031,10 +13221,118 @@ export class Document {
13031
13221
  * Call this after saving in long-running processes to free memory
13032
13222
  * Especially important for API servers processing many documents
13033
13223
  */
13224
+ // ============================================================================
13225
+ // Event API
13226
+ // ============================================================================
13227
+
13228
+ /**
13229
+ * Subscribe to a document lifecycle / mutation event. Returns an
13230
+ * unsubscribe function so callers don't have to retain the listener
13231
+ * reference for `off()`.
13232
+ *
13233
+ * Listener errors are caught and logged via the global logger — a
13234
+ * misbehaving listener cannot abort `save()` or break document state.
13235
+ *
13236
+ * @example
13237
+ * ```typescript
13238
+ * const dispose = doc.on('paragraphAdded', ({ paragraph }) => {
13239
+ * audit.append(paragraph.getText());
13240
+ * });
13241
+ * // later
13242
+ * dispose();
13243
+ * ```
13244
+ */
13245
+ on<T extends DocumentEventType>(event: T, listener: DocumentEventListener<T>): () => void {
13246
+ return this._events.on(event, listener);
13247
+ }
13248
+
13249
+ /** Remove a previously registered event listener. */
13250
+ off<T extends DocumentEventType>(event: T, listener: DocumentEventListener<T>): void {
13251
+ this._events.off(event, listener);
13252
+ }
13253
+
13254
+ /** Number of listeners registered for a given event. Useful for tests. */
13255
+ listenerCount(event: DocumentEventType): number {
13256
+ return this._events.listenerCount(event);
13257
+ }
13258
+
13259
+ /**
13260
+ * Emit the appropriate mutation event for `element`. No-op for body
13261
+ * element types that don't have a dedicated event (SDT, TOC, custom XML).
13262
+ * Centralised so every public add/insert path emits consistently.
13263
+ */
13264
+ private _emitElementAdded(element: BodyElement, index: number): void {
13265
+ if (element instanceof Paragraph) {
13266
+ this._events.emit('paragraphAdded', { paragraph: element, index });
13267
+ } else if (element instanceof Table) {
13268
+ this._events.emit('tableAdded', { table: element });
13269
+ }
13270
+ }
13271
+
13272
+ private _emitElementRemoved(element: BodyElement | undefined): void {
13273
+ if (!element) return;
13274
+ if (element instanceof Paragraph) {
13275
+ this._events.emit('paragraphRemoved', { paragraph: element });
13276
+ } else if (element instanceof Table) {
13277
+ this._events.emit('tableRemoved', { table: element });
13278
+ }
13279
+ }
13280
+
13281
+ // ============================================================================
13282
+ // Global defaults
13283
+ // ============================================================================
13284
+
13285
+ /**
13286
+ * Default font, size, and margins applied to paragraphs created via
13287
+ * `createParagraph()` after `Document.setDefaults(...)` is called.
13288
+ * These are runtime defaults — they do not modify document XML directly,
13289
+ * they pre-populate run formatting on newly created elements only.
13290
+ */
13291
+ private static globalDefaults: {
13292
+ font?: string;
13293
+ fontSize?: number;
13294
+ fontColor?: string;
13295
+ } = {};
13296
+
13297
+ /**
13298
+ * Set framework-wide defaults applied to every new paragraph created
13299
+ * via `Document.create()` + `createParagraph()`. Existing documents and
13300
+ * existing paragraphs are not retroactively modified. Pass an empty
13301
+ * object to clear.
13302
+ */
13303
+ static setDefaults(defaults: { font?: string; fontSize?: number; fontColor?: string }): void {
13304
+ Document.globalDefaults = { ...defaults };
13305
+ }
13306
+
13307
+ /** Returns the currently registered global defaults (read-only copy). */
13308
+ static getDefaults(): Readonly<{ font?: string; fontSize?: number; fontColor?: string }> {
13309
+ return { ...Document.globalDefaults };
13310
+ }
13311
+
13312
+ /** Reset all global defaults. */
13313
+ static resetDefaults(): void {
13314
+ Document.globalDefaults = {};
13315
+ }
13316
+
13317
+ /** Apply globalDefaults to runs already on a freshly-created paragraph. */
13318
+ private static applyGlobalDefaultsToParagraph(para: Paragraph): void {
13319
+ const d = Document.globalDefaults;
13320
+ if (!d.font && d.fontSize === undefined && !d.fontColor) return;
13321
+ for (const run of para.getRuns()) {
13322
+ const fmt = run.getFormatting();
13323
+ if (d.font && !fmt.font) run.setFont(d.font);
13324
+ if (d.fontSize !== undefined && fmt.size === undefined) run.setSize(d.fontSize);
13325
+ if (d.fontColor && !fmt.color) run.setColor(d.fontColor);
13326
+ }
13327
+ }
13328
+
13034
13329
  dispose(): void {
13035
13330
  // Clear all internal state to free memory
13036
13331
  // NOTE: Use clear() methods instead of creating new instances to properly free memory
13037
13332
 
13333
+ // Remove all event listeners to free closure references
13334
+ this._events.removeAllListeners();
13335
+
13038
13336
  // Clear body elements
13039
13337
  this.bodyElements = [];
13040
13338
 
@@ -15582,7 +15880,9 @@ export class Document {
15582
15880
  if (index >= 0 && index < this.bodyElements.length) {
15583
15881
  const element = this.bodyElements[index];
15584
15882
  if (element instanceof Paragraph) {
15585
- // When tracking enabled, wrap content in w:del instead of removing
15883
+ // When tracking enabled, wrap content in w:del instead of removing.
15884
+ // No paragraphRemoved event in this branch — the paragraph is still
15885
+ // structurally present, just marked deleted via revision.
15586
15886
  if (this.trackChangesEnabled && this.trackingContext.isEnabled()) {
15587
15887
  const runs = element.getRuns();
15588
15888
  if (runs.length > 0) {
@@ -15594,6 +15894,7 @@ export class Document {
15594
15894
  return true;
15595
15895
  }
15596
15896
  this.bodyElements.splice(index, 1);
15897
+ this._emitElementRemoved(element);
15597
15898
  return true;
15598
15899
  }
15599
15900
  }
@@ -15628,6 +15929,7 @@ export class Document {
15628
15929
  const element = this.bodyElements[index];
15629
15930
  if (element instanceof Table) {
15630
15931
  this.bodyElements.splice(index, 1);
15932
+ this._emitElementRemoved(element);
15631
15933
  return true;
15632
15934
  }
15633
15935
  }
@@ -15771,6 +16073,7 @@ export class Document {
15771
16073
 
15772
16074
  // Insert the paragraph
15773
16075
  this.bodyElements.splice(index, 0, paragraph);
16076
+ this._emitElementAdded(paragraph, index);
15774
16077
  return this;
15775
16078
  }
15776
16079
 
@@ -15795,6 +16098,7 @@ export class Document {
15795
16098
 
15796
16099
  // Insert the table
15797
16100
  this.bodyElements.splice(index, 0, table);
16101
+ this._emitElementAdded(table, index);
15798
16102
  return this;
15799
16103
  }
15800
16104
 
@@ -16002,7 +16306,8 @@ export class Document {
16002
16306
  */
16003
16307
  removeBodyElementAt(index: number): boolean {
16004
16308
  if (index >= 0 && index < this.bodyElements.length) {
16005
- this.bodyElements.splice(index, 1);
16309
+ const [removed] = this.bodyElements.splice(index, 1);
16310
+ this._emitElementRemoved(removed);
16006
16311
  return true;
16007
16312
  }
16008
16313
  return false;
@@ -16034,6 +16339,7 @@ export class Document {
16034
16339
  const index = this.bodyElements.indexOf(element);
16035
16340
  if (index === -1) return false;
16036
16341
  this.bodyElements.splice(index, 1);
16342
+ this._emitElementRemoved(element);
16037
16343
  return true;
16038
16344
  }
16039
16345
 
@@ -16065,6 +16371,7 @@ export class Document {
16065
16371
  const index = this.bodyElements.indexOf(reference);
16066
16372
  if (index === -1) return false;
16067
16373
  this.bodyElements.splice(index + 1, 0, element);
16374
+ this._emitElementAdded(element, index + 1);
16068
16375
  return true;
16069
16376
  }
16070
16377
 
@@ -16092,6 +16399,7 @@ export class Document {
16092
16399
  const index = this.bodyElements.indexOf(reference);
16093
16400
  if (index === -1) return false;
16094
16401
  this.bodyElements.splice(index, 0, element);
16402
+ this._emitElementAdded(element, index);
16095
16403
  return true;
16096
16404
  }
16097
16405
 
@@ -16121,6 +16429,8 @@ export class Document {
16121
16429
  const index = this.bodyElements.indexOf(oldElement);
16122
16430
  if (index === -1) return false;
16123
16431
  this.bodyElements[index] = newElement;
16432
+ this._emitElementRemoved(oldElement);
16433
+ this._emitElementAdded(newElement, index);
16124
16434
  return true;
16125
16435
  }
16126
16436
 
@@ -16138,6 +16448,7 @@ export class Document {
16138
16448
  insertBodyElementAt(index: number, element: BodyElement): void {
16139
16449
  const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));
16140
16450
  this.bodyElements.splice(clampedIndex, 0, element);
16451
+ this._emitElementAdded(element, clampedIndex);
16141
16452
  }
16142
16453
 
16143
16454
  /**