docxmlater 10.0.1 → 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 (395) hide show
  1. package/README.md +3 -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 +24 -19
  9. package/dist/core/Document.d.ts.map +1 -1
  10. package/dist/core/Document.js +272 -71
  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.d.ts.map +1 -1
  139. package/dist/helpers/CleanupHelper.js +1 -7
  140. package/dist/helpers/CleanupHelper.js.map +1 -1
  141. package/dist/images/ImageOptimizer.js.map +1 -1
  142. package/dist/index.js.map +1 -1
  143. package/dist/managers/DrawingManager.d.ts.map +1 -1
  144. package/dist/managers/DrawingManager.js.map +1 -1
  145. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  146. package/dist/tracking/TrackingContext.js.map +1 -1
  147. package/dist/types/compatibility-types.js.map +1 -1
  148. package/dist/types/formatting.js.map +1 -1
  149. package/dist/types/list-types.d.ts +4 -4
  150. package/dist/types/list-types.d.ts.map +1 -1
  151. package/dist/types/list-types.js.map +1 -1
  152. package/dist/types/settings-types.js.map +1 -1
  153. package/dist/types/styleConfig.js.map +1 -1
  154. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  155. package/dist/utils/ChangelogGenerator.js.map +1 -1
  156. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  157. package/dist/utils/CompatibilityUpgrader.js +7 -7
  158. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  159. package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
  160. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  161. package/dist/utils/MoveOperationHelper.js.map +1 -1
  162. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  163. package/dist/utils/RevisionWalker.js.map +1 -1
  164. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  165. package/dist/utils/ShadingResolver.js +1 -1
  166. package/dist/utils/ShadingResolver.js.map +1 -1
  167. package/dist/utils/acceptRevisions.d.ts +0 -28
  168. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  169. package/dist/utils/acceptRevisions.js +5 -7
  170. package/dist/utils/acceptRevisions.js.map +1 -1
  171. package/dist/utils/cnfStyleDecoder.js +1 -1
  172. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  173. package/dist/utils/corruptionDetection.js.map +1 -1
  174. package/dist/utils/dateFormatting.js.map +1 -1
  175. package/dist/utils/deepClone.d.ts +0 -1
  176. package/dist/utils/deepClone.d.ts.map +1 -1
  177. package/dist/utils/deepClone.js +0 -7
  178. package/dist/utils/deepClone.js.map +1 -1
  179. package/dist/utils/diagnostics.d.ts +2 -2
  180. package/dist/utils/diagnostics.d.ts.map +1 -1
  181. package/dist/utils/diagnostics.js.map +1 -1
  182. package/dist/utils/errorHandling.js.map +1 -1
  183. package/dist/utils/formatting.js.map +1 -1
  184. package/dist/utils/list-detection.d.ts +2 -2
  185. package/dist/utils/list-detection.d.ts.map +1 -1
  186. package/dist/utils/list-detection.js +3 -3
  187. package/dist/utils/list-detection.js.map +1 -1
  188. package/dist/utils/logger.d.ts +2 -4
  189. package/dist/utils/logger.d.ts.map +1 -1
  190. package/dist/utils/logger.js +0 -2
  191. package/dist/utils/logger.js.map +1 -1
  192. package/dist/utils/parsingHelpers.js.map +1 -1
  193. package/dist/utils/stripTrackedChanges.d.ts +0 -19
  194. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  195. package/dist/utils/stripTrackedChanges.js +0 -2
  196. package/dist/utils/stripTrackedChanges.js.map +1 -1
  197. package/dist/utils/textDiff.js.map +1 -1
  198. package/dist/utils/units.js.map +1 -1
  199. package/dist/utils/validation.d.ts.map +1 -1
  200. package/dist/utils/validation.js.map +1 -1
  201. package/dist/utils/xmlSanitization.js.map +1 -1
  202. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  203. package/dist/validation/RevisionValidator.js.map +1 -1
  204. package/dist/validation/ValidationRules.js.map +1 -1
  205. package/dist/validation/index.js.map +1 -1
  206. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  207. package/dist/xml/XMLBuilder.js +10 -0
  208. package/dist/xml/XMLBuilder.js.map +1 -1
  209. package/dist/xml/XMLParser.d.ts.map +1 -1
  210. package/dist/xml/XMLParser.js +4 -5
  211. package/dist/xml/XMLParser.js.map +1 -1
  212. package/dist/zip/ZipHandler.js.map +1 -1
  213. package/dist/zip/ZipReader.js.map +1 -1
  214. package/dist/zip/ZipWriter.js.map +1 -1
  215. package/dist/zip/errors.js.map +1 -1
  216. package/dist/zip/types.js.map +1 -1
  217. package/package.json +34 -4
  218. package/src/__tests__/helper-methods.test.ts +512 -0
  219. package/src/constants/legacyCompatFlags.ts +138 -0
  220. package/src/constants/limits.ts +50 -0
  221. package/src/core/CLAUDE.md +109 -0
  222. package/src/core/Document.ts +15569 -0
  223. package/src/core/DocumentContent.ts +467 -0
  224. package/src/core/DocumentGenerator.ts +1104 -0
  225. package/src/core/DocumentIdManager.ts +158 -0
  226. package/src/core/DocumentParser.ts +10107 -0
  227. package/src/core/DocumentValidator.ts +372 -0
  228. package/src/core/Relationship.ts +367 -0
  229. package/src/core/RelationshipManager.ts +428 -0
  230. package/src/elements/AlternateContent.ts +42 -0
  231. package/src/elements/Bookmark.ts +210 -0
  232. package/src/elements/BookmarkManager.ts +250 -0
  233. package/src/elements/CLAUDE.md +126 -0
  234. package/src/elements/Comment.ts +359 -0
  235. package/src/elements/CommentManager.ts +502 -0
  236. package/src/elements/CommonTypes.ts +549 -0
  237. package/src/elements/CustomXml.ts +36 -0
  238. package/src/elements/Endnote.ts +217 -0
  239. package/src/elements/EndnoteManager.ts +249 -0
  240. package/src/elements/Field.ts +1233 -0
  241. package/src/elements/FieldHelpers.ts +333 -0
  242. package/src/elements/FontManager.ts +339 -0
  243. package/src/elements/Footer.ts +269 -0
  244. package/src/elements/Footnote.ts +217 -0
  245. package/src/elements/FootnoteManager.ts +249 -0
  246. package/src/elements/Header.ts +269 -0
  247. package/src/elements/HeaderFooterManager.ts +219 -0
  248. package/src/elements/Hyperlink.ts +1146 -0
  249. package/src/elements/Image.ts +1756 -0
  250. package/src/elements/ImageManager.ts +432 -0
  251. package/src/elements/ImageRun.ts +59 -0
  252. package/src/elements/MathElement.ts +65 -0
  253. package/src/elements/Paragraph.ts +4227 -0
  254. package/src/elements/PreservedElement.ts +53 -0
  255. package/src/elements/PropertyChangeTypes.ts +442 -0
  256. package/src/elements/RangeMarker.ts +400 -0
  257. package/src/elements/Revision.ts +1217 -0
  258. package/src/elements/RevisionContent.ts +73 -0
  259. package/src/elements/RevisionManager.ts +1070 -0
  260. package/src/elements/Run.ts +3068 -0
  261. package/src/elements/Section.ts +1421 -0
  262. package/src/elements/Shape.ts +873 -0
  263. package/src/elements/StructuredDocumentTag.ts +978 -0
  264. package/src/elements/Table.ts +2524 -0
  265. package/src/elements/TableCell.ts +1586 -0
  266. package/src/elements/TableGridChange.ts +151 -0
  267. package/src/elements/TableOfContents.ts +691 -0
  268. package/src/elements/TableOfContentsElement.ts +89 -0
  269. package/src/elements/TableRow.ts +906 -0
  270. package/src/elements/TextBox.ts +768 -0
  271. package/src/formatting/AbstractNumbering.ts +548 -0
  272. package/src/formatting/CLAUDE.md +74 -0
  273. package/src/formatting/NumberingInstance.ts +212 -0
  274. package/src/formatting/NumberingLevel.ts +1006 -0
  275. package/src/formatting/NumberingManager.ts +827 -0
  276. package/src/formatting/Style.ts +1833 -0
  277. package/src/formatting/StylesManager.ts +1005 -0
  278. package/src/helpers/CleanupHelper.ts +524 -0
  279. package/src/images/ImageOptimizer.ts +274 -0
  280. package/src/index.ts +554 -0
  281. package/src/managers/CLAUDE.md +47 -0
  282. package/src/managers/DrawingManager.ts +319 -0
  283. package/src/tracking/DocumentTrackingContext.ts +643 -0
  284. package/src/tracking/TrackingContext.ts +173 -0
  285. package/src/types/compatibility-types.ts +49 -0
  286. package/src/types/formatting.ts +210 -0
  287. package/src/types/list-types.ts +152 -0
  288. package/src/types/settings-types.ts +59 -0
  289. package/src/types/styleConfig.ts +189 -0
  290. package/src/utils/CLAUDE.md +153 -0
  291. package/src/utils/ChangelogGenerator.ts +1581 -0
  292. package/src/utils/CompatibilityUpgrader.ts +237 -0
  293. package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
  294. package/src/utils/MoveOperationHelper.ts +238 -0
  295. package/src/utils/RevisionAwareProcessor.ts +526 -0
  296. package/src/utils/RevisionWalker.ts +457 -0
  297. package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
  298. package/src/utils/ShadingResolver.ts +107 -0
  299. package/src/utils/acceptRevisions.ts +714 -0
  300. package/src/utils/cnfStyleDecoder.ts +217 -0
  301. package/src/utils/corruptionDetection.ts +345 -0
  302. package/src/utils/dateFormatting.ts +20 -0
  303. package/src/utils/deepClone.ts +78 -0
  304. package/src/utils/diagnostics.ts +129 -0
  305. package/src/utils/errorHandling.ts +80 -0
  306. package/src/utils/formatting.ts +213 -0
  307. package/src/utils/list-detection.ts +274 -0
  308. package/src/utils/logger.ts +404 -0
  309. package/src/utils/parsingHelpers.ts +190 -0
  310. package/src/utils/stripTrackedChanges.ts +353 -0
  311. package/src/utils/textDiff.ts +100 -0
  312. package/src/utils/units.ts +421 -0
  313. package/src/utils/validation.ts +542 -0
  314. package/src/utils/xmlSanitization.ts +182 -0
  315. package/src/validation/RevisionAutoFixer.ts +542 -0
  316. package/src/validation/RevisionValidator.ts +460 -0
  317. package/src/validation/ValidationRules.ts +338 -0
  318. package/src/validation/index.ts +30 -0
  319. package/src/xml/CLAUDE.md +65 -0
  320. package/src/xml/XMLBuilder.ts +871 -0
  321. package/src/xml/XMLParser.ts +919 -0
  322. package/src/zip/CLAUDE.md +55 -0
  323. package/src/zip/ZipHandler.ts +637 -0
  324. package/src/zip/ZipReader.ts +299 -0
  325. package/src/zip/ZipWriter.ts +390 -0
  326. package/src/zip/errors.ts +69 -0
  327. package/src/zip/types.ts +116 -0
  328. package/dist/core/ListNormalizer.d.ts +0 -23
  329. package/dist/core/ListNormalizer.d.ts.map +0 -1
  330. package/dist/core/ListNormalizer.js +0 -624
  331. package/dist/core/ListNormalizer.js.map +0 -1
  332. package/dist/images/index.d.ts +0 -2
  333. package/dist/images/index.d.ts.map +0 -1
  334. package/dist/images/index.js +0 -8
  335. package/dist/images/index.js.map +0 -1
  336. package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
  337. package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
  338. package/dist/ms-doc/cfb/CFBReader.js +0 -360
  339. package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
  340. package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
  341. package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
  342. package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
  343. package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
  344. package/dist/ms-doc/fib/FIB.d.ts +0 -18
  345. package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
  346. package/dist/ms-doc/fib/FIB.js +0 -342
  347. package/dist/ms-doc/fib/FIB.js.map +0 -1
  348. package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
  349. package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
  350. package/dist/ms-doc/fields/FieldParser.js +0 -266
  351. package/dist/ms-doc/fields/FieldParser.js.map +0 -1
  352. package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
  353. package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
  354. package/dist/ms-doc/images/PictureExtractor.js +0 -233
  355. package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
  356. package/dist/ms-doc/index.d.ts +0 -20
  357. package/dist/ms-doc/index.d.ts.map +0 -1
  358. package/dist/ms-doc/index.js +0 -59
  359. package/dist/ms-doc/index.js.map +0 -1
  360. package/dist/ms-doc/properties/SPRM.d.ts +0 -210
  361. package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
  362. package/dist/ms-doc/properties/SPRM.js +0 -633
  363. package/dist/ms-doc/properties/SPRM.js.map +0 -1
  364. package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
  365. package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
  366. package/dist/ms-doc/sections/SectionParser.js +0 -214
  367. package/dist/ms-doc/sections/SectionParser.js.map +0 -1
  368. package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
  369. package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
  370. package/dist/ms-doc/styles/StyleSheet.js +0 -268
  371. package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
  372. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
  373. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
  374. package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
  375. package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
  376. package/dist/ms-doc/tables/TableParser.d.ts +0 -29
  377. package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
  378. package/dist/ms-doc/tables/TableParser.js +0 -176
  379. package/dist/ms-doc/tables/TableParser.js.map +0 -1
  380. package/dist/ms-doc/text/PieceTable.d.ts +0 -21
  381. package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
  382. package/dist/ms-doc/text/PieceTable.js +0 -171
  383. package/dist/ms-doc/text/PieceTable.js.map +0 -1
  384. package/dist/ms-doc/types/Constants.d.ts +0 -99
  385. package/dist/ms-doc/types/Constants.d.ts.map +0 -1
  386. package/dist/ms-doc/types/Constants.js +0 -102
  387. package/dist/ms-doc/types/Constants.js.map +0 -1
  388. package/dist/ms-doc/types/DocTypes.d.ts +0 -368
  389. package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
  390. package/dist/ms-doc/types/DocTypes.js +0 -3
  391. package/dist/ms-doc/types/DocTypes.js.map +0 -1
  392. package/dist/tracking/index.d.ts +0 -3
  393. package/dist/tracking/index.d.ts.map +0 -1
  394. package/dist/tracking/index.js +0 -6
  395. package/dist/tracking/index.js.map +0 -1
