docxmlater 10.4.1 → 11.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +74 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +605 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2056 -1073
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +461 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2180 -617
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -0,0 +1,199 @@
1
+ import JSZip from 'jszip';
2
+ import { promises as fs } from 'fs';
3
+ import { FileOperationError } from './errors.js';
4
+ import { validateDocxStructure, normalizePath } from '../utils/validation.js';
5
+ export class ZipWriter {
6
+ zip;
7
+ files = new Map();
8
+ constructor() {
9
+ this.zip = new JSZip();
10
+ }
11
+ validatePathSecurity(path) {
12
+ if (path.includes('..')) {
13
+ throw new Error(`Security error: Path "${path}" contains path traversal sequence "..". ` +
14
+ `This could be an attempt to write files outside the archive.`);
15
+ }
16
+ if (path.startsWith('/') || /^[a-zA-Z]:/.test(path)) {
17
+ throw new Error(`Security error: Path "${path}" is an absolute path. ` +
18
+ `Only relative paths are allowed in ZIP archives.`);
19
+ }
20
+ if (path.includes('\0')) {
21
+ throw new Error(`Security error: Path "${path}" contains null byte. ` +
22
+ `This could be an attempt to exploit path handling.`);
23
+ }
24
+ const MAX_PATH_LENGTH = 260;
25
+ if (path.length > MAX_PATH_LENGTH) {
26
+ throw new Error(`Security error: Path "${path}" exceeds maximum length of ${MAX_PATH_LENGTH} characters.`);
27
+ }
28
+ }
29
+ addFile(filePath, content, options = {}) {
30
+ const { binary = Buffer.isBuffer(content), compression = 6, date = new Date() } = options;
31
+ const normalizedPath = normalizePath(filePath);
32
+ this.validatePathSecurity(normalizedPath);
33
+ let processedContent = content;
34
+ if (typeof content === 'string') {
35
+ processedContent = Buffer.from(content, 'utf8');
36
+ }
37
+ const isContentTypes = normalizedPath === '[Content_Types].xml';
38
+ const useCompression = isContentTypes ? 'STORE' : compression > 0 ? 'DEFLATE' : 'STORE';
39
+ const compressionLevel = isContentTypes ? 0 : compression;
40
+ this.zip.file(normalizedPath, processedContent, {
41
+ binary: true,
42
+ compression: useCompression,
43
+ compressionOptions: {
44
+ level: compressionLevel,
45
+ },
46
+ date,
47
+ });
48
+ this.files.set(normalizedPath, {
49
+ path: normalizedPath,
50
+ content: processedContent,
51
+ isBinary: binary,
52
+ size: processedContent.length,
53
+ date,
54
+ });
55
+ }
56
+ addFiles(files, options = {}) {
57
+ for (const [path, file] of files) {
58
+ this.addFile(path, file.content, {
59
+ ...options,
60
+ binary: file.isBinary,
61
+ date: file.date,
62
+ });
63
+ }
64
+ }
65
+ removeFile(filePath) {
66
+ const normalizedPath = normalizePath(filePath);
67
+ const zipFile = this.zip.file(normalizedPath);
68
+ if (zipFile) {
69
+ this.zip.remove(normalizedPath);
70
+ this.files.delete(normalizedPath);
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+ hasFile(filePath) {
76
+ const normalizedPath = normalizePath(filePath);
77
+ return this.files.has(normalizedPath);
78
+ }
79
+ getFile(filePath) {
80
+ const normalizedPath = normalizePath(filePath);
81
+ return this.files.get(normalizedPath);
82
+ }
83
+ getAllFiles() {
84
+ return new Map(this.files);
85
+ }
86
+ getFilePaths() {
87
+ return Array.from(this.files.keys());
88
+ }
89
+ validate() {
90
+ const filePaths = this.getFilePaths();
91
+ validateDocxStructure(filePaths);
92
+ }
93
+ getSortedFilePaths() {
94
+ const paths = Array.from(this.files.keys());
95
+ return paths.sort((a, b) => {
96
+ if (a === '[Content_Types].xml')
97
+ return -1;
98
+ if (b === '[Content_Types].xml')
99
+ return 1;
100
+ if (a === '_rels/.rels')
101
+ return -1;
102
+ if (b === '_rels/.rels')
103
+ return 1;
104
+ const aIsDocProps = a.startsWith('docProps/');
105
+ const bIsDocProps = b.startsWith('docProps/');
106
+ if (aIsDocProps && !bIsDocProps)
107
+ return -1;
108
+ if (!aIsDocProps && bIsDocProps)
109
+ return 1;
110
+ if (a === 'word/_rels/document.xml.rels')
111
+ return -1;
112
+ if (b === 'word/_rels/document.xml.rels')
113
+ return 1;
114
+ if (a === 'word/document.xml')
115
+ return -1;
116
+ if (b === 'word/document.xml')
117
+ return 1;
118
+ const aIsWordRels = a.startsWith('word/_rels/');
119
+ const bIsWordRels = b.startsWith('word/_rels/');
120
+ const aIsWord = a.startsWith('word/') && !aIsWordRels;
121
+ const bIsWord = b.startsWith('word/') && !bIsWordRels;
122
+ if (aIsWord && !bIsWord && !bIsWordRels)
123
+ return -1;
124
+ if (!aIsWord && bIsWord && !aIsWordRels)
125
+ return 1;
126
+ if (aIsWordRels && !bIsWordRels)
127
+ return -1;
128
+ if (!aIsWordRels && bIsWordRels)
129
+ return 1;
130
+ return a.localeCompare(b);
131
+ });
132
+ }
133
+ async toBuffer(options = {}) {
134
+ const { compression = 6, validate = true } = options;
135
+ if (validate) {
136
+ this.validate();
137
+ }
138
+ try {
139
+ const orderedZip = new JSZip();
140
+ const sortedPaths = this.getSortedFilePaths();
141
+ for (const path of sortedPaths) {
142
+ const file = this.files.get(path);
143
+ if (!file)
144
+ continue;
145
+ const processedContent = file.content;
146
+ const isContentTypes = path === '[Content_Types].xml';
147
+ const useCompression = isContentTypes ? 'STORE' : compression > 0 ? 'DEFLATE' : 'STORE';
148
+ const compressionLevel = isContentTypes ? 0 : compression;
149
+ orderedZip.file(path, processedContent, {
150
+ binary: true,
151
+ compression: useCompression,
152
+ compressionOptions: {
153
+ level: compressionLevel,
154
+ },
155
+ date: file.date,
156
+ });
157
+ }
158
+ const buffer = await orderedZip.generateAsync({
159
+ type: 'nodebuffer',
160
+ compression: compression > 0 ? 'DEFLATE' : 'STORE',
161
+ compressionOptions: {
162
+ level: compression,
163
+ },
164
+ streamFiles: true,
165
+ });
166
+ return buffer;
167
+ }
168
+ catch (error) {
169
+ const err = error instanceof Error ? error : new Error(String(error));
170
+ throw new FileOperationError('generate', err.message);
171
+ }
172
+ }
173
+ async saveToFile(filePath, options = {}) {
174
+ try {
175
+ const buffer = await this.toBuffer(options);
176
+ await fs.writeFile(filePath, buffer);
177
+ }
178
+ catch (error) {
179
+ if (error instanceof FileOperationError) {
180
+ throw error;
181
+ }
182
+ const err = error instanceof Error ? error : new Error(String(error));
183
+ throw new FileOperationError('save', err.message);
184
+ }
185
+ }
186
+ clear() {
187
+ this.zip = new JSZip();
188
+ this.files.clear();
189
+ }
190
+ getFileCount() {
191
+ return this.files.size;
192
+ }
193
+ clone() {
194
+ const newWriter = new ZipWriter();
195
+ newWriter.addFiles(this.files);
196
+ return newWriter;
197
+ }
198
+ }
199
+ //# sourceMappingURL=ZipWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipWriter.js","sourceRoot":"","sources":["../../../src/zip/ZipWriter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ZipWriter - Handles writing ZIP archives (DOCX files)\n *\n * DOCX Compliance Notes:\n * - [Content_Types].xml MUST be the first entry in the ZIP\n * - [Content_Types].xml MUST use STORE compression (uncompressed)\n * - File order matters for Microsoft Word compatibility\n */\n\nimport JSZip from 'jszip';\nimport { promises as fs } from 'fs';\nimport { ZipFile, FileMap, SaveOptions, AddFileOptions } from './types.js';\nimport { FileOperationError } from './errors.js';\nimport { validateDocxStructure, normalizePath } from '../utils/validation.js';\n\n/**\n * Handles writing operations on ZIP archives with DOCX-specific compliance\n */\nexport class ZipWriter {\n private zip: JSZip;\n private files: FileMap = new Map();\n\n constructor() {\n this.zip = new JSZip();\n }\n\n /**\n * Adds a file to the archive\n * @param filePath - Path where the file will be stored in the archive\n * @param content - File content (string or Buffer)\n * @param options - Options for adding the file\n *\n * **Encoding Note:**\n * - String content is always encoded as UTF-8 per DOCX/OpenXML standard\n * - Buffer content is stored as-is (should already be UTF-8 encoded for text)\n * - XML files must use UTF-8 encoding as specified in their XML declaration\n *\n * **DOCX Compliance:**\n * - [Content_Types].xml is automatically set to STORE compression\n */\n /**\n * Validates a file path for security issues\n * @param path - Normalized file path\n * @throws {Error} If path contains path traversal or other security issues\n * @private\n */\n private validatePathSecurity(path: string): void {\n // Check for path traversal attacks\n if (path.includes('..')) {\n throw new Error(\n `Security error: Path \"${path}\" contains path traversal sequence \"..\". ` +\n `This could be an attempt to write files outside the archive.`\n );\n }\n\n // Check for absolute paths (even after normalization)\n if (path.startsWith('/') || /^[a-zA-Z]:/.test(path)) {\n throw new Error(\n `Security error: Path \"${path}\" is an absolute path. ` +\n `Only relative paths are allowed in ZIP archives.`\n );\n }\n\n // Check for null bytes (can be used to truncate paths)\n if (path.includes('\\0')) {\n throw new Error(\n `Security error: Path \"${path}\" contains null byte. ` +\n `This could be an attempt to exploit path handling.`\n );\n }\n\n // Check for excessively long paths (potential DoS)\n const MAX_PATH_LENGTH = 260; // Windows MAX_PATH\n if (path.length > MAX_PATH_LENGTH) {\n throw new Error(\n `Security error: Path \"${path}\" exceeds maximum length of ${MAX_PATH_LENGTH} characters.`\n );\n }\n }\n\n addFile(filePath: string, content: string | Buffer, options: AddFileOptions = {}): void {\n const { binary = Buffer.isBuffer(content), compression = 6, date = new Date() } = options;\n\n const normalizedPath = normalizePath(filePath);\n\n // Security: Validate path for traversal and other attacks\n this.validatePathSecurity(normalizedPath);\n\n // Convert string content to UTF-8 Buffer if not already binary\n // This ensures consistent UTF-8 encoding regardless of system locale\n let processedContent = content;\n if (typeof content === 'string') {\n // Explicitly encode string as UTF-8 Buffer\n processedContent = Buffer.from(content, 'utf8');\n }\n\n // DOCX REQUIREMENT: [Content_Types].xml MUST be uncompressed (STORE)\n const isContentTypes = normalizedPath === '[Content_Types].xml';\n const useCompression = isContentTypes ? 'STORE' : compression > 0 ? 'DEFLATE' : 'STORE';\n const compressionLevel = isContentTypes ? 0 : compression;\n\n // For text content (XML), this ensures UTF-8 encoding is preserved\n this.zip.file(normalizedPath, processedContent, {\n binary: true, // Always treat as binary since we're using Buffers\n compression: useCompression,\n compressionOptions: {\n level: compressionLevel,\n },\n date,\n });\n\n // Store in our file map\n // IMPORTANT: Store the PROCESSED content (Buffer), not the original\n // This ensures consistency with what was added to this.zip and prevents\n // double UTF-8 conversion in toBuffer() method (Issue #1)\n this.files.set(normalizedPath, {\n path: normalizedPath,\n content: processedContent, // Store Buffer, not original string\n isBinary: binary,\n size: processedContent.length, // Buffer.length is always correct (Issue #3)\n date,\n });\n }\n\n /**\n * Adds multiple files to the archive\n * @param files - Map of file paths to contents\n * @param options - Options for adding files\n */\n addFiles(files: FileMap, options: AddFileOptions = {}): void {\n for (const [path, file] of files) {\n this.addFile(path, file.content, {\n ...options,\n binary: file.isBinary,\n date: file.date,\n });\n }\n }\n\n /**\n * Removes a file from the archive\n * @param filePath - Path to the file to remove\n * @returns True if the file was removed, false if it didn't exist\n */\n removeFile(filePath: string): boolean {\n const normalizedPath = normalizePath(filePath);\n\n // Remove from JSZip\n const zipFile = this.zip.file(normalizedPath);\n if (zipFile) {\n this.zip.remove(normalizedPath);\n this.files.delete(normalizedPath);\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if a file exists in the archive\n * @param filePath - Path to check\n * @returns True if the file exists\n */\n hasFile(filePath: string): boolean {\n const normalizedPath = normalizePath(filePath);\n return this.files.has(normalizedPath);\n }\n\n /**\n * Gets a file from the archive\n * @param filePath - Path to the file\n * @returns The file data, or undefined if not found\n */\n getFile(filePath: string): ZipFile | undefined {\n const normalizedPath = normalizePath(filePath);\n return this.files.get(normalizedPath);\n }\n\n /**\n * Gets all files in the archive\n * @returns Map of file paths to file data\n */\n getAllFiles(): FileMap {\n return new Map(this.files);\n }\n\n /**\n * Gets a list of all file paths in the archive\n * @returns Array of file paths\n */\n getFilePaths(): string[] {\n return Array.from(this.files.keys());\n }\n\n /**\n * Validates the DOCX structure before saving\n * @throws {MissingRequiredFileError} If required files are missing\n */\n validate(): void {\n const filePaths = this.getFilePaths();\n validateDocxStructure(filePaths);\n }\n\n /**\n * Sorts files according to DOCX best practices\n * Microsoft Word expects files in a specific order for optimal compatibility\n *\n * @returns Sorted array of file paths\n *\n * **DOCX File Order (CRITICAL):**\n * 1. [Content_Types].xml - MUST be first\n * 2. _rels/.rels - Root relationships\n * 3. docProps/* - Document properties\n * 4. word/_rels/document.xml.rels - Document relationships\n * 5. word/document.xml - Main document\n * 6. word/* - Other word files (styles, numbering, etc.)\n * 7. Everything else - Media, custom XML, etc.\n */\n private getSortedFilePaths(): string[] {\n const paths = Array.from(this.files.keys());\n\n return paths.sort((a, b) => {\n // Priority 1: [Content_Types].xml MUST be first (CRITICAL for MS Word)\n if (a === '[Content_Types].xml') return -1;\n if (b === '[Content_Types].xml') return 1;\n\n // Priority 2: Root relationships\n if (a === '_rels/.rels') return -1;\n if (b === '_rels/.rels') return 1;\n\n // Priority 3: Document properties\n const aIsDocProps = a.startsWith('docProps/');\n const bIsDocProps = b.startsWith('docProps/');\n if (aIsDocProps && !bIsDocProps) return -1;\n if (!aIsDocProps && bIsDocProps) return 1;\n\n // Priority 4: word/_rels/document.xml.rels\n if (a === 'word/_rels/document.xml.rels') return -1;\n if (b === 'word/_rels/document.xml.rels') return 1;\n\n // Priority 5: word/document.xml\n if (a === 'word/document.xml') return -1;\n if (b === 'word/document.xml') return 1;\n\n // Priority 6: Other word/ folder files (before relationships)\n const aIsWordRels = a.startsWith('word/_rels/');\n const bIsWordRels = b.startsWith('word/_rels/');\n const aIsWord = a.startsWith('word/') && !aIsWordRels;\n const bIsWord = b.startsWith('word/') && !bIsWordRels;\n\n if (aIsWord && !bIsWord && !bIsWordRels) return -1;\n if (!aIsWord && bIsWord && !aIsWordRels) return 1;\n\n // Priority 7: word/_rels/ files\n if (aIsWordRels && !bIsWordRels) return -1;\n if (!aIsWordRels && bIsWordRels) return 1;\n\n // Alphabetical for same priority\n return a.localeCompare(b);\n });\n }\n\n /**\n * Generates the ZIP archive as a buffer\n * @param options - Save options\n * @returns Buffer containing the ZIP archive\n *\n * **Encoding Note:**\n * The generated buffer contains UTF-8 encoded XML and text files.\n * All string content within files has been explicitly UTF-8 encoded\n * before being added to the archive to ensure consistency.\n *\n * **DOCX Compliance:**\n * - Files are ordered with [Content_Types].xml first (REQUIRED)\n * - [Content_Types].xml uses STORE compression (uncompressed)\n * - All other files use DEFLATE compression by default\n */\n async toBuffer(options: SaveOptions = {}): Promise<Buffer> {\n const { compression = 6, validate = true } = options;\n\n // Validate structure if requested\n if (validate) {\n this.validate();\n }\n\n try {\n // Create a new JSZip instance with proper file ordering\n const orderedZip = new JSZip();\n const sortedPaths = this.getSortedFilePaths();\n\n // Add files in the correct order\n for (const path of sortedPaths) {\n const file = this.files.get(path);\n if (!file) continue;\n\n // Content is already a Buffer from addFile() - no re-conversion needed (Issue #2)\n const processedContent = file.content as Buffer;\n\n // DOCX REQUIREMENT: [Content_Types].xml MUST be uncompressed\n const isContentTypes = path === '[Content_Types].xml';\n const useCompression = isContentTypes ? 'STORE' : compression > 0 ? 'DEFLATE' : 'STORE';\n const compressionLevel = isContentTypes ? 0 : compression;\n\n orderedZip.file(path, processedContent, {\n binary: true,\n compression: useCompression,\n compressionOptions: {\n level: compressionLevel,\n },\n date: file.date,\n });\n }\n\n // Generate ZIP with the ordered files\n const buffer = await orderedZip.generateAsync({\n type: 'nodebuffer',\n compression: compression > 0 ? 'DEFLATE' : 'STORE',\n compressionOptions: {\n level: compression,\n },\n streamFiles: true,\n });\n\n return buffer;\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error));\n throw new FileOperationError('generate', err.message);\n }\n }\n\n /**\n * Saves the archive to a file\n * @param filePath - Path where the file will be saved\n * @param options - Save options\n */\n async saveToFile(filePath: string, options: SaveOptions = {}): Promise<void> {\n try {\n const buffer = await this.toBuffer(options);\n await fs.writeFile(filePath, buffer);\n } catch (error: unknown) {\n if (error instanceof FileOperationError) {\n throw error;\n }\n const err = error instanceof Error ? error : new Error(String(error));\n throw new FileOperationError('save', err.message);\n }\n }\n\n /**\n * Creates a new empty archive\n */\n clear(): void {\n this.zip = new JSZip();\n this.files.clear();\n }\n\n /**\n * Gets the number of files in the archive\n * @returns Number of files\n */\n getFileCount(): number {\n return this.files.size;\n }\n\n /**\n * Creates a clone of this writer with all its files\n * @returns A new ZipWriter instance with the same files\n */\n clone(): ZipWriter {\n const newWriter = new ZipWriter();\n newWriter.addFiles(this.files);\n return newWriter;\n }\n}\n"]}
@@ -0,0 +1,43 @@
1
+ export class DocxError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'DocxError';
5
+ Object.setPrototypeOf(this, DocxError.prototype);
6
+ }
7
+ }
8
+ export class DocxNotFoundError extends DocxError {
9
+ constructor(filePath) {
10
+ super(`DOCX file not found: ${filePath}`);
11
+ this.name = 'DocxNotFoundError';
12
+ Object.setPrototypeOf(this, DocxNotFoundError.prototype);
13
+ }
14
+ }
15
+ export class InvalidDocxError extends DocxError {
16
+ constructor(message) {
17
+ super(`Invalid DOCX file: ${message}`);
18
+ this.name = 'InvalidDocxError';
19
+ Object.setPrototypeOf(this, InvalidDocxError.prototype);
20
+ }
21
+ }
22
+ export class CorruptedArchiveError extends DocxError {
23
+ constructor(message) {
24
+ super(`Corrupted archive: ${message}`);
25
+ this.name = 'CorruptedArchiveError';
26
+ Object.setPrototypeOf(this, CorruptedArchiveError.prototype);
27
+ }
28
+ }
29
+ export class MissingRequiredFileError extends DocxError {
30
+ constructor(fileName) {
31
+ super(`Missing required file: ${fileName}`);
32
+ this.name = 'MissingRequiredFileError';
33
+ Object.setPrototypeOf(this, MissingRequiredFileError.prototype);
34
+ }
35
+ }
36
+ export class FileOperationError extends DocxError {
37
+ constructor(operation, message) {
38
+ super(`File operation '${operation}' failed: ${message}`);
39
+ this.name = 'FileOperationError';
40
+ Object.setPrototypeOf(this, FileOperationError.prototype);
41
+ }
42
+ }
43
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/zip/errors.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;CACF;AAKD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C,YAAY,QAAgB;QAC1B,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;CACF;AAKD,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF;AAKD,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;CACF;AAKD,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACrD,YAAY,QAAgB;QAC1B,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;CACF;AAKD,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,YAAY,SAAiB,EAAE,OAAe;QAC5C,KAAK,CAAC,mBAAmB,SAAS,aAAa,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF","sourcesContent":["/**\r\n * Custom error classes for ZIP and DOCX operations\r\n */\r\n\r\n/**\r\n * Base error class for all DOCX-related errors\r\n */\r\nexport class DocxError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'DocxError';\r\n Object.setPrototypeOf(this, DocxError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a DOCX file is not found\r\n */\r\nexport class DocxNotFoundError extends DocxError {\r\n constructor(filePath: string) {\r\n super(`DOCX file not found: ${filePath}`);\r\n this.name = 'DocxNotFoundError';\r\n Object.setPrototypeOf(this, DocxNotFoundError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a file is not a valid DOCX/ZIP archive\r\n */\r\nexport class InvalidDocxError extends DocxError {\r\n constructor(message: string) {\r\n super(`Invalid DOCX file: ${message}`);\r\n this.name = 'InvalidDocxError';\r\n Object.setPrototypeOf(this, InvalidDocxError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a ZIP archive is corrupted\r\n */\r\nexport class CorruptedArchiveError extends DocxError {\r\n constructor(message: string) {\r\n super(`Corrupted archive: ${message}`);\r\n this.name = 'CorruptedArchiveError';\r\n Object.setPrototypeOf(this, CorruptedArchiveError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a required DOCX file is missing\r\n */\r\nexport class MissingRequiredFileError extends DocxError {\r\n constructor(fileName: string) {\r\n super(`Missing required file: ${fileName}`);\r\n this.name = 'MissingRequiredFileError';\r\n Object.setPrototypeOf(this, MissingRequiredFileError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a file operation fails\r\n */\r\nexport class FileOperationError extends DocxError {\r\n constructor(operation: string, message: string) {\r\n super(`File operation '${operation}' failed: ${message}`);\r\n this.name = 'FileOperationError';\r\n Object.setPrototypeOf(this, FileOperationError.prototype);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,31 @@
1
+ export const DEFAULT_SIZE_LIMITS = {
2
+ warningSizeMB: 50,
3
+ maxSizeMB: 150,
4
+ };
5
+ export const REQUIRED_DOCX_FILES = [
6
+ '[Content_Types].xml',
7
+ '_rels/.rels',
8
+ 'word/document.xml',
9
+ ];
10
+ export const DOCX_PATHS = {
11
+ CONTENT_TYPES: '[Content_Types].xml',
12
+ RELS: '_rels/.rels',
13
+ DOCUMENT: 'word/document.xml',
14
+ DOCUMENT_RELS: 'word/_rels/document.xml.rels',
15
+ STYLES: 'word/styles.xml',
16
+ NUMBERING: 'word/numbering.xml',
17
+ NUMBERING_RELS: 'word/_rels/numbering.xml.rels',
18
+ SETTINGS: 'word/settings.xml',
19
+ FONT_TABLE: 'word/fontTable.xml',
20
+ THEME: 'word/theme/theme1.xml',
21
+ CORE_PROPS: 'docProps/core.xml',
22
+ APP_PROPS: 'docProps/app.xml',
23
+ MEDIA_DIR: 'word/media/',
24
+ FOOTNOTES: 'word/footnotes.xml',
25
+ ENDNOTES: 'word/endnotes.xml',
26
+ COMMENTS_EXTENDED: 'word/commentsExtended.xml',
27
+ COMMENTS_IDS: 'word/commentsIds.xml',
28
+ COMMENTS_EXTENSIBLE: 'word/commentsExtensible.xml',
29
+ WEB_SETTINGS: 'word/webSettings.xml',
30
+ };
31
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/zip/types.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,mBAAmB,GAA+B;IAC7D,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,GAAG;CACf,CAAC;AA4CF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,qBAAqB;IACrB,aAAa;IACb,mBAAmB;CACX,CAAC;AAKX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,aAAa,EAAE,qBAAqB;IACpC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,mBAAmB;IAC7B,aAAa,EAAE,8BAA8B;IAC7C,MAAM,EAAE,iBAAiB;IACzB,SAAS,EAAE,oBAAoB;IAC/B,cAAc,EAAE,+BAA+B;IAC/C,QAAQ,EAAE,mBAAmB;IAC7B,UAAU,EAAE,oBAAoB;IAChC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,mBAAmB;IAC/B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,oBAAoB;IAC/B,QAAQ,EAAE,mBAAmB;IAC7B,iBAAiB,EAAE,2BAA2B;IAC9C,YAAY,EAAE,sBAAsB;IACpC,mBAAmB,EAAE,6BAA6B;IAClD,YAAY,EAAE,sBAAsB;CAC5B,CAAC","sourcesContent":["/**\n * Types and interfaces for ZIP archive handling\n */\n\n/**\n * Represents a file within a ZIP archive\n */\nexport interface ZipFile {\n /** The path of the file within the archive */\n path: string;\n /** The content of the file (string for text, Buffer for binary) */\n content: string | Buffer;\n /** Whether the content is binary */\n isBinary: boolean;\n /** File size in bytes */\n size: number;\n /** Last modified date */\n date?: Date;\n}\n\n/**\n * Size limit configuration for document loading\n */\nexport interface SizeLimitOptions {\n /**\n * Size in MB at which to show a warning (default: 50 MB)\n * Set to 0 to disable warnings\n */\n warningSizeMB?: number;\n /**\n * Maximum size in MB to load (default: 150 MB)\n * Set to 0 to disable the limit (not recommended)\n */\n maxSizeMB?: number;\n}\n\n/**\n * Default size limits for document loading\n */\nexport const DEFAULT_SIZE_LIMITS: Required<SizeLimitOptions> = {\n warningSizeMB: 50,\n maxSizeMB: 150,\n};\n\n/**\n * Options for loading a DOCX file\n */\nexport interface LoadOptions {\n /** Whether to validate the DOCX structure on load */\n validate?: boolean;\n /** Whether to load files lazily */\n lazy?: boolean;\n /** Size limit configuration (warning and max size thresholds) */\n sizeLimits?: SizeLimitOptions;\n}\n\n/**\n * Options for saving a DOCX file\n */\nexport interface SaveOptions {\n /** Compression level (0-9, where 0 is no compression and 9 is maximum) */\n compression?: number;\n /** Whether to validate the DOCX structure before save */\n validate?: boolean;\n}\n\n/**\n * Options for adding files to the archive\n */\nexport interface AddFileOptions {\n /** Whether the content is binary */\n binary?: boolean;\n /** Compression level for this specific file */\n compression?: number;\n /** Last modified date */\n date?: Date;\n}\n\n/**\n * Map of file paths to their contents\n */\nexport type FileMap = Map<string, ZipFile>;\n\n/**\n * Required files for a valid DOCX structure\n */\nexport const REQUIRED_DOCX_FILES = [\n '[Content_Types].xml',\n '_rels/.rels',\n 'word/document.xml',\n] as const;\n\n/**\n * Common DOCX file paths\n */\nexport const DOCX_PATHS = {\n CONTENT_TYPES: '[Content_Types].xml',\n RELS: '_rels/.rels',\n DOCUMENT: 'word/document.xml',\n DOCUMENT_RELS: 'word/_rels/document.xml.rels',\n STYLES: 'word/styles.xml',\n NUMBERING: 'word/numbering.xml',\n NUMBERING_RELS: 'word/_rels/numbering.xml.rels',\n SETTINGS: 'word/settings.xml',\n FONT_TABLE: 'word/fontTable.xml',\n THEME: 'word/theme/theme1.xml',\n CORE_PROPS: 'docProps/core.xml',\n APP_PROPS: 'docProps/app.xml',\n MEDIA_DIR: 'word/media/',\n FOOTNOTES: 'word/footnotes.xml',\n ENDNOTES: 'word/endnotes.xml',\n COMMENTS_EXTENDED: 'word/commentsExtended.xml',\n COMMENTS_IDS: 'word/commentsIds.xml',\n COMMENTS_EXTENSIBLE: 'word/commentsExtensible.xml',\n WEB_SETTINGS: 'word/webSettings.xml',\n} as const;\n"]}
@@ -1,5 +1,5 @@
1
- import { XMLElement } from '../xml/XMLBuilder';
2
- import { NumberingLevel } from './NumberingLevel';
1
+ import { XMLElement } from '../xml/XMLBuilder.js';
2
+ import { NumberingLevel } from './NumberingLevel.js';
3
3
  export interface AbstractNumberingProperties {
4
4
  abstractNumId: number;
5
5
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractNumbering.d.ts","sourceRoot":"","sources":["../../src/formatting/AbstractNumbering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractNumbering.d.ts","sourceRoot":"","sources":["../../src/formatting/AbstractNumbering.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AbstractNumbering = void 0;
4
- const XMLBuilder_1 = require("../xml/XMLBuilder");
5
- const NumberingLevel_1 = require("./NumberingLevel");
6
- const logger_1 = require("../utils/logger");
4
+ const XMLBuilder_js_1 = require("../xml/XMLBuilder.js");
5
+ const NumberingLevel_js_1 = require("./NumberingLevel.js");
6
+ const logger_js_1 = require("../utils/logger.js");
7
7
  class AbstractNumbering {
8
8
  abstractNumId;
9
9
  name;
@@ -150,7 +150,7 @@ class AbstractNumbering {
150
150
  toXML() {
151
151
  const children = [];
152
152
  if (this.nsid) {
153
- children.push(XMLBuilder_1.XMLBuilder.wSelf('nsid', { 'w:val': this.nsid }));
153
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('nsid', { 'w:val': this.nsid }));
154
154
  }
155
155
  let multiLevelTypeValue;
156
156
  if (this.multiLevelType === 1) {
@@ -162,29 +162,29 @@ class AbstractNumbering {
162
162
  else {
163
163
  multiLevelTypeValue = 'singleLevel';
164
164
  }
165
- children.push(XMLBuilder_1.XMLBuilder.wSelf('multiLevelType', {
165
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('multiLevelType', {
166
166
  'w:val': multiLevelTypeValue,
167
167
  }));
168
168
  if (this.tmpl) {
169
- children.push(XMLBuilder_1.XMLBuilder.wSelf('tmpl', { 'w:val': this.tmpl }));
169
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('tmpl', { 'w:val': this.tmpl }));
170
170
  }
171
171
  if (this.name) {
172
- children.push(XMLBuilder_1.XMLBuilder.wSelf('name', { 'w:val': this.name }));
172
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('name', { 'w:val': this.name }));
173
173
  }
174
174
  if (this.styleLink) {
175
- children.push(XMLBuilder_1.XMLBuilder.wSelf('styleLink', { 'w:val': this.styleLink }));
175
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('styleLink', { 'w:val': this.styleLink }));
176
176
  }
177
177
  if (this.numStyleLink) {
178
- children.push(XMLBuilder_1.XMLBuilder.wSelf('numStyleLink', { 'w:val': this.numStyleLink }));
178
+ children.push(XMLBuilder_js_1.XMLBuilder.wSelf('numStyleLink', { 'w:val': this.numStyleLink }));
179
179
  }
180
180
  const sortedLevels = this.getAllLevels();
181
181
  sortedLevels.forEach((level) => {
182
182
  children.push(level.toXML());
183
183
  });
184
184
  if (sortedLevels.length === 0) {
185
- children.push(NumberingLevel_1.NumberingLevel.createDecimalLevel(0).toXML());
185
+ children.push(NumberingLevel_js_1.NumberingLevel.createDecimalLevel(0).toXML());
186
186
  }
187
- return XMLBuilder_1.XMLBuilder.w('abstractNum', { 'w:abstractNumId': this.abstractNumId.toString() }, children);
187
+ return XMLBuilder_js_1.XMLBuilder.w('abstractNum', { 'w:abstractNumId': this.abstractNumId.toString() }, children);
188
188
  }
189
189
  static createBulletList(abstractNumId, levels = 9, bullets) {
190
190
  const abstractNum = new AbstractNumbering({
@@ -195,10 +195,10 @@ class AbstractNumbering {
195
195
  for (let i = 0; i < levels && i < 9; i++) {
196
196
  if (bullets && bullets.length > 0) {
197
197
  const bullet = bullets[i % bullets.length] || '•';
198
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createBulletLevel(i, bullet));
198
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createBulletLevel(i, bullet));
199
199
  }
200
200
  else {
201
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createBulletLevel(i));
201
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createBulletLevel(i));
202
202
  }
203
203
  }
204
204
  return abstractNum;
@@ -221,20 +221,20 @@ class AbstractNumbering {
221
221
  let level;
222
222
  switch (format) {
223
223
  case 'lowerLetter':
224
- level = NumberingLevel_1.NumberingLevel.createLowerLetterLevel(i, template);
224
+ level = NumberingLevel_js_1.NumberingLevel.createLowerLetterLevel(i, template);
225
225
  break;
226
226
  case 'lowerRoman':
227
- level = NumberingLevel_1.NumberingLevel.createLowerRomanLevel(i, template);
227
+ level = NumberingLevel_js_1.NumberingLevel.createLowerRomanLevel(i, template);
228
228
  break;
229
229
  case 'upperLetter':
230
- level = NumberingLevel_1.NumberingLevel.createUpperLetterLevel(i, template);
230
+ level = NumberingLevel_js_1.NumberingLevel.createUpperLetterLevel(i, template);
231
231
  break;
232
232
  case 'upperRoman':
233
- level = NumberingLevel_1.NumberingLevel.createUpperRomanLevel(i, template);
233
+ level = NumberingLevel_js_1.NumberingLevel.createUpperRomanLevel(i, template);
234
234
  break;
235
235
  case 'decimal':
236
236
  default:
237
- level = NumberingLevel_1.NumberingLevel.createDecimalLevel(i, template);
237
+ level = NumberingLevel_js_1.NumberingLevel.createDecimalLevel(i, template);
238
238
  break;
239
239
  }
240
240
  abstractNum.addLevel(level);
@@ -247,10 +247,10 @@ class AbstractNumbering {
247
247
  name: 'Multi-Level List',
248
248
  multiLevelType: 1,
249
249
  });
250
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createDecimalLevel(0, '%1.'));
251
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerLetterLevel(1, '%2.'));
252
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerRomanLevel(2, '%3.'));
253
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createDecimalLevel(3, '%4.'));
250
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createDecimalLevel(0, '%1.'));
251
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerLetterLevel(1, '%2.'));
252
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerRomanLevel(2, '%3.'));
253
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createDecimalLevel(3, '%4.'));
254
254
  return abstractNum;
255
255
  }
256
256
  static createOutlineList(abstractNumId) {
@@ -259,15 +259,15 @@ class AbstractNumbering {
259
259
  name: 'Outline List',
260
260
  multiLevelType: 1,
261
261
  });
262
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createUpperRomanLevel(0, '%1.'));
263
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createUpperLetterLevel(1, '%2.'));
264
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createDecimalLevel(2, '%3.'));
265
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerLetterLevel(3, '%4.'));
266
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerRomanLevel(4, '%5.'));
267
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createUpperLetterLevel(5, '%6.'));
268
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createDecimalLevel(6, '%7.'));
269
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerLetterLevel(7, '%8.'));
270
- abstractNum.addLevel(NumberingLevel_1.NumberingLevel.createLowerRomanLevel(8, '%9.'));
262
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createUpperRomanLevel(0, '%1.'));
263
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createUpperLetterLevel(1, '%2.'));
264
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createDecimalLevel(2, '%3.'));
265
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerLetterLevel(3, '%4.'));
266
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerRomanLevel(4, '%5.'));
267
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createUpperLetterLevel(5, '%6.'));
268
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createDecimalLevel(6, '%7.'));
269
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerLetterLevel(7, '%8.'));
270
+ abstractNum.addLevel(NumberingLevel_js_1.NumberingLevel.createLowerRomanLevel(8, '%9.'));
271
271
  return abstractNum;
272
272
  }
273
273
  static create(properties) {
@@ -314,11 +314,11 @@ class AbstractNumbering {
314
314
  if (lvlMatches) {
315
315
  for (const lvlXml of lvlMatches) {
316
316
  try {
317
- const level = NumberingLevel_1.NumberingLevel.fromXML(lvlXml);
317
+ const level = NumberingLevel_js_1.NumberingLevel.fromXML(lvlXml);
318
318
  abstractNum.addLevel(level);
319
319
  }
320
320
  catch (error) {
321
- logger_1.defaultLogger.warn(`Failed to parse level: ${error}`);
321
+ logger_js_1.defaultLogger.warn(`Failed to parse level: ${error}`);
322
322
  }
323
323
  }
324
324
  }