@@ -49,6 +49,8 @@ const RangeMarker_1 = require("../elements/RangeMarker");
49
49
  const Revision_1 = require("../elements/Revision");
50
50
  const RevisionManager_1 = require("../elements/RevisionManager");
51
51
  const Run_1 = require("../elements/Run");
52
+ const Shape_1 = require("../elements/Shape");
53
+ const TextBox_1 = require("../elements/TextBox");
52
54
  const validation_1 = require("../validation");
53
55
  const Section_1 = require("../elements/Section");
54
56
  const StructuredDocumentTag_1 = require("../elements/StructuredDocumentTag");
@@ -93,7 +95,7 @@ class Document {
93
95
  this.numberingManager = NumberingManager_1.NumberingManager.create();
94
96
  this.section = new Section_1.Section();
95
97
  this.imageManager = ImageManager_1.ImageManager.create();
96
- this.relationshipManager = RelationshipManager_1.RelationshipManager.createForDocument();
98
+ this.relationshipManager = initDefaults ? RelationshipManager_1.RelationshipManager.createForDocument() : RelationshipManager_1.RelationshipManager.create();
97
99
  this.headerFooterManager = HeaderFooterManager_1.HeaderFooterManager.create();
98
100
  this.bookmarkManager = BookmarkManager_1.BookmarkManager.create();
99
101
  this.revisionManager = RevisionManager_1.RevisionManager.create();
@@ -164,6 +166,7 @@ class Document {
164
166
  _originalCommentsXml;
165
167
  _commentsModified = false;
166
168
  _originalCommentCompanionFiles = new Map();
169
+ _removedParts = new Set();
167
170
  _appPropsModified = false;
168
171
  _footnotesModified = false;
169
172
  _endnotesModified = false;
@@ -308,11 +311,11 @@ class Document {
308
311
  return doc;
309
312
  }
310
313
  parseSettingsFromXml(settingsXml) {
311
- const trackRevisionsMatch = settingsXml.match(/<w:trackRevisions\b([^>]*)\/?>/);
314
+ const trackRevisionsMatch = /<w:trackRevisions\b([^>]*)\/?>/.exec(settingsXml);
312
315
  if (trackRevisionsMatch) {
313
316
  const attrs = trackRevisionsMatch[1] ?? '';
314
- const valMatch = attrs.match(/w:val\s*=\s*"([^"]*)"/);
315
- if (valMatch && valMatch[1] !== undefined) {
317
+ const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
318
+ if (valMatch?.[1] !== undefined) {
316
319
  const val = valMatch[1].toLowerCase();
317
320
  this.trackChangesEnabled = val !== 'false' && val !== '0' && val !== 'off';
318
321
  }
@@ -328,12 +331,12 @@ class Document {
328
331
  if (hasTrackFormatting) {
329
332
  this.trackFormatting = true;
330
333
  }
331
- const revisionViewMatch = settingsXml.match(/<w:revisionView\b([^>]*)\/?>/);
334
+ const revisionViewMatch = /<w:revisionView\b([^>]*)\/?>/.exec(settingsXml);
332
335
  if (revisionViewMatch) {
333
336
  const attrs = revisionViewMatch[1] || '';
334
- const insDelMatch = attrs.match(/w:insDel\s*=\s*"([^"]*)"/);
335
- const formattingMatch = attrs.match(/w:formatting\s*=\s*"([^"]*)"/);
336
- const inkMatch = attrs.match(/w:inkAnnotations\s*=\s*"([^"]*)"/);
337
+ const insDelMatch = /w:insDel\s*=\s*"([^"]*)"/.exec(attrs);
338
+ const formattingMatch = /w:formatting\s*=\s*"([^"]*)"/.exec(attrs);
339
+ const inkMatch = /w:inkAnnotations\s*=\s*"([^"]*)"/.exec(attrs);
337
340
  if (insDelMatch?.[1] !== undefined) {
338
341
  this.revisionViewSettings.showInsertionsAndDeletions = insDelMatch[1] !== '0';
339
342
  }
@@ -344,22 +347,22 @@ class Document {
344
347
  this.revisionViewSettings.showInkAnnotations = inkMatch[1] !== '0';
345
348
  }
346
349
  }
347
- const protMatch = settingsXml.match(/<w:documentProtection\b([^>]*)\/?>/);
350
+ const protMatch = /<w:documentProtection\b([^>]*)\/?>/.exec(settingsXml);
348
351
  if (protMatch) {
349
352
  const attrs = protMatch[1] || '';
350
- const editMatch = attrs.match(/w:edit\s*=\s*"([^"]*)"/);
351
- const enforcementMatch = attrs.match(/w:enforcement\s*=\s*"([^"]*)"/);
353
+ const editMatch = /w:edit\s*=\s*"([^"]*)"/.exec(attrs);
354
+ const enforcementMatch = /w:enforcement\s*=\s*"([^"]*)"/.exec(attrs);
352
355
  if (editMatch?.[1]) {
353
356
  const edit = editMatch[1];
354
357
  const enforcement = enforcementMatch?.[1] ? enforcementMatch[1] !== '0' : true;
355
358
  this.documentProtection = { edit, enforcement };
356
- const cryptProviderMatch = attrs.match(/w:cryptProviderType\s*=\s*"([^"]*)"/);
357
- const cryptAlgClassMatch = attrs.match(/w:cryptAlgorithmClass\s*=\s*"([^"]*)"/);
358
- const cryptAlgTypeMatch = attrs.match(/w:cryptAlgorithmType\s*=\s*"([^"]*)"/);
359
- const cryptAlgSidMatch = attrs.match(/w:cryptAlgorithmSid\s*=\s*"([^"]*)"/);
360
- const cryptSpinMatch = attrs.match(/w:cryptSpinCount\s*=\s*"([^"]*)"/);
361
- const hashMatch = attrs.match(/w:hash\s*=\s*"([^"]*)"/);
362
- const saltMatch = attrs.match(/w:salt\s*=\s*"([^"]*)"/);
359
+ const cryptProviderMatch = /w:cryptProviderType\s*=\s*"([^"]*)"/.exec(attrs);
360
+ const cryptAlgClassMatch = /w:cryptAlgorithmClass\s*=\s*"([^"]*)"/.exec(attrs);
361
+ const cryptAlgTypeMatch = /w:cryptAlgorithmType\s*=\s*"([^"]*)"/.exec(attrs);
362
+ const cryptAlgSidMatch = /w:cryptAlgorithmSid\s*=\s*"([^"]*)"/.exec(attrs);
363
+ const cryptSpinMatch = /w:cryptSpinCount\s*=\s*"([^"]*)"/.exec(attrs);
364
+ const hashMatch = /w:hash\s*=\s*"([^"]*)"/.exec(attrs);
365
+ const saltMatch = /w:salt\s*=\s*"([^"]*)"/.exec(attrs);
363
366
  if (cryptProviderMatch?.[1])
364
367
  this.documentProtection.cryptProviderType = cryptProviderMatch[1];
365
368
  if (cryptAlgClassMatch?.[1])
@@ -376,10 +379,10 @@ class Document {
376
379
  this.documentProtection.salt = saltMatch[1];
377
380
  }
378
381
  }
379
- const rsidsBlockMatch = settingsXml.match(/<w:rsids>([\s\S]*?)<\/w:rsids>/);
382
+ const rsidsBlockMatch = /<w:rsids>([\s\S]*?)<\/w:rsids>/.exec(settingsXml);
380
383
  if (rsidsBlockMatch?.[1]) {
381
384
  const rsidsBlock = rsidsBlockMatch[1];
382
- const rsidRootMatch = rsidsBlock.match(/<w:rsidRoot\s+w:val\s*=\s*"([^"]*)"\s*\/?>/);
385
+ const rsidRootMatch = /<w:rsidRoot\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(rsidsBlock);
383
386
  if (rsidRootMatch?.[1]) {
384
387
  this.rsidRoot = rsidRootMatch[1].toUpperCase();
385
388
  }
@@ -402,11 +405,11 @@ class Document {
402
405
  if (/<w:autoHyphenation\b[^>]*\/?>/.test(settingsXml)) {
403
406
  this._autoHyphenation = true;
404
407
  }
405
- const decimalMatch = settingsXml.match(/<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/);
408
+ const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
406
409
  if (decimalMatch?.[1]) {
407
410
  this._decimalSymbol = decimalMatch[1];
408
411
  }
409
- const listSepMatch = settingsXml.match(/<w:listSeparator\s+w:val\s*=\s*"([^"]*)"\s*\/?>/);
412
+ const listSepMatch = /<w:listSeparator\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
410
413
  if (listSepMatch?.[1]) {
411
414
  this._listSeparator = listSepMatch[1];
412
415
  }
@@ -416,16 +419,16 @@ class Document {
416
419
  const compatSettings = [];
417
420
  const legacyFlags = [];
418
421
  let mode = compatibility_types_1.CompatibilityMode.Word2007;
419
- const compatBlockMatch = settingsXml.match(/<w:compat>([\s\S]*?)<\/w:compat>/);
422
+ const compatBlockMatch = /<w:compat>([\s\S]*?)<\/w:compat>/.exec(settingsXml);
420
423
  if (compatBlockMatch?.[1]) {
421
424
  const compatBlock = compatBlockMatch[1];
422
425
  const settingRegex = /<w:compatSetting\s+([^>]*)\/?\s*>/g;
423
426
  let settingMatch;
424
427
  while ((settingMatch = settingRegex.exec(compatBlock)) !== null) {
425
428
  const attrs = settingMatch[1] ?? '';
426
- const nameMatch = attrs.match(/w:name\s*=\s*"([^"]*)"/);
427
- const uriMatch = attrs.match(/w:uri\s*=\s*"([^"]*)"/);
428
- const valMatch = attrs.match(/w:val\s*=\s*"([^"]*)"/);
429
+ const nameMatch = /w:name\s*=\s*"([^"]*)"/.exec(attrs);
430
+ const uriMatch = /w:uri\s*=\s*"([^"]*)"/.exec(attrs);
431
+ const valMatch = /w:val\s*=\s*"([^"]*)"/.exec(attrs);
429
432
  if (nameMatch?.[1] && uriMatch?.[1] && valMatch?.[1]) {
430
433
  const setting = {
431
434
  name: nameMatch[1],
@@ -795,7 +798,7 @@ class Document {
795
798
  return { ...this.properties };
796
799
  }
797
800
  setProperty(key, value) {
798
- this.properties[key] = value;
801
+ (this.properties[key]) = value;
799
802
  return this;
800
803
  }
801
804
  setTitle(title) {
@@ -895,6 +898,7 @@ class Document {
895
898
  }
896
899
  this.validateNumberingReferences();
897
900
  this.validateBookmarkPairs();
901
+ this.assignUniqueIds();
898
902
  if (this.skipDocumentXmlRegeneration) {
899
903
  this.logger.warn('skipDocumentXmlRegeneration is set: in-memory content modifications will NOT be saved. ' +
900
904
  'Use acceptAllRevisions() instead of acceptAllRevisionsRawXml() if you need to modify the document after accepting revisions.');
@@ -1025,7 +1029,7 @@ class Document {
1025
1029
  if (runEnd === -1)
1026
1030
  continue;
1027
1031
  const runContent = xml.substring(runStart, runEnd);
1028
- const fldCharMatch = runContent.match(/<w:fldChar\s+w:fldCharType\s*=\s*"(begin|separate|end)"/);
1032
+ const fldCharMatch = /<w:fldChar\s+w:fldCharType\s*=\s*"(begin|separate|end)"/.exec(runContent);
1029
1033
  if (fldCharMatch) {
1030
1034
  fieldTokens.push({
1031
1035
  type: fldCharMatch[1],
@@ -1033,7 +1037,7 @@ class Document {
1033
1037
  runEnd,
1034
1038
  });
1035
1039
  }
1036
- const instrMatch = runContent.match(/<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/);
1040
+ const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(runContent);
1037
1041
  if (instrMatch) {
1038
1042
  instrTokens.push({
1039
1043
  text: instrMatch[1].trim(),
@@ -1179,7 +1183,7 @@ class Document {
1179
1183
  protectedBlocks.push(block);
1180
1184
  return `\x00PROTECTED_${protectedBlocks.length - 1}\x00`;
1181
1185
  });
1182
- const styleMatch = safeInner.match(/<w:pStyle\s+w:val="([^"]+)"/);
1186
+ const styleMatch = /<w:pStyle\s+w:val="([^"]+)"/.exec(safeInner);
1183
1187
  if (styleMatch && styleSet.has(styleMatch[1])) {
1184
1188
  let cleaned = safeInner.replace(/<w:spacing\b[^/]*\/>\s*/g, '');
1185
1189
  if (cleaned !== safeInner) {
@@ -1234,10 +1238,14 @@ class Document {
1234
1238
  }
1235
1239
  }
1236
1240
  updateCoreProps() {
1241
+ if (this._removedParts.has(types_1.DOCX_PATHS.CORE_PROPS) || this._removedParts.has('docProps/core.xml'))
1242
+ return;
1237
1243
  const xml = this.generator.generateCoreProps(this.properties);
1238
1244
  this.zipHandler.updateFile(types_1.DOCX_PATHS.CORE_PROPS, xml);
1239
1245
  }
1240
1246
  updateAppProps() {
1247
+ if (this._removedParts.has(types_1.DOCX_PATHS.APP_PROPS) || this._removedParts.has('docProps/app.xml'))
1248
+ return;
1241
1249
  if (this._originalAppPropsXml && !this._appPropsModified) {
1242
1250
  return;
1243
1251
  }
@@ -1292,11 +1300,11 @@ class Document {
1292
1300
  this._webSettings.doNotSaveAsSingleFile = /<w:doNotSaveAsSingleFile\b/.test(xml);
1293
1301
  this._webSettings.doNotOrganizeInFolder = /<w:doNotOrganizeInFolder\b/.test(xml);
1294
1302
  this._webSettings.doNotUseLongFileNames = /<w:doNotUseLongFileNames\b/.test(xml);
1295
- const pixelsMatch = xml.match(/<w:pixelsPerInch\b[^>]*w:val\s*=\s*"(\d+)"/);
1303
+ const pixelsMatch = /<w:pixelsPerInch\b[^>]*w:val\s*=\s*"(\d+)"/.exec(xml);
1296
1304
  this._webSettings.pixelsPerInch = pixelsMatch?.[1] ? parseInt(pixelsMatch[1], 10) : undefined;
1297
- const screenMatch = xml.match(/<w:targetScreenSz\b[^>]*w:val\s*=\s*"([^"]*)"/);
1305
+ const screenMatch = /<w:targetScreenSz\b[^>]*w:val\s*=\s*"([^"]*)"/.exec(xml);
1298
1306
  this._webSettings.targetScreenSz = screenMatch?.[1] ?? undefined;
1299
- const encodingMatch = xml.match(/<w:encoding\b[^>]*w:val\s*=\s*"([^"]*)"/);
1307
+ const encodingMatch = /<w:encoding\b[^>]*w:val\s*=\s*"([^"]*)"/.exec(xml);
1300
1308
  this._webSettings.encoding = encodingMatch?.[1] ?? undefined;
1301
1309
  }
1302
1310
  updateWebSettingsXml() {
@@ -1429,7 +1437,7 @@ class Document {
1429
1437
  if (!relsXml)
1430
1438
  return;
1431
1439
  const usedRIds = new Set();
1432
- const rIdPattern = /r:(?:embed|link)="(rId\d+)"/g;
1440
+ const rIdPattern = /r:(?:embed|link|id)="(rId\d+)"/g;
1433
1441
  let match;
1434
1442
  while ((match = rIdPattern.exec(mergedXml)) !== null) {
1435
1443
  if (match[1])
@@ -1660,7 +1668,7 @@ class Document {
1660
1668
  rsidsXml += `\n <w:rsid w:val="${esc(rsid)}"/>`;
1661
1669
  }
1662
1670
  rsidsXml += '\n </w:rsids>';
1663
- if (/<\/w:compat>/.test(xml)) {
1671
+ if (xml.includes('</w:compat>')) {
1664
1672
  xml = xml.replace(/<\/w:compat>/, '</w:compat>' + rsidsXml);
1665
1673
  }
1666
1674
  else if (/<m:mathPr\b/.test(xml)) {
@@ -2450,6 +2458,50 @@ class Document {
2450
2458
  }
2451
2459
  return repairs;
2452
2460
  }
2461
+ assignUniqueIds() {
2462
+ const existingRevisions = this.revisionManager.getAllRevisions();
2463
+ let maxRevId = 0;
2464
+ for (const rev of existingRevisions) {
2465
+ if (rev.getId() > maxRevId)
2466
+ maxRevId = rev.getId();
2467
+ }
2468
+ const registeredSet = new Set(existingRevisions);
2469
+ let docPrId = 1;
2470
+ const processParagraph = (para) => {
2471
+ for (const rev of para.getRevisions()) {
2472
+ if (!registeredSet.has(rev)) {
2473
+ maxRevId++;
2474
+ rev.setId(maxRevId);
2475
+ registeredSet.add(rev);
2476
+ }
2477
+ }
2478
+ for (const item of para.getContent()) {
2479
+ if (item instanceof Shape_1.Shape) {
2480
+ item.setDocPrId(docPrId++);
2481
+ }
2482
+ else if (item instanceof TextBox_1.TextBox) {
2483
+ item.setDocPrId(docPrId++);
2484
+ }
2485
+ else if (item instanceof ImageRun_1.ImageRun) {
2486
+ item.getImageElement().setDocPrId(docPrId++);
2487
+ }
2488
+ }
2489
+ };
2490
+ for (const element of this.bodyElements) {
2491
+ if (element instanceof Paragraph_1.Paragraph) {
2492
+ processParagraph(element);
2493
+ }
2494
+ else if (element instanceof Table_1.Table) {
2495
+ for (const row of element.getRows()) {
2496
+ for (const cell of row.getCells()) {
2497
+ for (const para of cell.getParagraphs()) {
2498
+ processParagraph(para);
2499
+ }
2500
+ }
2501
+ }
2502
+ }
2503
+ }
2504
+ }
2453
2505
  getLastParagraph() {
2454
2506
  for (let i = this.bodyElements.length - 1; i >= 0; i--) {
2455
2507
  const element = this.bodyElements[i];
@@ -2559,8 +2611,7 @@ class Document {
2559
2611
  const nextElement = this.bodyElements[i + 1];
2560
2612
  const isListEnd = !nextElement ||
2561
2613
  !(nextElement instanceof Paragraph_1.Paragraph) ||
2562
- !nextElement.getNumbering() ||
2563
- nextElement.getNumbering().numId !== numbering.numId;
2614
+ nextElement.getNumbering()?.numId !== numbering.numId;
2564
2615
  if (isListEnd) {
2565
2616
  const alreadyHasBlank = nextElement instanceof Paragraph_1.Paragraph &&
2566
2617
  nextElement.getText().trim() === '' &&
@@ -2587,7 +2638,7 @@ class Document {
2587
2638
  totalCount++;
2588
2639
  }
2589
2640
  const allFiles = this.zipHandler.getFilePaths();
2590
- const headerFooterFiles = allFiles.filter((path) => path.match(/^word\/(header|footer)\d+\.xml$/i));
2641
+ const headerFooterFiles = allFiles.filter((path) => /^word\/(header|footer)\d+\.xml$/i.exec(path));
2591
2642
  for (const filePath of headerFooterFiles) {
2592
2643
  this.zipHandler.removeFile(filePath);
2593
2644
  }
@@ -2671,7 +2722,7 @@ class Document {
2671
2722
  if (!abstractNum)
2672
2723
  continue;
2673
2724
  const level0 = abstractNum.getLevel(0);
2674
- if (!level0 || level0.getFormat() !== "bullet")
2725
+ if (level0?.getFormat() !== "bullet")
2675
2726
  continue;
2676
2727
  for (let levelIndex = 0; levelIndex < 9; levelIndex++) {
2677
2728
  const numLevel = abstractNum.getLevel(levelIndex);
@@ -3688,7 +3739,7 @@ class Document {
3688
3739
  if (!abstractNum)
3689
3740
  continue;
3690
3741
  const level0 = abstractNum.getLevel(0);
3691
- if (!level0 || level0.getFormat() !== "bullet")
3742
+ if (level0?.getFormat() !== "bullet")
3692
3743
  continue;
3693
3744
  for (let levelIndex = 0; levelIndex < 9; levelIndex++) {
3694
3745
  const numLevel = abstractNum.getLevel(levelIndex);
@@ -3969,7 +4020,7 @@ class Document {
3969
4020
  let hasOutlineSwitch = false;
3970
4021
  let hasTableSwitch = false;
3971
4022
  const normalizedText = instrText.trim().replace(/&quot;/g, '"');
3972
- const outlineMatch = normalizedText.match(/\\o\s+(?:"(\d+)-(\d+)"|'(\d+)-(\d+)'|(\d+)-(\d+))/);
4023
+ const outlineMatch = /\\o\s+(?:"(\d+)-(\d+)"|'(\d+)-(\d+)'|(\d+)-(\d+))/.exec(normalizedText);
3973
4024
  if (outlineMatch) {
3974
4025
  const start = parseInt(outlineMatch[1] || outlineMatch[3] || outlineMatch[5], 10);
3975
4026
  const end = parseInt(outlineMatch[2] || outlineMatch[4] || outlineMatch[6], 10);
@@ -3995,7 +4046,7 @@ class Document {
3995
4046
  const content = (match[1] || "").trim();
3996
4047
  if (!content)
3997
4048
  continue;
3998
- const rangeMatch = content.match(/^(\d+)-(\d+)$/);
4049
+ const rangeMatch = /^(\d+)-(\d+)$/.exec(content);
3999
4050
  if (rangeMatch?.[1] && rangeMatch?.[2]) {
4000
4051
  const start = parseInt(rangeMatch[1], 10);
4001
4052
  const end = parseInt(rangeMatch[2], 10);
@@ -4041,9 +4092,9 @@ class Document {
4041
4092
  const instrRegex = /<w:instrText[^>]*>([^<]*TOC[^<]*)<\/w:instrText>/g;
4042
4093
  const instrMatches = Array.from(modifiedXml.matchAll(instrRegex));
4043
4094
  for (const match of instrMatches) {
4044
- if (!match || !match[1])
4095
+ if (!match?.[1])
4045
4096
  continue;
4046
- let fieldInstruction = match[1]
4097
+ const fieldInstruction = match[1]
4047
4098
  .replace(/&amp;/g, "&")
4048
4099
  .replace(/&lt;/g, "<")
4049
4100
  .replace(/&gt;/g, ">")
@@ -4079,11 +4130,11 @@ class Document {
4079
4130
  }
4080
4131
  }
4081
4132
  syncTOCInstructionInXml(xml) {
4082
- const instrMatch = xml.match(/<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/);
4133
+ const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(xml);
4083
4134
  if (!instrMatch?.[1]) {
4084
4135
  return { xml, changed: false };
4085
4136
  }
4086
- let fieldInstruction = instrMatch[1]
4137
+ const fieldInstruction = instrMatch[1]
4087
4138
  .replace(/&amp;/g, "&")
4088
4139
  .replace(/&lt;/g, "<")
4089
4140
  .replace(/&gt;/g, ">")
@@ -4149,8 +4200,8 @@ class Document {
4149
4200
  return updatedInstruction;
4150
4201
  }
4151
4202
  resolveStyleNameForTOC(tocStyleName) {
4152
- const headingLevelMatch = tocStyleName.match(/^Heading\s*(\d+)$/i);
4153
- if (headingLevelMatch && headingLevelMatch[1]) {
4203
+ const headingLevelMatch = /^Heading\s*(\d+)$/i.exec(tocStyleName);
4204
+ if (headingLevelMatch?.[1]) {
4154
4205
  const level = parseInt(headingLevelMatch[1]);
4155
4206
  const usedStyles = this.findHeadingStylesUsedByParagraphs();
4156
4207
  const actualStyleName = usedStyles.get(level);
@@ -4231,7 +4282,7 @@ class Document {
4231
4282
  }
4232
4283
  const extractHeading = (para) => {
4233
4284
  const pPr = para["w:pPr"];
4234
- if (!pPr || !pPr["w:pStyle"]) {
4285
+ if (!pPr?.["w:pStyle"]) {
4235
4286
  return;
4236
4287
  }
4237
4288
  const styleVal = pPr["w:pStyle"]["@_w:val"];
@@ -4239,7 +4290,7 @@ class Document {
4239
4290
  return;
4240
4291
  }
4241
4292
  const headingMatch = styleVal.match(/^Heading(\d+)$/i);
4242
- if (!headingMatch || !headingMatch[1]) {
4293
+ if (!headingMatch?.[1]) {
4243
4294
  return;
4244
4295
  }
4245
4296
  const headingLevel = parseInt(headingMatch[1], 10);
@@ -4346,8 +4397,8 @@ class Document {
4346
4397
  const para = element;
4347
4398
  const formatting = para.getFormatting();
4348
4399
  if (formatting.style) {
4349
- const styleMatch = formatting.style.match(/Heading\s*(\d+)/i);
4350
- if (styleMatch && styleMatch[1]) {
4400
+ const styleMatch = /Heading\s*(\d+)/i.exec(formatting.style);
4401
+ if (styleMatch?.[1]) {
4351
4402
  const headingLevel = parseInt(styleMatch[1], 10);
4352
4403
  if (levelSet.has(headingLevel)) {
4353
4404
  const text = para.getText().trim();
@@ -4476,10 +4527,10 @@ class Document {
4476
4527
  for (const match of sdtMatches) {
4477
4528
  try {
4478
4529
  const tocXml = match[0];
4479
- const instrMatch = tocXml.match(/<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/);
4530
+ const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(tocXml);
4480
4531
  if (!instrMatch?.[1])
4481
4532
  continue;
4482
- let fieldInstruction = instrMatch[1]
4533
+ const fieldInstruction = instrMatch[1]
4483
4534
  .replace(/&amp;/g, "&")
4484
4535
  .replace(/&lt;/g, "<")
4485
4536
  .replace(/&gt;/g, ">")
@@ -4509,7 +4560,7 @@ class Document {
4509
4560
  const instrText = match[1];
4510
4561
  if (!instrText)
4511
4562
  continue;
4512
- let fieldInstruction = instrText
4563
+ const fieldInstruction = instrText
4513
4564
  .replace(/&amp;/g, "&")
4514
4565
  .replace(/&lt;/g, "<")
4515
4566
  .replace(/&gt;/g, ">")
@@ -4740,6 +4791,8 @@ class Document {
4740
4791
  const xml = entry.header.toXML();
4741
4792
  const path = `word/${entry.filename}`;
4742
4793
  this.zipHandler.addFile(path, xml);
4794
+ const paragraphs = this.extractParagraphsFromElements(entry.header.getElements());
4795
+ this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);
4743
4796
  }
4744
4797
  }
4745
4798
  saveFooters() {
@@ -4748,6 +4801,8 @@ class Document {
4748
4801
  const xml = entry.footer.toXML();
4749
4802
  const path = `word/${entry.filename}`;
4750
4803
  this.zipHandler.addFile(path, xml);
4804
+ const paragraphs = this.extractParagraphsFromElements(entry.footer.getElements());
4805
+ this.generatePartLevelHyperlinkRels(paragraphs, `word/_rels/${entry.filename}.rels`);
4751
4806
  }
4752
4807
  }
4753
4808
  updateRelationships() {
@@ -4812,6 +4867,7 @@ class Document {
4812
4867
  if (existingRels.length === 0) {
4813
4868
  this.relationshipManager.addFootnotes();
4814
4869
  }
4870
+ this.generatePartLevelHyperlinkRels(this.footnoteManager.getAllFootnotes().flatMap(fn => fn.getParagraphs()), 'word/_rels/footnotes.xml.rels');
4815
4871
  }
4816
4872
  else if (this._originalFootnotesXml) {
4817
4873
  this.zipHandler.addFile(types_1.DOCX_PATHS.FOOTNOTES, this._originalFootnotesXml);
@@ -4829,6 +4885,7 @@ class Document {
4829
4885
  if (existingRels.length === 0) {
4830
4886
  this.relationshipManager.addEndnotes();
4831
4887
  }
4888
+ this.generatePartLevelHyperlinkRels(this.endnoteManager.getAllEndnotes().flatMap(en => en.getParagraphs()), 'word/_rels/endnotes.xml.rels');
4832
4889
  }
4833
4890
  else if (this._originalEndnotesXml) {
4834
4891
  this.zipHandler.addFile(types_1.DOCX_PATHS.ENDNOTES, this._originalEndnotesXml);
@@ -4838,6 +4895,61 @@ class Document {
4838
4895
  }
4839
4896
  }
4840
4897
  }
4898
+ extractParagraphsFromElements(elements) {
4899
+ const result = [];
4900
+ for (const el of elements) {
4901
+ if (el instanceof Paragraph_1.Paragraph) {
4902
+ result.push(el);
4903
+ }
4904
+ else if (el instanceof Table_1.Table) {
4905
+ for (const row of el.getRows()) {
4906
+ for (const cell of row.getCells()) {
4907
+ result.push(...cell.getParagraphs());
4908
+ }
4909
+ }
4910
+ }
4911
+ }
4912
+ return result;
4913
+ }
4914
+ generatePartLevelHyperlinkRels(paragraphs, relsPath) {
4915
+ const hyperlinkRels = [];
4916
+ for (const para of paragraphs) {
4917
+ for (const item of para.getContent()) {
4918
+ if (item instanceof Hyperlink_1.Hyperlink && item.isExternal()) {
4919
+ const relId = item.getRelationshipId();
4920
+ const url = item.getUrl();
4921
+ if (relId && url) {
4922
+ hyperlinkRels.push({ id: relId, url });
4923
+ }
4924
+ }
4925
+ if (item instanceof Revision_1.Revision) {
4926
+ for (const revContent of item.getContent()) {
4927
+ if (revContent instanceof Hyperlink_1.Hyperlink && revContent.isExternal()) {
4928
+ const relId = revContent.getRelationshipId();
4929
+ const url = revContent.getUrl();
4930
+ if (relId && url) {
4931
+ hyperlinkRels.push({ id: relId, url });
4932
+ }
4933
+ }
4934
+ }
4935
+ }
4936
+ }
4937
+ }
4938
+ if (hyperlinkRels.length > 0) {
4939
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
4940
+ xml += '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n';
4941
+ for (const rel of hyperlinkRels) {
4942
+ const escapedId = XMLBuilder_1.XMLBuilder.escapeXmlAttribute(rel.id);
4943
+ const escapedUrl = XMLBuilder_1.XMLBuilder.escapeXmlAttribute(rel.url);
4944
+ xml += ` <Relationship Id="${escapedId}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="${escapedUrl}" TargetMode="External"/>\n`;
4945
+ }
4946
+ xml += '</Relationships>';
4947
+ this.zipHandler.addFile(relsPath, xml);
4948
+ for (const rel of hyperlinkRels) {
4949
+ this.relationshipManager.removeRelationship(rel.id);
4950
+ }
4951
+ }
4952
+ }
4841
4953
  updatePeopleXml() {
4842
4954
  const authors = new Set();
4843
4955
  for (const para of this.getAllParagraphs()) {
@@ -5814,7 +5926,29 @@ class Document {
5814
5926
  this.zipHandler.addFile(partName, content, { binary: isBinary });
5815
5927
  }
5816
5928
  async removePart(partName) {
5817
- return this.zipHandler.removeFile(partName);
5929
+ const removed = this.zipHandler.removeFile(partName);
5930
+ if (removed) {
5931
+ if (this._originalContentTypes?.overrides) {
5932
+ const partKey = partName.startsWith('/') ? partName : `/${partName}`;
5933
+ for (const entry of this._originalContentTypes.overrides) {
5934
+ if (entry.startsWith(`${partKey}|`)) {
5935
+ this._originalContentTypes.overrides.delete(entry);
5936
+ break;
5937
+ }
5938
+ }
5939
+ }
5940
+ const relsXml = this.zipHandler.getFileAsString("_rels/.rels");
5941
+ if (relsXml) {
5942
+ const target = partName.replace(/^\//, '');
5943
+ const relPattern = new RegExp(`\\s*<Relationship[^>]*Target="${target.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"[^>]*/?>`, 'g');
5944
+ const cleaned = relsXml.replace(relPattern, '');
5945
+ if (cleaned !== relsXml) {
5946
+ this.zipHandler.updateFile("_rels/.rels", cleaned);
5947
+ }
5948
+ }
5949
+ this._removedParts.add(partName);
5950
+ }
5951
+ return removed;
5818
5952
  }
5819
5953
  async listParts() {
5820
5954
  return this.zipHandler.getFilePaths();
@@ -5870,7 +6004,7 @@ class Document {
5870
6004
  try {
5871
6005
  const parts = await this.listParts();
5872
6006
  for (const partName of parts) {
5873
- if (partName.match(/\.(png|jpg|jpeg|gif|woff|woff2|ttf|otf|bin)$/i)) {
6007
+ if (/\.(png|jpg|jpeg|gif|woff|woff2|ttf|otf|bin)$/i.exec(partName)) {
5874
6008
  continue;
5875
6009
  }
5876
6010
  const xml = await this.getRawXml(partName);
@@ -6143,7 +6277,7 @@ class Document {
6143
6277
  for (const paragraph of this.getAllParagraphs()) {
6144
6278
  for (const run of paragraph.getRuns()) {
6145
6279
  const formatting = run.getFormatting();
6146
- if (formatting.font && formatting.font.toLowerCase() === lowerFontName) {
6280
+ if (formatting.font?.toLowerCase() === lowerFontName) {
6147
6281
  results.push(run);
6148
6282
  }
6149
6283
  }
@@ -6533,7 +6667,7 @@ class Document {
6533
6667
  throw new Error("insertTableAt: table must have at least one row");
6534
6668
  }
6535
6669
  const firstRow = rows[0];
6536
- if (firstRow && firstRow.getCells().length === 0) {
6670
+ if (firstRow?.getCells().length === 0) {
6537
6671
  throw new Error("insertTableAt: table rows must have at least one cell");
6538
6672
  }
6539
6673
  const tableStyle = table.getFormatting().style;
@@ -6693,6 +6827,80 @@ class Document {
6693
6827
  }
6694
6828
  return hyperlinks;
6695
6829
  }
6830
+ collectAllReferencedHyperlinkIds() {
6831
+ const ids = new Set();
6832
+ const scanParagraph = (para) => {
6833
+ for (const item of para.getContent()) {
6834
+ if (item instanceof Hyperlink_1.Hyperlink) {
6835
+ const relId = item.getRelationshipId();
6836
+ if (relId)
6837
+ ids.add(relId);
6838
+ }
6839
+ if (item instanceof Revision_1.Revision) {
6840
+ for (const revContent of item.getContent()) {
6841
+ if (revContent instanceof Hyperlink_1.Hyperlink) {
6842
+ const relId = revContent.getRelationshipId();
6843
+ if (relId)
6844
+ ids.add(relId);
6845
+ }
6846
+ }
6847
+ }
6848
+ }
6849
+ };
6850
+ const scanElement = (element) => {
6851
+ if (element instanceof Paragraph_1.Paragraph) {
6852
+ scanParagraph(element);
6853
+ }
6854
+ else if (element instanceof Table_1.Table) {
6855
+ for (let row = 0; row < element.getRowCount(); row++) {
6856
+ for (let col = 0; col < element.getColumnCount(); col++) {
6857
+ const cell = element.getCell(row, col);
6858
+ if (cell) {
6859
+ for (const para of cell.getParagraphs()) {
6860
+ scanParagraph(para);
6861
+ }
6862
+ for (const nested of cell.getRawNestedContent()) {
6863
+ const rIdPattern = /r:id="(rId\d+)"/g;
6864
+ let rIdMatch;
6865
+ while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {
6866
+ ids.add(rIdMatch[1]);
6867
+ }
6868
+ }
6869
+ }
6870
+ }
6871
+ }
6872
+ }
6873
+ else if (element instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
6874
+ for (const item of element.getContent()) {
6875
+ scanElement(item);
6876
+ }
6877
+ }
6878
+ };
6879
+ for (const element of this.bodyElements) {
6880
+ scanElement(element);
6881
+ }
6882
+ for (const header of this.headerFooterManager.getAllHeaders()) {
6883
+ for (const el of header.header.getElements()) {
6884
+ scanElement(el);
6885
+ }
6886
+ }
6887
+ for (const footer of this.headerFooterManager.getAllFooters()) {
6888
+ for (const el of footer.footer.getElements()) {
6889
+ scanElement(el);
6890
+ }
6891
+ }
6892
+ for (const fn of this.footnoteManager.getAllFootnotes()) {
6893
+ for (const para of fn.getParagraphs()) {
6894
+ scanParagraph(para);
6895
+ }
6896
+ }
6897
+ for (const en of this.endnoteManager.getAllEndnotes()) {
6898
+ for (const para of en.getParagraphs()) {
6899
+ scanParagraph(para);
6900
+ }
6901
+ }
6902
+ return ids;
6903
+ }
6696
6904
  defragmentHyperlinks(options) {
6697
6905
  const { resetFormatting = false, cleanupRelationships = false } = options || {};
6698
6906
  if (this.trackChangesEnabled) {
@@ -6726,14 +6934,7 @@ class Document {
6726
6934
  }
6727
6935
  }
6728
6936
  if (cleanupRelationships && mergedCount > 0) {
6729
- const referencedIds = new Set();
6730
- const allHyperlinks = this.getHyperlinks();
6731
- for (const { hyperlink } of allHyperlinks) {
6732
- const relId = hyperlink.getRelationshipId();
6733
- if (relId) {
6734
- referencedIds.add(relId);
6735
- }
6736
- }
6937
+ const referencedIds = this.collectAllReferencedHyperlinkIds();
6737
6938
  const removedCount = this.relationshipManager.removeOrphanedHyperlinks(referencedIds);
6738
6939
  if (removedCount > 0) {
6739
6940
  logger_1.defaultLogger.info(`Cleaned up ${removedCount} orphaned hyperlink relationship(s)`);
@@ -6845,7 +7046,7 @@ class Document {
6845
7046
  if (!path.endsWith('.rels') || path === 'word/_rels/document.xml.rels')
6846
7047
  continue;
6847
7048
  const content = this.zipHandler.getFileAsString(path);
6848
- if (content && content.includes(oldTarget)) {
7049
+ if (content?.includes(oldTarget)) {
6849
7050
  const updated = content.replace(new RegExp(escapedOldTarget, 'g'), newTarget);
6850
7051
  this.zipHandler.updateFile(path, updated);
6851
7052
  }
@@ -7072,7 +7273,7 @@ class Document {
7072
7273
  const results = [];
7073
7274
  this.clearCustom();
7074
7275
  this.addTopBookmark();
7075
- let docXml = this.zipHandler.getFileAsString('word/document.xml');
7276
+ const docXml = this.zipHandler.getFileAsString('word/document.xml');
7076
7277
  if (!docXml) {
7077
7278
  return results;
7078
7279
  }
@@ -7084,12 +7285,12 @@ class Document {
7084
7285
  for (const match of tocMatches) {
7085
7286
  try {
7086
7287
  const tocXml = match[0];
7087
- const instrMatch = tocXml.match(/<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/);
7288
+ const instrMatch = /<w:instrText[^>]*>([\s\S]*?)<\/w:instrText>/.exec(tocXml);
7088
7289
  if (!instrMatch?.[1]) {
7089
7290
  continue;
7090
7291
  }
7091
7292
  const instrText = instrMatch[1];
7092
- let fieldInstruction = instrText
7293
+ const fieldInstruction = instrText
7093
7294
  .replace(/&/g, '&')
7094
7295
  .replace(/</g, '<')
7095
7296
  .replace(/>/g, '>')