@cj-tech-master/excelts 1.6.3 → 2.0.0

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 (400) hide show
  1. package/README.md +139 -24
  2. package/README_zh.md +140 -26
  3. package/dist/browser/excelts.esm.js +18468 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +125 -0
  6. package/dist/browser/excelts.iife.js +13107 -47146
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +24 -106
  9. package/dist/cjs/csv/csv-core.js +701 -0
  10. package/dist/cjs/csv/csv-stream.js +646 -0
  11. package/dist/cjs/csv/csv.base.js +137 -0
  12. package/dist/cjs/csv/csv.browser.js +68 -0
  13. package/dist/cjs/csv/csv.js +218 -162
  14. package/dist/cjs/doc/anchor.js +2 -2
  15. package/dist/cjs/doc/cell.js +22 -22
  16. package/dist/cjs/doc/column.js +28 -7
  17. package/dist/cjs/doc/data-validations.js +3 -3
  18. package/dist/cjs/doc/defined-names.js +13 -13
  19. package/dist/cjs/doc/image.js +7 -7
  20. package/dist/cjs/doc/modelcontainer.js +2 -2
  21. package/dist/cjs/doc/note.js +2 -2
  22. package/dist/cjs/doc/pivot-table.js +5 -5
  23. package/dist/cjs/doc/range.js +11 -11
  24. package/dist/cjs/doc/row.js +16 -16
  25. package/dist/cjs/doc/table.js +5 -5
  26. package/dist/cjs/doc/workbook.base.js +211 -0
  27. package/dist/cjs/doc/workbook.browser.js +62 -0
  28. package/dist/cjs/doc/workbook.js +68 -179
  29. package/dist/cjs/doc/worksheet.js +45 -41
  30. package/dist/cjs/index.js +49 -32
  31. package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
  32. package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
  33. package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
  34. package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
  35. package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
  36. package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
  37. package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
  38. package/dist/cjs/utils/browser-buffer.js +75 -0
  39. package/dist/cjs/utils/cell-format.js +2 -2
  40. package/dist/cjs/utils/cell-matrix.js +5 -5
  41. package/dist/cjs/utils/datetime.js +648 -0
  42. package/dist/cjs/utils/encryptor.browser.js +240 -0
  43. package/dist/cjs/utils/parse-sax.js +1191 -13
  44. package/dist/cjs/utils/shared-formula.js +5 -5
  45. package/dist/cjs/utils/sheet-utils.js +13 -13
  46. package/dist/cjs/utils/stream-buf.browser.js +355 -0
  47. package/dist/cjs/utils/stream-buf.js +5 -5
  48. package/dist/cjs/utils/unzip/extract.js +11 -11
  49. package/dist/cjs/utils/unzip/index.js +21 -21
  50. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  51. package/dist/cjs/utils/unzip/parse.js +16 -16
  52. package/dist/cjs/utils/unzip/zip-parser.js +14 -3
  53. package/dist/cjs/utils/utils.base.js +161 -0
  54. package/dist/cjs/utils/utils.browser.js +89 -0
  55. package/dist/cjs/utils/utils.js +46 -154
  56. package/dist/cjs/utils/xml-stream.js +3 -3
  57. package/dist/cjs/utils/zip/compress.base.js +88 -0
  58. package/dist/cjs/utils/zip/compress.browser.js +127 -0
  59. package/dist/cjs/utils/zip/compress.js +18 -198
  60. package/dist/cjs/utils/zip/crc32.browser.js +88 -0
  61. package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
  62. package/dist/cjs/utils/zip/index.js +17 -17
  63. package/dist/cjs/utils/zip/streaming-zip.js +264 -0
  64. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  65. package/dist/cjs/utils/zip-stream.browser.js +135 -0
  66. package/dist/cjs/utils/zip-stream.js +4 -4
  67. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  68. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  69. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  70. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  71. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  72. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  73. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  74. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  75. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  76. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  77. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  78. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  79. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  80. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  81. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  82. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  83. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  84. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  85. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  86. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  87. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  88. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  89. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  90. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  91. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  92. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  93. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  94. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  95. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  96. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  97. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  98. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  99. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  100. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  101. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  102. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  103. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  104. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  105. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  106. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  107. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  108. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  109. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  110. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  111. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
  112. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  113. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  114. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  115. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  116. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  117. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  118. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  119. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  120. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  121. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  122. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  123. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  124. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
  125. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  126. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  127. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  128. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  129. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  130. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  131. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
  133. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  134. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  135. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  138. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  141. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  142. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  143. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
  144. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  145. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  146. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  147. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  148. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  149. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
  150. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  151. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  152. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  153. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  155. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  156. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
  157. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  158. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  159. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  160. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  161. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  162. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  163. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  164. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  165. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  166. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  167. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  168. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  169. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  170. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  171. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  172. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  173. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  174. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  175. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  176. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  177. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  178. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  179. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  180. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  181. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  182. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  183. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  184. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  185. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  186. package/dist/cjs/xlsx/xlsx.base.js +742 -0
  187. package/dist/cjs/xlsx/xlsx.browser.js +162 -0
  188. package/dist/cjs/xlsx/xlsx.js +118 -892
  189. package/dist/esm/csv/csv-core.js +694 -0
  190. package/dist/esm/csv/csv-stream.js +638 -0
  191. package/dist/esm/csv/csv.base.js +127 -0
  192. package/dist/esm/csv/csv.browser.js +65 -0
  193. package/dist/esm/csv/csv.js +181 -159
  194. package/dist/esm/doc/column.js +21 -0
  195. package/dist/esm/doc/workbook.base.js +207 -0
  196. package/dist/esm/doc/workbook.browser.js +59 -0
  197. package/dist/esm/doc/workbook.js +64 -175
  198. package/dist/esm/doc/worksheet.js +4 -0
  199. package/dist/esm/index.browser.js +33 -1
  200. package/dist/esm/index.js +23 -8
  201. package/dist/esm/local.js +0 -1
  202. package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
  203. package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
  204. package/dist/esm/utils/browser-buffer.js +67 -0
  205. package/dist/esm/utils/datetime.js +639 -0
  206. package/dist/esm/utils/encryptor.browser.js +237 -0
  207. package/dist/esm/utils/parse-sax.js +1188 -12
  208. package/dist/esm/utils/stream-buf.browser.js +352 -0
  209. package/dist/esm/utils/unzip/zip-parser.js +11 -0
  210. package/dist/esm/utils/utils.base.js +142 -0
  211. package/dist/esm/utils/utils.browser.js +68 -0
  212. package/dist/esm/utils/utils.js +15 -123
  213. package/dist/esm/utils/zip/compress.base.js +83 -0
  214. package/dist/esm/utils/zip/compress.browser.js +121 -0
  215. package/dist/esm/utils/zip/compress.js +16 -164
  216. package/dist/esm/utils/zip/crc32.browser.js +82 -0
  217. package/dist/esm/utils/zip/deflate-fallback.js +570 -0
  218. package/dist/esm/utils/zip/streaming-zip.js +259 -0
  219. package/dist/esm/utils/zip-stream.browser.js +132 -0
  220. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
  221. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  222. package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
  223. package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
  224. package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
  225. package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
  226. package/dist/esm/xlsx/xlsx.base.js +739 -0
  227. package/dist/esm/xlsx/xlsx.browser.js +159 -0
  228. package/dist/esm/xlsx/xlsx.js +114 -888
  229. package/dist/types/csv/csv-core.d.ts +207 -0
  230. package/dist/types/csv/csv-stream.d.ts +114 -0
  231. package/dist/types/csv/csv.base.d.ts +62 -0
  232. package/dist/types/csv/csv.browser.d.ts +33 -0
  233. package/dist/types/csv/csv.d.ts +97 -71
  234. package/dist/types/doc/anchor.d.ts +1 -1
  235. package/dist/types/doc/cell.d.ts +7 -7
  236. package/dist/types/doc/column.d.ts +9 -3
  237. package/dist/types/doc/defined-names.d.ts +4 -4
  238. package/dist/types/doc/image.d.ts +2 -2
  239. package/dist/types/doc/modelcontainer.d.ts +1 -1
  240. package/dist/types/doc/pivot-table.d.ts +1 -1
  241. package/dist/types/doc/range.d.ts +1 -1
  242. package/dist/types/doc/row.d.ts +3 -3
  243. package/dist/types/doc/table.d.ts +2 -2
  244. package/dist/types/doc/workbook.base.d.ts +111 -0
  245. package/dist/types/doc/workbook.browser.d.ts +38 -0
  246. package/dist/types/doc/workbook.d.ts +62 -92
  247. package/dist/types/doc/worksheet.d.ts +12 -10
  248. package/dist/types/index.browser.d.ts +19 -5
  249. package/dist/types/index.d.ts +24 -23
  250. package/dist/types/local.d.ts +0 -1
  251. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  252. package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
  253. package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
  254. package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
  255. package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
  256. package/dist/types/types.d.ts +6 -0
  257. package/dist/types/utils/browser-buffer.d.ts +28 -0
  258. package/dist/types/utils/col-cache.d.ts +1 -1
  259. package/dist/types/utils/datetime.d.ts +85 -0
  260. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  261. package/dist/types/utils/parse-sax.d.ts +108 -1
  262. package/dist/types/utils/sheet-utils.d.ts +3 -3
  263. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  264. package/dist/types/utils/unzip/extract.d.ts +6 -6
  265. package/dist/types/utils/unzip/index.d.ts +8 -8
  266. package/dist/types/utils/unzip/parse.d.ts +3 -3
  267. package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
  268. package/dist/types/utils/utils.base.d.ts +29 -0
  269. package/dist/types/utils/utils.browser.d.ts +29 -0
  270. package/dist/types/utils/utils.d.ts +6 -25
  271. package/dist/types/utils/zip/compress.base.d.ts +45 -0
  272. package/dist/types/utils/zip/compress.browser.d.ts +63 -0
  273. package/dist/types/utils/zip/compress.d.ts +13 -45
  274. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  275. package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
  276. package/dist/types/utils/zip/index.d.ts +5 -5
  277. package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
  278. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  279. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  280. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  288. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  289. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  305. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  307. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  308. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  311. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  312. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  315. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  322. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  323. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  324. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  326. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  327. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  328. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  329. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  330. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  331. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  332. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  333. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  335. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  336. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  337. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  338. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  339. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  340. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  341. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  342. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  343. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  344. package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
  345. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  346. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
  355. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  356. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  358. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  360. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
  361. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  362. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  363. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  366. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  370. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  371. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  373. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  375. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  376. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  377. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  378. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  379. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  380. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  381. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  382. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  383. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  384. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  385. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  386. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  387. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  388. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  389. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  390. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  391. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  392. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  393. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  394. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  395. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  396. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  397. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  398. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  399. package/dist/types/xlsx/xlsx.d.ts +20 -80
  400. package/package.json +16 -39
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excelts.esm.js","names":["colCache: ColCache","c: string","v: number","l1: number","l2: number","l3: number","colNumber: number | undefined","rowNumber: number | undefined","address: CachedAddress","result: DecodedRange","range","keys: string[]","target: any","src: any","clone: any","copyIsArray: boolean","value: NoteModel | null","copy: FormulaValueData","ErrorValue","colNum: number","i: number","cSrc: Cell | undefined","cDst: Cell | undefined","options: { includeEmpty?: boolean } | null","callback: (cell: Cell, colNumber: number) => void","pb: RowBreak","values: CellValue[]","cells: CellModel[]","previousAddress: CellAddress | undefined","address: CellAddress | undefined","options: { includeEmpty?: boolean }","callback: (cell: Cell, rowNumber: number) => void","v: CellValueType[]","pb: ColBreak","cols: ColumnModel[]","col: ColumnModel | null","columns: Column[]","range","Column","assign","validation","base64ToUint8Array","concatUint8Arrays","concatUint8Arrays","base64ToUint8Array","xmlDecodingMap: Record<string, string>","xmlEncodingMap: Record<string, string>","values: any[]","result: any[][]","result: CacheField[]","copied: StyleObject","columns: Column[]","colNum: number","counts: boolean[]","rows: any[]","rows: Row[]","i: number","rSrc: Row | undefined","options: { includeEmpty?: boolean } | undefined","callback: (row: Row, rowNumber: number) => void","rows: CellValue[][]","range","getResult: (row: number, col: number) => FormulaResult | undefined","model: WorksheetModel","rows: RowModel[]","dimensions: Range","result: Record<string, unknown>","results: T[]","inserts: Row[]","inserts: (Cell | null)[]","range","x: number","y: number","cells: DefinedNameCell[]","chunks: Uint8Array[]","root: HuffmanNode","output: number[]","literalTree: HuffmanNode","distanceTree: HuffmanNode","i","LITERAL_CODES: Array<[number, number]>","LITERAL_LENGTHS_TABLE: number[]","code: number","len: number","extraBits: number","extraValue: number","DIST_TABLE: Array<[number, number, number]>","_hasDeflateRaw: boolean | null","LOCAL_FILE_HEADER_SIG","CENTRAL_DIR_HEADER_SIG","END_OF_CENTRAL_DIR_SIG","COMPRESSION_DEFLATE","entries: ZipEntryInfo[]","crc32","result: Record<string, Uint8Array>","dataPromise: Promise<Uint8Array> | null","processedEntry: ProcessedEntry","chunks: Uint8Array[]","buf","chunk: Chunk","buffers: Uint8Array[]","buffer: Uint8Array","tmp: string[]","ASCII_CHARS: string[]","XML_ENTITIES: Record<string, string>","resolved: string","num: number","error: Error | undefined","events: SaxEvent[]","model: any","model: any","defaultNumFormats: { [key: number]: NumFormat }","hash: { [key: string]: number }","Enums","validation","model: any","model: ProtectionModel","numFmtIndex: any","style: any","mediaHash: { [key: string]: boolean }","range","ranges: string[]","attributes: any","model: any","printAreas: any[]","ranges: string[]","worksheets: any[]","worksheet: any","definedNames: any[]","range: any","range","range","dimensions: any","model: RowModel","model: ColModel","rangeValidations: any[]","regularModel: any","addr: any","dataValidation: any","range","formula: any","attributes: any","VIEW_STATES: { [key: string]: string }","booleanToXml","attributes: any","booleanToXml","AutoFilterXform","DrawingXform","ExtXform","extIcons","ExtXform","ExtLstXform","AutoFilterXform","DrawingXform","ExtLstXform","anchor: any","sheetFormatPropertiesModel: any","parts: string[]","attrs: any","attributes: any","drawingOptions: any","loadedPivotTables: any[]","pivotTablesIndexed: Record<string, any>","model: any","match: RegExpMatchArray | null","relationships: any[]","xml","worksheetOptions: any","buffer: Uint8Array","base64ToUint8Array","filesRecord: Record<string, Uint8Array>","PARSERS: Record<DateFormat, Parser>","AUTO_DETECT: Array<[number, Parser[]]>","fns: Parser[]","out: Date[]","format","esc: string[]","duplicates: string[]","rows: string[][]","invalidRows: { row: string[]; reason: string }[]","currentRow: string[]","headerRow: HeaderArray | null","obj: Record<string, string>","validate","validatedRows: Record<string, string>[]","resultRows: string[][]","validatedRows: string[][]","arrayInvalidRows: { row: string[]; reason: string }[]","lines: string[]","keys: string[] | null","SpecialValues: Record<string, boolean | CellErrorValue>","dateFormats: readonly DateFormat[]","rows: any[][]","content: string","isDateFormat","decMatch","decPlaces","denom","whole","numer","formattedInt: string","sections","sections: string[]","cellFormat","range","result: CellValue[][]","includeBlank","rowData: CellValue[]","result","result: Record<string, CellValue>[]","rowData: Record<string, CellValue>","headers: string[]","headerCounts: Record<string, number>","rows: string[]","cells: string[]"],"sources":["../../src/utils/col-cache.ts","../../src/doc/range.ts","../../src/doc/enums.ts","../../src/utils/under-dash.ts","../../src/doc/note.ts","../../src/utils/shared-formula.ts","../../src/doc/cell.ts","../../src/doc/row.ts","../../src/doc/column.ts","../../src/doc/anchor.ts","../../src/doc/image.ts","../../src/doc/table.ts","../../src/doc/data-validations.ts","../../src/utils/browser-buffer.ts","../../src/utils/encryptor.browser.ts","../../src/utils/utils.base.ts","../../src/utils/utils.browser.ts","../../src/doc/pivot-table.ts","../../src/utils/copy-style.ts","../../src/doc/worksheet.ts","../../src/utils/cell-matrix.ts","../../src/doc/defined-names.ts","../../src/doc/workbook.base.ts","../../src/utils/zip/compress.base.ts","../../src/utils/zip/deflate-fallback.ts","../../src/utils/zip/compress.browser.ts","../../src/utils/unzip/zip-parser.ts","../../src/utils/zip/crc32.browser.ts","../../src/utils/zip/zip-builder.ts","../../src/utils/string-buf.ts","../../src/utils/stream-buf.browser.ts","../../src/utils/zip-stream.browser.ts","../../src/utils/xml-stream.ts","../../src/utils/parse-sax.ts","../../src/xlsx/xform/base-xform.ts","../../src/xlsx/xform/static-xform.ts","../../src/xlsx/xform/list-xform.ts","../../src/xlsx/xform/style/color-xform.ts","../../src/xlsx/xform/simple/boolean-xform.ts","../../src/xlsx/xform/simple/integer-xform.ts","../../src/xlsx/xform/simple/string-xform.ts","../../src/xlsx/xform/style/underline-xform.ts","../../src/xlsx/xform/style/font-xform.ts","../../src/xlsx/xform/style/fill-xform.ts","../../src/xlsx/xform/style/border-xform.ts","../../src/xlsx/defaultnumformats.ts","../../src/xlsx/xform/style/numfmt-xform.ts","../../src/xlsx/xform/style/alignment-xform.ts","../../src/xlsx/xform/style/protection-xform.ts","../../src/xlsx/xform/style/style-xform.ts","../../src/xlsx/xform/style/dxf-xform.ts","../../src/xlsx/xform/style/styles-xform.ts","../../src/xlsx/xform/simple/date-xform.ts","../../src/xlsx/xform/core/core-xform.ts","../../src/xlsx/xform/strings/text-xform.ts","../../src/xlsx/xform/strings/rich-text-xform.ts","../../src/xlsx/xform/strings/phonetic-text-xform.ts","../../src/xlsx/xform/strings/shared-string-xform.ts","../../src/xlsx/xform/strings/shared-strings-xform.ts","../../src/xlsx/xform/core/relationship-xform.ts","../../src/xlsx/xform/core/relationships-xform.ts","../../src/xlsx/xform/core/content-types-xform.ts","../../src/xlsx/xform/core/app-heading-pairs-xform.ts","../../src/xlsx/xform/core/app-titles-of-parts-xform.ts","../../src/xlsx/xform/core/app-xform.ts","../../src/xlsx/xform/book/defined-name-xform.ts","../../src/xlsx/xform/book/sheet-xform.ts","../../src/xlsx/xform/book/workbook-view-xform.ts","../../src/xlsx/xform/book/workbook-properties-xform.ts","../../src/xlsx/xform/book/workbook-calc-properties-xform.ts","../../src/xlsx/xform/book/workbook-pivot-cache-xform.ts","../../src/xlsx/xform/book/workbook-xform.ts","../../src/xlsx/rel-type.ts","../../src/xlsx/xform/sheet/merges.ts","../../src/xlsx/xform/sheet/cell-xform.ts","../../src/xlsx/xform/sheet/row-xform.ts","../../src/xlsx/xform/sheet/col-xform.ts","../../src/xlsx/xform/sheet/dimension-xform.ts","../../src/xlsx/xform/sheet/hyperlink-xform.ts","../../src/xlsx/xform/sheet/merge-cell-xform.ts","../../src/xlsx/xform/sheet/data-validations-xform.ts","../../src/xlsx/xform/sheet/page-setup-properties-xform.ts","../../src/xlsx/xform/sheet/outline-properties-xform.ts","../../src/xlsx/xform/sheet/sheet-properties-xform.ts","../../src/xlsx/xform/sheet/sheet-format-properties-xform.ts","../../src/xlsx/xform/sheet/sheet-view-xform.ts","../../src/xlsx/xform/sheet/sheet-protection-xform.ts","../../src/xlsx/xform/sheet/page-margins-xform.ts","../../src/xlsx/xform/sheet/page-setup-xform.ts","../../src/xlsx/xform/sheet/print-options-xform.ts","../../src/xlsx/xform/sheet/auto-filter-xform.ts","../../src/xlsx/xform/sheet/picture-xform.ts","../../src/xlsx/xform/sheet/drawing-xform.ts","../../src/xlsx/xform/sheet/table-part-xform.ts","../../src/xlsx/xform/sheet/page-breaks-xform.ts","../../src/xlsx/xform/sheet/row-breaks-xform.ts","../../src/xlsx/xform/sheet/col-breaks-xform.ts","../../src/xlsx/xform/sheet/header-footer-xform.ts","../../src/xlsx/xform/composite-xform.ts","../../src/xlsx/xform/sheet/cf/cfvo-xform.ts","../../src/xlsx/xform/sheet/cf/databar-xform.ts","../../src/xlsx/xform/sheet/cf/ext-lst-ref-xform.ts","../../src/xlsx/xform/sheet/cf/formula-xform.ts","../../src/xlsx/xform/sheet/cf/color-scale-xform.ts","../../src/xlsx/xform/sheet/cf/icon-set-xform.ts","../../src/xlsx/xform/sheet/cf/cf-rule-xform.ts","../../src/xlsx/xform/sheet/cf/conditional-formatting-xform.ts","../../src/xlsx/xform/sheet/cf/conditional-formattings-xform.ts","../../src/xlsx/xform/sheet/cf-ext/f-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/databar-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/sqref-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.ts","../../src/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.ts","../../src/xlsx/xform/sheet/ext-lst-xform.ts","../../src/xlsx/xform/sheet/worksheet-xform.ts","../../src/xlsx/xform/drawing/base-cell-anchor-xform.ts","../../src/xlsx/xform/drawing/cell-position-xform.ts","../../src/xlsx/xform/drawing/blip-xform.ts","../../src/xlsx/xform/drawing/blip-fill-xform.ts","../../src/xlsx/xform/drawing/hlink-click-xform.ts","../../src/xlsx/xform/drawing/ext-lst-xform.ts","../../src/xlsx/xform/drawing/c-nv-pr-xform.ts","../../src/xlsx/xform/drawing/c-nv-pic-pr-xform.ts","../../src/xlsx/xform/drawing/nv-pic-pr-xform.ts","../../src/xlsx/xform/drawing/sp-pr.ts","../../src/xlsx/xform/drawing/pic-xform.ts","../../src/xlsx/xform/drawing/two-cell-anchor-xform.ts","../../src/xlsx/xform/drawing/ext-xform.ts","../../src/xlsx/xform/drawing/one-cell-anchor-xform.ts","../../src/xlsx/xform/drawing/drawing-xform.ts","../../src/xlsx/xform/table/custom-filter-xform.ts","../../src/xlsx/xform/table/filter-xform.ts","../../src/xlsx/xform/table/filter-column-xform.ts","../../src/xlsx/xform/table/auto-filter-xform.ts","../../src/xlsx/xform/table/table-column-xform.ts","../../src/xlsx/xform/table/table-style-info-xform.ts","../../src/xlsx/xform/table/table-xform.ts","../../src/xlsx/xform/pivot-table/pivot-cache-records-xform.ts","../../src/xlsx/xform/pivot-table/cache-field.ts","../../src/xlsx/xform/pivot-table/cache-field-xform.ts","../../src/xlsx/xform/pivot-table/pivot-cache-definition-xform.ts","../../src/xlsx/xform/pivot-table/pivot-table-xform.ts","../../src/xlsx/xform/comment/comment-xform.ts","../../src/xlsx/xform/comment/comments-xform.ts","../../src/xlsx/xform/comment/vml-textbox-xform.ts","../../src/xlsx/xform/comment/vml-anchor-xform.ts","../../src/xlsx/xform/comment/style/vml-protection-xform.ts","../../src/xlsx/xform/comment/style/vml-position-xform.ts","../../src/xlsx/xform/comment/vml-client-data-xform.ts","../../src/xlsx/xform/comment/vml-shape-xform.ts","../../src/xlsx/xform/comment/vml-notes-xform.ts","../../src/xlsx/xml/theme1.ts","../../src/xlsx/xlsx.base.ts","../../src/xlsx/xlsx.browser.ts","../../src/utils/datetime.ts","../../src/csv/csv-core.ts","../../src/csv/csv.base.ts","../../src/csv/csv.browser.ts","../../src/doc/workbook.browser.ts","../../src/types.ts","../../src/utils/cell-format.ts","../../src/utils/sheet-utils.ts"],"sourcesContent":["import type { Address, Location } from \"../types\";\n\nconst addressRegex = /^[A-Z]+\\d+$/;\n\n// Internal type with required $col$row for caching\ntype CachedAddress = Address & { $col$row: string };\n\nexport type DecodedRange = Location & {\n tl: string | CachedAddress;\n br: string | CachedAddress;\n dimensions: string;\n sheetName?: string;\n};\n\ninterface ErrorReference {\n error: string;\n sheetName?: string;\n}\n\ntype DecodeExResult = CachedAddress | DecodedRange | ErrorReference;\n\ninterface ColCache {\n _dictionary: string[];\n _l2nFill: number;\n _l2n: Record<string, number>;\n _n2l: string[];\n _hash: Record<string, CachedAddress>;\n _level(n: number): number;\n _fill(level: number): void;\n l2n(l: string): number;\n n2l(n: number): string;\n validateAddress(value: string): boolean;\n decodeAddress(value: string): CachedAddress;\n getAddress(r: number | string, c?: number): CachedAddress;\n decode(value: string): CachedAddress | DecodedRange;\n decodeEx(value: string): DecodeExResult;\n encodeAddress(row: number, col: number): string;\n encode(...args: number[]): string;\n inRange(range: number[], address: number[]): boolean;\n}\n\n// =========================================================================\n// Column Letter to Number conversion\nconst colCache: ColCache = {\n _dictionary: [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\"\n ],\n _l2nFill: 0,\n _l2n: {} as Record<string, number>,\n _n2l: [] as string[],\n _level(n: number): number {\n if (n <= 26) {\n return 1;\n }\n if (n <= 26 * 26) {\n return 2;\n }\n return 3;\n },\n _fill(level: number): void {\n let c: string;\n let v: number;\n let l1: number;\n let l2: number;\n let l3: number;\n let n = 1;\n if (level >= 4) {\n throw new Error(\"Out of bounds. Excel supports columns from 1 to 16384\");\n }\n if (this._l2nFill < 1 && level >= 1) {\n while (n <= 26) {\n c = this._dictionary[n - 1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 1;\n }\n if (this._l2nFill < 2 && level >= 2) {\n n = 27;\n while (n <= 26 + 26 * 26) {\n v = n - (26 + 1);\n l1 = v % 26;\n l2 = Math.floor(v / 26);\n c = this._dictionary[l2] + this._dictionary[l1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 2;\n }\n if (this._l2nFill < 3 && level >= 3) {\n n = 26 + 26 * 26 + 1;\n while (n <= 16384) {\n v = n - (26 * 26 + 26 + 1);\n l1 = v % 26;\n l2 = Math.floor(v / 26) % 26;\n l3 = Math.floor(v / (26 * 26));\n c = this._dictionary[l3] + this._dictionary[l2] + this._dictionary[l1];\n this._n2l[n] = c;\n this._l2n[c] = n;\n n++;\n }\n this._l2nFill = 3;\n }\n },\n l2n(l: string): number {\n if (!this._l2n[l]) {\n this._fill(l.length);\n }\n if (!this._l2n[l]) {\n throw new Error(`Out of bounds. Invalid column letter: ${l}`);\n }\n return this._l2n[l];\n },\n n2l(n: number): string {\n if (n < 1 || n > 16384) {\n throw new Error(`${n} is out of bounds. Excel supports columns from 1 to 16384`);\n }\n if (!this._n2l[n]) {\n this._fill(this._level(n));\n }\n return this._n2l[n];\n },\n\n // =========================================================================\n // Address processing\n _hash: {} as Record<string, CachedAddress>,\n\n // check if value looks like an address\n validateAddress(value: string): boolean {\n if (!addressRegex.test(value)) {\n throw new Error(`Invalid Address: ${value}`);\n }\n return true;\n },\n\n // convert address string into structure\n decodeAddress(value: string): CachedAddress {\n const addr = value.length < 5 && this._hash[value];\n if (addr) {\n return addr;\n }\n let hasCol = false;\n let col = \"\";\n let colNumber: number | undefined = 0;\n let hasRow = false;\n let row = \"\";\n let rowNumber: number | undefined = 0;\n for (let i = 0, char; i < value.length; i++) {\n char = value.charCodeAt(i);\n // col should before row\n if (!hasRow && char >= 65 && char <= 90) {\n // 65 = 'A'.charCodeAt(0)\n // 90 = 'Z'.charCodeAt(0)\n hasCol = true;\n col += value[i];\n // colNumber starts from 1\n colNumber = colNumber * 26 + char - 64;\n } else if (char >= 48 && char <= 57) {\n // 48 = '0'.charCodeAt(0)\n // 57 = '9'.charCodeAt(0)\n hasRow = true;\n row += value[i];\n // rowNumber starts from 0\n rowNumber = rowNumber * 10 + char - 48;\n } else if (hasRow && hasCol && char !== 36) {\n // 36 = '$'.charCodeAt(0)\n break;\n }\n }\n if (!hasCol) {\n colNumber = undefined;\n } else if (colNumber! > 16384) {\n throw new Error(`Out of bounds. Invalid column letter: ${col}`);\n }\n if (!hasRow) {\n rowNumber = undefined;\n }\n\n // in case $row$col\n value = col + row;\n\n const address: CachedAddress = {\n address: value,\n col: colNumber!,\n row: rowNumber!,\n $col$row: `$${col}$${row}`\n };\n\n // mem fix - cache only the tl 100x100 square\n if (colNumber! <= 100 && rowNumber! <= 100) {\n this._hash[value] = address;\n this._hash[address.$col$row] = address;\n }\n\n return address;\n },\n\n // convert r,c into structure (if only 1 arg, assume r is address string)\n getAddress(r: number | string, c?: number): CachedAddress {\n if (c) {\n const address = this.n2l(c) + r;\n return this.decodeAddress(address);\n }\n return this.decodeAddress(r as string);\n },\n\n // convert [address], [tl:br] into address structures\n decode(value: string) {\n const parts = value.split(\":\");\n if (parts.length === 2) {\n const tl = this.decodeAddress(parts[0]);\n const br = this.decodeAddress(parts[1]);\n const result: DecodedRange = {\n top: Math.min(tl.row, br.row),\n left: Math.min(tl.col, br.col),\n bottom: Math.max(tl.row, br.row),\n right: Math.max(tl.col, br.col),\n tl: \"\",\n br: \"\",\n dimensions: \"\"\n };\n // reconstruct tl, br and dimensions\n result.tl = this.n2l(result.left) + result.top;\n result.br = this.n2l(result.right) + result.bottom;\n result.dimensions = `${result.tl}:${result.br}`;\n return result;\n }\n return this.decodeAddress(value);\n },\n\n // convert [sheetName!][$]col[$]row[[$]col[$]row] into address or range structures\n decodeEx(value: string): DecodeExResult {\n // Use possessive quantifiers to prevent catastrophic backtracking (ReDoS)\n const groups = value.match(/^(?:(?:(?:'((?:[^']|'')+?)')|([^'^ !]+?))!)?(.*)$/);\n\n const sheetName = groups![1] || groups![2]; // Quoted and unquoted groups\n const reference = groups![3]; // Remaining address\n\n const parts = reference.split(\":\");\n if (parts.length > 1) {\n const tl = this.decodeAddress(parts[0]);\n const br = this.decodeAddress(parts[1]);\n const top = Math.min(tl.row, br.row);\n const left = Math.min(tl.col, br.col);\n const bottom = Math.max(tl.row, br.row);\n const right = Math.max(tl.col, br.col);\n\n const tlStr = this.n2l(left) + top;\n const brStr = this.n2l(right) + bottom;\n\n return {\n top,\n left,\n bottom,\n right,\n sheetName,\n tl: {\n address: tlStr,\n col: left,\n row: top,\n $col$row: `$${this.n2l(left)}$${top}`,\n sheetName\n },\n br: {\n address: brStr,\n col: right,\n row: bottom,\n $col$row: `$${this.n2l(right)}$${bottom}`,\n sheetName\n },\n dimensions: `${tlStr}:${brStr}`\n };\n }\n if (reference.indexOf(\"#\") === 0) {\n return sheetName ? { sheetName, error: reference } : { error: reference };\n }\n\n const address = this.decodeAddress(reference);\n return sheetName ? { sheetName, ...address } : address;\n },\n\n // convert row,col into address string\n encodeAddress(row: number, col: number): string {\n return colCache.n2l(col) + row;\n },\n\n // convert row,col into string address or t,l,b,r into range\n encode(...args: number[]): string {\n switch (args.length) {\n case 2:\n return colCache.encodeAddress(args[0], args[1]);\n case 4:\n return `${colCache.encodeAddress(args[0], args[1])}:${colCache.encodeAddress(args[2], args[3])}`;\n default:\n throw new Error(\"Can only encode with 2 or 4 arguments\");\n }\n },\n\n // return true if address is contained within range\n inRange(range: number[], address: number[]): boolean {\n const [left, top, , right, bottom] = range;\n const [col, row] = address;\n return col >= left && col <= right && row >= top && row <= bottom;\n }\n};\n\nexport { colCache };\n","import { colCache } from \"../utils/col-cache\";\nimport type { Address } from \"../types\";\n\ninterface RangeModel {\n top: number;\n left: number;\n bottom: number;\n right: number;\n sheetName?: string;\n}\n\ninterface RowDimensions {\n min: number;\n max: number;\n}\n\ninterface RowWithDimensions {\n number: number;\n dimensions?: RowDimensions;\n}\n\n// Input types for Range constructor and decode\nexport type RangeInput = Range | RangeModel | string | number | RangeInput[];\n\n// used by worksheet to calculate sheet dimensions\nclass Range {\n model: RangeModel = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n };\n\n // Constructor overloads\n constructor();\n constructor(range: Range);\n constructor(model: RangeModel);\n constructor(rangeString: string);\n constructor(args: RangeInput[]);\n constructor(tl: string, br: string);\n constructor(tl: string, br: string, sheetName: string);\n constructor(top: number, left: number, bottom: number, right: number);\n constructor(top: number, left: number, bottom: number, right: number, sheetName: string);\n constructor(...args: RangeInput[]) {\n this.decode(args);\n }\n\n // setTLBR overloads\n setTLBR(tl: string, br: string, sheetName?: string): void;\n setTLBR(top: number, left: number, bottom: number, right: number, sheetName?: string): void;\n setTLBR(\n t: number | string,\n l: number | string,\n b?: number | string,\n r?: number,\n s?: string\n ): void {\n if (typeof t === \"string\" && typeof l === \"string\") {\n // setTLBR(tl, br, s) - t and l are address strings\n const tl = colCache.decodeAddress(t);\n const br = colCache.decodeAddress(l);\n this.model = {\n top: Math.min(tl.row, br.row),\n left: Math.min(tl.col, br.col),\n bottom: Math.max(tl.row, br.row),\n right: Math.max(tl.col, br.col),\n sheetName: typeof b === \"string\" ? b : undefined\n };\n } else if (\n typeof t === \"number\" &&\n typeof l === \"number\" &&\n typeof b === \"number\" &&\n typeof r === \"number\"\n ) {\n // setTLBR(t, l, b, r, s) - all numbers\n this.model = {\n top: Math.min(t, b),\n left: Math.min(l, r),\n bottom: Math.max(t, b),\n right: Math.max(l, r),\n sheetName: s\n };\n }\n }\n\n private decode(argv: RangeInput[]): void {\n switch (argv.length) {\n case 5: // [t,l,b,r,s]\n if (\n typeof argv[0] === \"number\" &&\n typeof argv[1] === \"number\" &&\n typeof argv[2] === \"number\" &&\n typeof argv[3] === \"number\" &&\n typeof argv[4] === \"string\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2], argv[3], argv[4]);\n }\n break;\n case 4: // [t,l,b,r]\n if (\n typeof argv[0] === \"number\" &&\n typeof argv[1] === \"number\" &&\n typeof argv[2] === \"number\" &&\n typeof argv[3] === \"number\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2], argv[3]);\n }\n break;\n\n case 3: // [tl,br,s]\n if (\n typeof argv[0] === \"string\" &&\n typeof argv[1] === \"string\" &&\n typeof argv[2] === \"string\"\n ) {\n this.setTLBR(argv[0], argv[1], argv[2]);\n }\n break;\n case 2: // [tl,br]\n if (typeof argv[0] === \"string\" && typeof argv[1] === \"string\") {\n this.setTLBR(argv[0], argv[1]);\n }\n break;\n\n case 1: {\n const value = argv[0];\n if (value instanceof Range) {\n // copy constructor\n this.model = {\n top: value.model.top,\n left: value.model.left,\n bottom: value.model.bottom,\n right: value.model.right,\n sheetName: value.sheetName\n };\n } else if (Array.isArray(value)) {\n // an arguments array\n this.decode(value);\n } else if (\n typeof value === \"object\" &&\n \"top\" in value &&\n \"left\" in value &&\n \"bottom\" in value &&\n \"right\" in value\n ) {\n // a model\n this.model = {\n top: value.top,\n left: value.left,\n bottom: value.bottom,\n right: value.right,\n sheetName: value.sheetName\n };\n } else if (typeof value === \"string\") {\n // [sheetName!]tl:br\n const decoded = colCache.decodeEx(value);\n if (\"top\" in decoded) {\n // It's a DecodedRange\n this.model = {\n top: decoded.top,\n left: decoded.left,\n bottom: decoded.bottom,\n right: decoded.right,\n sheetName: decoded.sheetName\n };\n } else if (\"row\" in decoded) {\n // It's an Address\n this.model = {\n top: decoded.row,\n left: decoded.col,\n bottom: decoded.row,\n right: decoded.col,\n sheetName: decoded.sheetName\n };\n }\n }\n break;\n }\n\n case 0:\n this.model = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n };\n break;\n\n default:\n throw new Error(`Invalid number of arguments to _getDimensions() - ${argv.length}`);\n }\n }\n\n get top(): number {\n return this.model.top || 1;\n }\n\n set top(value: number) {\n this.model.top = value;\n }\n\n get left(): number {\n return this.model.left || 1;\n }\n\n set left(value: number) {\n this.model.left = value;\n }\n\n get bottom(): number {\n return this.model.bottom || 1;\n }\n\n set bottom(value: number) {\n this.model.bottom = value;\n }\n\n get right(): number {\n return this.model.right || 1;\n }\n\n set right(value: number) {\n this.model.right = value;\n }\n\n get sheetName(): string | undefined {\n return this.model.sheetName;\n }\n\n set sheetName(value: string | undefined) {\n this.model.sheetName = value;\n }\n\n get _serialisedSheetName(): string {\n const { sheetName } = this.model;\n if (sheetName) {\n if (/^[a-zA-Z0-9]*$/.test(sheetName)) {\n return `${sheetName}!`;\n }\n return `'${sheetName}'!`;\n }\n return \"\";\n }\n\n expand(top: number, left: number, bottom: number, right: number): void {\n if (!this.model.top || top < this.top) {\n this.top = top;\n }\n if (!this.model.left || left < this.left) {\n this.left = left;\n }\n if (!this.model.bottom || bottom > this.bottom) {\n this.bottom = bottom;\n }\n if (!this.model.right || right > this.right) {\n this.right = right;\n }\n }\n\n expandRow(row: RowWithDimensions | null | undefined): void {\n if (row) {\n const { dimensions, number } = row;\n if (dimensions) {\n this.expand(number, dimensions.min, number, dimensions.max);\n }\n }\n }\n\n expandToAddress(addressStr: string): void {\n const address = colCache.decodeEx(addressStr);\n if (\"row\" in address && \"col\" in address) {\n this.expand(address.row, address.col, address.row, address.col);\n }\n }\n\n get tl(): string {\n return colCache.n2l(this.left) + this.top;\n }\n\n get $t$l(): string {\n return `$${colCache.n2l(this.left)}$${this.top}`;\n }\n\n get br(): string {\n return colCache.n2l(this.right) + this.bottom;\n }\n\n get $b$r(): string {\n return `$${colCache.n2l(this.right)}$${this.bottom}`;\n }\n\n get range(): string {\n return `${this._serialisedSheetName + this.tl}:${this.br}`;\n }\n\n get $range(): string {\n return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;\n }\n\n get shortRange(): string {\n return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;\n }\n\n get $shortRange(): string {\n return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;\n }\n\n get count(): number {\n return (1 + this.bottom - this.top) * (1 + this.right - this.left);\n }\n\n toString(): string {\n return this.range;\n }\n\n intersects(other: Range): boolean {\n if (other.sheetName && this.sheetName && other.sheetName !== this.sheetName) {\n return false;\n }\n if (other.bottom < this.top) {\n return false;\n }\n if (other.top > this.bottom) {\n return false;\n }\n if (other.right < this.left) {\n return false;\n }\n if (other.left > this.right) {\n return false;\n }\n return true;\n }\n\n contains(addressStr: string): boolean {\n const address = colCache.decodeEx(addressStr);\n if (\"row\" in address && \"col\" in address) {\n return this.containsEx(address);\n }\n return false;\n }\n\n containsEx(address: Address): boolean {\n if (address.sheetName && this.sheetName && address.sheetName !== this.sheetName) {\n return false;\n }\n return (\n address.row >= this.top &&\n address.row <= this.bottom &&\n address.col >= this.left &&\n address.col <= this.right\n );\n }\n\n forEachAddress(cb: (address: string, row: number, col: number) => void): void {\n for (let col = this.left; col <= this.right; col++) {\n for (let row = this.top; row <= this.bottom; row++) {\n cb(colCache.encodeAddress(row, col), row, col);\n }\n }\n }\n}\n\nexport { Range };\nexport { Range as Dimensions };\n","export enum ValueType {\n Null = 0,\n Merge = 1,\n Number = 2,\n String = 3,\n Date = 4,\n Hyperlink = 5,\n Formula = 6,\n SharedString = 7,\n RichText = 8,\n Boolean = 9,\n Error = 10,\n JSON = 11 // Internal type for JSON values that serialize as String\n}\n\nexport enum FormulaType {\n None = 0,\n Master = 1,\n Shared = 2\n}\n\nexport enum RelationshipType {\n None = 0,\n OfficeDocument = 1,\n Worksheet = 2,\n CalcChain = 3,\n SharedStrings = 4,\n Styles = 5,\n Theme = 6,\n Hyperlink = 7\n}\n\nexport enum DocumentType {\n Xlsx = 1\n}\n\nexport enum ReadingOrder {\n LeftToRight = 1,\n RightToLeft = 2\n}\n\nexport const ErrorValue = {\n NotApplicable: \"#N/A\",\n Ref: \"#REF!\",\n Name: \"#NAME?\",\n DivZero: \"#DIV/0!\",\n Null: \"#NULL!\",\n Value: \"#VALUE!\",\n Num: \"#NUM!\"\n} as const;\n\nexport type ErrorValueType = (typeof ErrorValue)[keyof typeof ErrorValue];\n\nexport const Enums = {\n ValueType,\n FormulaType,\n RelationshipType,\n DocumentType,\n ReadingOrder,\n ErrorValue\n};\n","const { toString } = Object.prototype;\nconst escapeHtmlRegex = /[\"&<>]/;\n\nexport function isEqual(a: any, b: any): boolean {\n const aType = typeof a;\n const bType = typeof b;\n const aArray = Array.isArray(a);\n const bArray = Array.isArray(b);\n let keys: string[];\n\n if (aType !== bType) {\n return false;\n }\n switch (typeof a) {\n case \"object\":\n if (aArray || bArray) {\n if (aArray && bArray) {\n return (\n a.length === b.length &&\n a.every((aValue: any, index: number) => {\n const bValue = b[index];\n return isEqual(aValue, bValue);\n })\n );\n }\n return false;\n }\n\n if (a === null || b === null) {\n return a === b;\n }\n\n // Compare object keys and values\n keys = Object.keys(a);\n\n if (Object.keys(b).length !== keys.length) {\n return false;\n }\n\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n }\n\n return keys.every(key => {\n const aValue = a[key];\n const bValue = b[key];\n return isEqual(aValue, bValue);\n });\n\n default:\n return a === b;\n }\n}\n\nexport function escapeHtml(html: string): string {\n const regexResult = escapeHtmlRegex.exec(html);\n if (!regexResult) {\n return html;\n }\n\n let result = \"\";\n let escape = \"\";\n let lastIndex = 0;\n let i = regexResult.index;\n for (; i < html.length; i++) {\n switch (html.charAt(i)) {\n case '\"':\n escape = \"&quot;\";\n break;\n case \"&\":\n escape = \"&amp;\";\n break;\n case \"<\":\n escape = \"&lt;\";\n break;\n case \">\":\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n if (lastIndex !== i) {\n result += html.substring(lastIndex, i);\n }\n lastIndex = i + 1;\n result += escape;\n }\n if (lastIndex !== i) {\n return result + html.substring(lastIndex, i);\n }\n return result;\n}\n\nexport function isUndefined(val: any): val is undefined {\n return toString.call(val) === \"[object Undefined]\";\n}\n\nexport function isObject(val: any): val is Record<string, any> {\n return toString.call(val) === \"[object Object]\";\n}\n\nexport function deepMerge<T = any>(...args: any[]): T {\n const target: any = args[0] || {};\n const { length } = args;\n let src: any, clone: any, copyIsArray: boolean;\n\n function assignValue(val: any, key: string | number): void {\n src = target[key];\n copyIsArray = Array.isArray(val);\n if (isObject(val) || copyIsArray) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && Array.isArray(src) ? src : [];\n } else {\n clone = src && isObject(src) ? src : {};\n }\n target[key] = deepMerge(clone, val);\n } else if (!isUndefined(val)) {\n target[key] = val;\n }\n }\n\n for (let i = 0; i < length; i++) {\n const arg = args[i];\n if (arg) {\n if (Array.isArray(arg)) {\n arg.forEach((val, index) => assignValue(val, index));\n } else {\n Object.entries(arg).forEach(([key, val]) => {\n // Prevent prototype pollution\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n return;\n }\n assignValue(val, key);\n });\n }\n }\n }\n return target;\n}\n\nexport function cloneDeep(obj: any, preserveUndefined?: boolean): any {\n if (preserveUndefined === undefined) {\n preserveUndefined = true;\n }\n let clone: any;\n if (obj === null) {\n return null;\n }\n if (obj instanceof Date) {\n return obj;\n }\n if (obj instanceof Array) {\n clone = [];\n obj.forEach((value: any, index: number) => {\n if (value !== undefined) {\n clone[index] = cloneDeep(value, preserveUndefined);\n } else if (preserveUndefined) {\n clone[index] = undefined;\n }\n });\n } else if (typeof obj === \"object\") {\n clone = {};\n Object.keys(obj).forEach(name => {\n const value = obj[name];\n if (value !== undefined) {\n clone[name] = cloneDeep(value, preserveUndefined);\n } else if (preserveUndefined) {\n clone[name] = undefined;\n }\n });\n } else {\n return obj;\n }\n return clone;\n}\n\nexport function get<T = any>(obj: any, path: string, defaultValue?: T): T {\n const keys = path.split(\".\");\n return keys.reduce((result, key) => result?.[key], obj) ?? defaultValue;\n}\n","import { deepMerge } from \"../utils/under-dash\";\n\ninterface NoteText {\n text: string;\n [key: string]: any;\n}\n\ninterface NoteConfig {\n margins?: {\n insetmode?: string;\n inset?: number[];\n };\n protection?: {\n locked?: string;\n lockText?: string;\n };\n editAs?: string;\n texts?: NoteText[];\n}\n\ninterface NoteModel {\n type: string;\n note: NoteConfig;\n}\n\nclass Note {\n note: string | NoteConfig;\n\n static DEFAULT_CONFIGS: NoteModel = {\n note: {\n margins: {\n insetmode: \"auto\",\n inset: [0.13, 0.13, 0.25, 0.25]\n },\n protection: {\n locked: \"True\",\n lockText: \"True\"\n },\n editAs: \"absolute\"\n },\n type: \"note\"\n };\n\n constructor(note?: string | NoteConfig) {\n this.note = note!;\n }\n\n get model(): NoteModel {\n let value: NoteModel | null = null;\n switch (typeof this.note) {\n case \"string\":\n value = {\n type: \"note\",\n note: {\n texts: [\n {\n text: this.note\n }\n ]\n }\n };\n break;\n default:\n value = {\n type: \"note\",\n note: this.note\n };\n break;\n }\n // Suitable for all cell comments\n return deepMerge<NoteModel>({}, Note.DEFAULT_CONFIGS, value);\n }\n\n set model(value: NoteModel) {\n const { note } = value;\n const { texts } = note;\n if (texts && texts.length === 1 && Object.keys(texts[0]).length === 1) {\n this.note = texts[0].text;\n } else {\n this.note = note;\n }\n }\n\n static fromModel(model: NoteModel): Note {\n const note = new Note();\n note.model = model;\n return note;\n }\n}\n\nexport { Note };\n","import { colCache } from \"./col-cache\";\n\n// const cellRefRegex = /(([a-z_\\-0-9]*)!)?[$]?([a-z]+)[$]?([1-9][0-9]*)/i;\nconst replacementCandidateRx = /(([a-z_\\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi;\nconst CRrx = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;\n\nfunction slideFormula(formula: string, fromCell: string, toCell: string): string {\n const offset = colCache.decode(fromCell);\n const to = colCache.decode(toCell);\n return formula.replace(\n replacementCandidateRx,\n (\n refMatch: string,\n sheet: string,\n sheetMaybe: string,\n addrPart: string,\n trailingParen: string\n ) => {\n if (trailingParen) {\n return refMatch;\n }\n const match = CRrx.exec(addrPart);\n if (match) {\n const colDollar = match[1];\n const colStr = match[2].toUpperCase();\n const rowDollar = match[3];\n const rowStr = match[4];\n if (colStr.length > 3 || (colStr.length === 3 && colStr > \"XFD\")) {\n // > XFD is the highest col number in excel 2007 and beyond, so this is a named range\n return refMatch;\n }\n let col = colCache.l2n(colStr);\n let row = parseInt(rowStr, 10);\n if (!colDollar) {\n col += (to as any).col - (offset as any).col;\n }\n if (!rowDollar) {\n row += (to as any).row - (offset as any).row;\n }\n const res = (sheet || \"\") + (colDollar || \"\") + colCache.n2l(col) + (rowDollar || \"\") + row;\n return res;\n }\n return refMatch;\n }\n );\n}\n\nexport { slideFormula };\n","import { colCache } from \"../utils/col-cache\";\nimport { Enums } from \"./enums\";\nimport { Note } from \"./note\";\nimport { escapeHtml } from \"../utils/under-dash\";\nimport { slideFormula } from \"../utils/shared-formula\";\nimport type { Row } from \"./row\";\nimport type { Column } from \"./column\";\nimport type { Worksheet } from \"./worksheet\";\nimport type { Workbook } from \"./workbook\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellRichTextValue,\n CellErrorValue,\n DataValidation,\n CellValue,\n CellHyperlinkValue\n} from \"../types\";\nimport type { DataValidations } from \"./data-validations\";\n\n// Alias for backward compatibility\nexport type HyperlinkValueData = CellHyperlinkValue;\n\nexport type FormulaResult = string | number | boolean | Date | CellErrorValue;\n\n// Extended formula type for internal use (includes shared formula fields)\nexport interface FormulaValueData {\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n date1904?: boolean;\n}\n\n// FullAddress for Cell - only needs basic fields for defined names\ninterface FullAddress {\n sheetName: string;\n address: string;\n row: number;\n col: number;\n}\n\nexport interface CellAddress {\n address: string;\n row: number;\n col: number;\n $col$row?: string;\n}\n\nexport interface NoteText {\n text: string;\n font?: Record<string, unknown>;\n}\n\nexport interface NoteConfig {\n texts?: NoteText[];\n margins?: { insetmode?: string; inset?: number[] };\n protection?: { locked?: string; lockText?: string };\n editAs?: string;\n}\n\nexport interface NoteModel {\n type: string;\n note: NoteConfig;\n}\n\nexport interface CellModel {\n address: string;\n type: number;\n // Internal value storage - type depends on cell type\n value?:\n | number\n | string\n | boolean\n | Date\n | CellRichTextValue\n | CellErrorValue\n | HyperlinkValueData;\n style?: Partial<Style>;\n comment?: NoteModel;\n text?: string;\n hyperlink?: string;\n tooltip?: string;\n master?: string;\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n richText?: CellRichTextValue;\n sharedString?: number;\n error?: CellErrorValue;\n rawValue?: unknown;\n}\n\n// Internal interface for Value type objects\ninterface ICellValue {\n model: CellModel;\n value: CellValueType;\n type: number;\n effectiveType: number;\n address: string;\n formula?: string;\n result?: FormulaResult;\n formulaType?: number;\n hyperlink?: string;\n master?: Cell;\n text?: string;\n release(): void;\n toCsvString(): string;\n toString(): string;\n isMergedTo?(master: Cell): boolean;\n}\n\n// Type for cell values (what users set/get) - alias for CellValue from types.ts\nexport type CellValueType = CellValue;\n\n// Cell requirements\n// Operate inside a worksheet\n// Store and retrieve a value with a range of types: text, number, date, hyperlink, reference, formula, etc.\n// Manage/use and manipulate cell format either as local to cell or inherited from column or row.\n\nclass Cell {\n static Types = Enums.ValueType;\n\n // Type declarations only - no runtime overhead\n declare private _row: Row;\n declare private _column: Column;\n declare private _address: string;\n\n declare private _value: ICellValue;\n declare public style: Partial<Style>;\n declare private _mergeCount: number;\n\n declare private _comment?: Note;\n\n constructor(row: Row, column: Column, address: string) {\n if (!row || !column) {\n throw new Error(\"A Cell needs a Row\");\n }\n\n this._row = row;\n this._column = column;\n\n colCache.validateAddress(address);\n this._address = address;\n\n // TODO: lazy evaluation of this._value\n this._value = Value.create(Cell.Types.Null, this);\n\n this.style = this._mergeStyle(row.style, column.style, {});\n\n this._mergeCount = 0;\n }\n\n get worksheet(): Worksheet {\n return this._row.worksheet;\n }\n\n get workbook(): Workbook {\n return this._row.worksheet.workbook;\n }\n\n // help GC by removing cyclic (and other) references\n destroy(): void {\n delete this.style;\n delete this._value;\n delete this._row;\n delete this._column;\n delete this._address;\n }\n\n // =========================================================================\n // Styles stuff\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n this.style.numFmt = value;\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n this.style.font = value;\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n this.style.alignment = value;\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n this.style.border = value;\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n this.style.fill = value;\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n this.style.protection = value;\n }\n\n private _mergeStyle(\n rowStyle: Partial<Style>,\n colStyle: Partial<Style>,\n style: Partial<Style>\n ): Partial<Style> {\n const numFmt = (rowStyle && rowStyle.numFmt) || (colStyle && colStyle.numFmt);\n if (numFmt) {\n style.numFmt = numFmt;\n }\n\n const font = (rowStyle && rowStyle.font) || (colStyle && colStyle.font);\n if (font) {\n style.font = font;\n }\n\n const alignment = (rowStyle && rowStyle.alignment) || (colStyle && colStyle.alignment);\n if (alignment) {\n style.alignment = alignment;\n }\n\n const border = (rowStyle && rowStyle.border) || (colStyle && colStyle.border);\n if (border) {\n style.border = border;\n }\n\n const fill = (rowStyle && rowStyle.fill) || (colStyle && colStyle.fill);\n if (fill) {\n style.fill = fill;\n }\n\n const protection = (rowStyle && rowStyle.protection) || (colStyle && colStyle.protection);\n if (protection) {\n style.protection = protection;\n }\n\n return style;\n }\n\n // =========================================================================\n // return the address for this cell\n get address(): string {\n return this._address;\n }\n\n get row(): number {\n return this._row.number;\n }\n\n get col(): number {\n return this._column.number;\n }\n\n get $col$row(): string {\n return `$${this._column.letter}$${this.row}`;\n }\n\n // =========================================================================\n // Value stuff\n\n get type(): number {\n return this._value.type;\n }\n\n get effectiveType(): number {\n return this._value.effectiveType;\n }\n\n toCsvString(): string {\n return this._value.toCsvString();\n }\n\n // =========================================================================\n // Merge stuff\n\n addMergeRef(): void {\n this._mergeCount++;\n }\n\n releaseMergeRef(): void {\n this._mergeCount--;\n }\n\n get isMerged(): boolean {\n return this._mergeCount > 0 || this.type === Cell.Types.Merge;\n }\n\n merge(master: Cell, ignoreStyle?: boolean): void {\n this._value.release();\n this._value = Value.create(Cell.Types.Merge, this, master);\n if (!ignoreStyle) {\n this.style = master.style;\n }\n }\n\n unmerge(): void {\n if (this.type === Cell.Types.Merge) {\n this._value.release();\n this._value = Value.create(Cell.Types.Null, this);\n this.style = this._mergeStyle(this._row.style, this._column.style, {});\n }\n }\n\n isMergedTo(master: Cell): boolean {\n if (this._value.type !== Cell.Types.Merge) {\n return false;\n }\n return this._value.isMergedTo(master);\n }\n\n get master(): Cell {\n if (this.type === Cell.Types.Merge) {\n return this._value.master;\n }\n return this; // an unmerged cell is its own master\n }\n\n get isHyperlink(): boolean {\n return this._value.type === Cell.Types.Hyperlink;\n }\n\n get hyperlink(): string | undefined {\n return this._value.hyperlink;\n }\n\n // return the value\n get value(): CellValueType {\n return this._value.value;\n }\n\n // set the value - can be number, string or raw\n set value(v: CellValueType) {\n // special case - merge cells set their master's value\n if (this.type === Cell.Types.Merge) {\n this._value.master!.value = v;\n return;\n }\n\n this._value.release();\n\n // assign value\n this._value = Value.create(Value.getType(v), this, v);\n }\n\n get note(): string | NoteConfig | undefined {\n if (!this._comment) {\n return undefined;\n }\n const noteValue = this._comment.note;\n return noteValue;\n }\n\n set note(note: string | NoteConfig) {\n this._comment = new Note(note);\n }\n\n // Internal comment accessor for row operations\n get comment(): Note | undefined {\n return this._comment;\n }\n\n set comment(comment: Note | NoteConfig | undefined) {\n if (comment === undefined) {\n this._comment = undefined;\n } else if (comment instanceof Note) {\n this._comment = comment;\n } else {\n this._comment = new Note(comment);\n }\n }\n\n get text(): string {\n return this._value.toString();\n }\n\n get html(): string {\n return escapeHtml(this.text);\n }\n\n toString(): string {\n return this.text;\n }\n\n _upgradeToHyperlink(hyperlink: string): void {\n // if this cell is a string, turn it into a Hyperlink\n if (this.type === Cell.Types.String) {\n this._value = Value.create(Cell.Types.Hyperlink, this, {\n text: String(this._value.value),\n hyperlink\n });\n }\n }\n\n // =========================================================================\n // Formula stuff\n get formula(): string | undefined {\n return this._value.formula;\n }\n\n get result(): FormulaResult | undefined {\n return this._value.result;\n }\n\n get formulaType(): number {\n return this._value.formulaType;\n }\n\n // =========================================================================\n // Name stuff\n get fullAddress(): FullAddress {\n const { worksheet } = this._row;\n return {\n sheetName: worksheet.name,\n address: this.address,\n row: this.row,\n col: this.col\n };\n }\n\n get name(): string {\n return this.names[0];\n }\n\n set name(value: string) {\n this.names = [value];\n }\n\n get names(): string[] {\n return this.workbook.definedNames.getNamesEx(this.fullAddress);\n }\n\n set names(value: string[]) {\n const { definedNames } = this.workbook;\n definedNames.removeAllNames(this.fullAddress);\n value.forEach(name => {\n definedNames.addEx(this.fullAddress, name);\n });\n }\n\n addName(name: string): void {\n this.workbook.definedNames.addEx(this.fullAddress, name);\n }\n\n removeName(name: string): void {\n this.workbook.definedNames.removeEx(this.fullAddress, name);\n }\n\n removeAllNames(): void {\n this.workbook.definedNames.removeAllNames(this.fullAddress);\n }\n\n // =========================================================================\n // Data Validation stuff\n private get _dataValidations(): DataValidations {\n return this.worksheet.dataValidations;\n }\n\n get dataValidation(): DataValidation | undefined {\n return this._dataValidations.find(this.address);\n }\n\n set dataValidation(value: DataValidation) {\n this._dataValidations.add(this.address, value);\n }\n\n // =========================================================================\n // Model stuff\n\n get model(): CellModel {\n const { model } = this._value;\n model.style = this.style;\n if (this._comment) {\n model.comment = this._comment.model;\n }\n return model;\n }\n\n set model(value: CellModel) {\n this._value.release();\n this._value = Value.create(value.type, this);\n this._value.model = value;\n\n if (value.comment) {\n switch (value.comment.type) {\n case \"note\":\n this._comment = Note.fromModel(value.comment);\n break;\n }\n }\n\n if (value.style) {\n this.style = value.style;\n } else {\n this.style = {};\n }\n }\n}\n\n// =============================================================================\n// Internal Value Types\n\n// Internal model interfaces for type safety within Value classes\ninterface NullValueModel {\n address: string;\n type: number;\n}\n\ninterface NumberValueModel {\n address: string;\n type: number;\n value: number;\n}\n\ninterface StringValueModel {\n address: string;\n type: number;\n value: string;\n}\n\ninterface DateValueModel {\n address: string;\n type: number;\n value: Date;\n}\n\ninterface BooleanValueModel {\n address: string;\n type: number;\n value: boolean;\n}\n\ninterface HyperlinkValueModel {\n address: string;\n type: number;\n text?: string;\n hyperlink?: string;\n tooltip?: string;\n}\n\ninterface MergeValueModel {\n address: string;\n type: number;\n master?: string;\n}\n\ninterface FormulaValueModel {\n address: string;\n type: number;\n shareType?: string;\n ref?: string;\n formula?: string;\n sharedFormula?: string;\n result?: FormulaResult;\n}\n\ninterface SharedStringValueModel {\n address: string;\n type: number;\n value: number;\n}\n\ninterface RichTextValueModel {\n address: string;\n type: number;\n value: CellRichTextValue;\n}\n\ninterface ErrorValueModel {\n address: string;\n type: number;\n value: CellErrorValue;\n}\n\ninterface JSONValueModel {\n address: string;\n type: number;\n value: string;\n rawValue: unknown;\n}\n\nclass NullValue {\n declare public model: NullValueModel;\n\n constructor(cell: Cell) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Null\n };\n }\n\n get value(): null {\n return null;\n }\n\n set value(_value: any) {\n // nothing to do\n }\n\n get type(): number {\n return Cell.Types.Null;\n }\n\n get effectiveType(): number {\n return Cell.Types.Null;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return \"\";\n }\n\n release(): void {}\n\n toString(): string {\n return \"\";\n }\n}\n\nclass NumberValue {\n declare public model: NumberValueModel;\n\n constructor(cell: Cell, value: number) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Number,\n value\n };\n }\n\n get value(): number {\n return this.model.value;\n }\n\n set value(value: number) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Number;\n }\n\n get effectiveType(): number {\n return Cell.Types.Number;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass StringValue {\n declare public model: StringValueModel;\n\n constructor(cell: Cell, value: string) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value\n };\n }\n\n get value(): string {\n return this.model.value;\n }\n\n set value(value: string) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.String;\n }\n\n get effectiveType(): number {\n return Cell.Types.String;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return `\"${this.model.value.replace(/\"/g, '\"\"')}\"`;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value;\n }\n}\n\nclass RichTextValue {\n declare public model: RichTextValueModel;\n\n constructor(cell: Cell, value: CellRichTextValue) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value\n };\n }\n\n get value(): CellRichTextValue {\n return this.model.value;\n }\n\n set value(value: CellRichTextValue) {\n this.model.value = value;\n }\n\n toString(): string {\n return this.model.value.richText.map(t => t.text).join(\"\");\n }\n\n get type(): number {\n return Cell.Types.RichText;\n }\n\n get effectiveType(): number {\n return Cell.Types.RichText;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n get text(): string {\n return this.toString();\n }\n\n toCsvString(): string {\n return `\"${this.text.replace(/\"/g, '\"\"')}\"`;\n }\n\n release(): void {}\n}\n\nclass DateValue {\n declare public model: DateValueModel;\n\n constructor(cell: Cell, value: Date) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Date,\n value\n };\n }\n\n get value(): Date {\n return this.model.value;\n }\n\n set value(value: Date) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Date;\n }\n\n get effectiveType(): number {\n return Cell.Types.Date;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toISOString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass HyperlinkValue {\n declare public model: HyperlinkValueModel;\n\n constructor(cell: Cell, value?: HyperlinkValueData) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Hyperlink,\n text: value ? value.text : undefined,\n hyperlink: value ? value.hyperlink : undefined\n };\n if (value && value.tooltip) {\n this.model.tooltip = value.tooltip;\n }\n }\n\n get value(): HyperlinkValueData {\n return {\n text: this.model.text || \"\",\n hyperlink: this.model.hyperlink || \"\",\n tooltip: this.model.tooltip\n };\n }\n\n set value(value: HyperlinkValueData) {\n this.model.text = value.text;\n this.model.hyperlink = value.hyperlink;\n if (value.tooltip) {\n this.model.tooltip = value.tooltip;\n }\n }\n\n get text(): string | undefined {\n return this.model.text;\n }\n\n set text(value: string | undefined) {\n this.model.text = value;\n }\n\n get hyperlink(): string | undefined {\n return this.model.hyperlink;\n }\n\n set hyperlink(value: string | undefined) {\n this.model.hyperlink = value;\n }\n\n get type(): number {\n return Cell.Types.Hyperlink;\n }\n\n get effectiveType(): number {\n return Cell.Types.Hyperlink;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.hyperlink || \"\";\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.text || \"\";\n }\n}\n\nclass MergeValue {\n declare public model: MergeValueModel;\n declare private _master: Cell;\n\n constructor(cell: Cell, master?: Cell) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Merge,\n master: master ? master.address : undefined\n };\n this._master = master;\n if (master) {\n master.addMergeRef();\n }\n }\n\n get value(): CellValueType {\n return this._master.value;\n }\n\n set value(value: CellValueType | Cell) {\n if (value instanceof Cell) {\n if (this._master) {\n this._master.releaseMergeRef();\n }\n value.addMergeRef();\n this._master = value;\n } else {\n this._master.value = value;\n }\n }\n\n isMergedTo(master: Cell): boolean {\n return master === this._master;\n }\n\n get master(): Cell {\n return this._master;\n }\n\n get type(): number {\n return Cell.Types.Merge;\n }\n\n get effectiveType(): number {\n return this._master.effectiveType;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return \"\";\n }\n\n release(): void {\n this._master.releaseMergeRef();\n }\n\n toString(): string {\n return this.value.toString();\n }\n}\n\nclass FormulaValue {\n declare public cell: Cell;\n declare public model: FormulaValueModel;\n declare private _translatedFormula?: string;\n\n constructor(cell: Cell, value?: FormulaValueData) {\n this.cell = cell;\n\n this.model = {\n address: cell.address,\n type: Cell.Types.Formula,\n shareType: value ? value.shareType : undefined,\n ref: value ? value.ref : undefined,\n formula: value ? value.formula : undefined,\n sharedFormula: value ? value.sharedFormula : undefined,\n result: value ? value.result : undefined\n };\n }\n\n private _copyModel(model: FormulaValueModel): FormulaValueData {\n const copy: FormulaValueData = {};\n if (model.formula) {\n copy.formula = model.formula;\n }\n if (model.result !== undefined) {\n copy.result = model.result;\n }\n if (model.ref) {\n copy.ref = model.ref;\n }\n if (model.shareType) {\n copy.shareType = model.shareType;\n }\n if (model.sharedFormula) {\n copy.sharedFormula = model.sharedFormula;\n }\n return copy;\n }\n\n get value(): FormulaValueData {\n return this._copyModel(this.model);\n }\n\n set value(value: FormulaValueData) {\n if (value.formula) {\n this.model.formula = value.formula;\n }\n if (value.result !== undefined) {\n this.model.result = value.result;\n }\n if (value.ref) {\n this.model.ref = value.ref;\n }\n if (value.shareType) {\n this.model.shareType = value.shareType;\n }\n if (value.sharedFormula) {\n this.model.sharedFormula = value.sharedFormula;\n }\n }\n\n validate(value: CellValueType): void {\n switch (Value.getType(value)) {\n case Cell.Types.Null:\n case Cell.Types.String:\n case Cell.Types.Number:\n case Cell.Types.Date:\n break;\n case Cell.Types.Hyperlink:\n case Cell.Types.Formula:\n default:\n throw new Error(\"Cannot process that type of result value\");\n }\n }\n\n get dependencies(): { ranges: string[] | null; cells: string[] | null } {\n // find all the ranges and cells mentioned in the formula\n const ranges = this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g);\n const cells = this.formula\n .replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g, \"\")\n .match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}/g);\n return {\n ranges,\n cells\n };\n }\n\n get formula(): string {\n return this.model.formula || this._getTranslatedFormula() || \"\";\n }\n\n set formula(value: string) {\n this.model.formula = value;\n }\n\n get formulaType(): number {\n if (this.model.formula) {\n return Enums.FormulaType.Master;\n }\n if (this.model.sharedFormula) {\n return Enums.FormulaType.Shared;\n }\n return Enums.FormulaType.None;\n }\n\n get result(): FormulaResult | undefined {\n return this.model.result;\n }\n\n set result(value: FormulaResult | undefined) {\n this.model.result = value;\n }\n\n get type(): number {\n return Cell.Types.Formula;\n }\n\n get effectiveType(): number {\n const v = this.model.result;\n if (v === null || v === undefined) {\n return Enums.ValueType.Null;\n }\n if (v instanceof String || typeof v === \"string\") {\n return Enums.ValueType.String;\n }\n if (typeof v === \"number\") {\n return Enums.ValueType.Number;\n }\n if (v instanceof Date) {\n return Enums.ValueType.Date;\n }\n if (typeof v === \"object\" && \"error\" in v) {\n return Enums.ValueType.Error;\n }\n\n return Enums.ValueType.Null;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n _getTranslatedFormula(): string | undefined {\n if (!this._translatedFormula && this.model.sharedFormula) {\n const { worksheet } = this.cell;\n const master = worksheet.findCell(this.model.sharedFormula);\n this._translatedFormula =\n master && slideFormula(master.formula, master.address, this.model.address);\n }\n return this._translatedFormula;\n }\n\n toCsvString(): string {\n return `${this.model.result || \"\"}`;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.result ? this.model.result.toString() : \"\";\n }\n}\n\nclass SharedStringValue {\n declare public model: SharedStringValueModel;\n\n constructor(cell: Cell, value: number) {\n this.model = {\n address: cell.address,\n type: Cell.Types.SharedString,\n value\n };\n }\n\n get value(): number {\n return this.model.value;\n }\n\n set value(value: number) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.SharedString;\n }\n\n get effectiveType(): number {\n return Cell.Types.SharedString;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass BooleanValue {\n declare public model: BooleanValueModel;\n\n constructor(cell: Cell, value: boolean) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Boolean,\n value\n };\n }\n\n get value(): boolean {\n return this.model.value;\n }\n\n set value(value: boolean) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Boolean;\n }\n\n get effectiveType(): number {\n return Cell.Types.Boolean;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): number {\n return this.model.value ? 1 : 0;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.toString();\n }\n}\n\nclass ErrorValue {\n declare public model: ErrorValueModel;\n\n constructor(cell: Cell, value: CellErrorValue) {\n this.model = {\n address: cell.address,\n type: Cell.Types.Error,\n value\n };\n }\n\n get value(): CellErrorValue {\n return this.model.value;\n }\n\n set value(value: CellErrorValue) {\n this.model.value = value;\n }\n\n get type(): number {\n return Cell.Types.Error;\n }\n\n get effectiveType(): number {\n return Cell.Types.Error;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.toString();\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value.error.toString();\n }\n}\n\nclass JSONValue {\n declare public model: JSONValueModel;\n\n constructor(cell: Cell, value: unknown) {\n this.model = {\n address: cell.address,\n type: Cell.Types.String,\n value: JSON.stringify(value),\n rawValue: value\n };\n }\n\n get value(): unknown {\n return this.model.rawValue;\n }\n\n set value(value: unknown) {\n this.model.rawValue = value;\n this.model.value = JSON.stringify(value);\n }\n\n get type(): number {\n return Cell.Types.String;\n }\n\n get effectiveType(): number {\n return Cell.Types.String;\n }\n\n get address(): string {\n return this.model.address;\n }\n\n set address(value: string) {\n this.model.address = value;\n }\n\n toCsvString(): string {\n return this.model.value;\n }\n\n release(): void {}\n\n toString(): string {\n return this.model.value;\n }\n}\n\n// Value is a place to hold common static Value type functions\nconst Value = {\n getType(value: CellValueType): number {\n if (value === null || value === undefined) {\n return Cell.Types.Null;\n }\n if (value instanceof String || typeof value === \"string\") {\n return Cell.Types.String;\n }\n if (typeof value === \"number\") {\n return Cell.Types.Number;\n }\n if (typeof value === \"boolean\") {\n return Cell.Types.Boolean;\n }\n if (value instanceof Date) {\n return Cell.Types.Date;\n }\n if (typeof value === \"object\") {\n if (\"text\" in value && value.text && \"hyperlink\" in value && value.hyperlink) {\n return Cell.Types.Hyperlink;\n }\n if (\n (\"formula\" in value && value.formula) ||\n (\"sharedFormula\" in value && value.sharedFormula)\n ) {\n return Cell.Types.Formula;\n }\n if (\"richText\" in value && value.richText) {\n return Cell.Types.RichText;\n }\n if (\"sharedString\" in value && value.sharedString) {\n return Cell.Types.SharedString;\n }\n if (\"error\" in value && value.error) {\n return Cell.Types.Error;\n }\n }\n return Cell.Types.JSON;\n },\n\n // map valueType to constructor\n types: [\n { t: Cell.Types.Null, f: NullValue },\n { t: Cell.Types.Number, f: NumberValue },\n { t: Cell.Types.String, f: StringValue },\n { t: Cell.Types.Date, f: DateValue },\n { t: Cell.Types.Hyperlink, f: HyperlinkValue },\n { t: Cell.Types.Formula, f: FormulaValue },\n { t: Cell.Types.Merge, f: MergeValue },\n { t: Cell.Types.JSON, f: JSONValue },\n { t: Cell.Types.SharedString, f: SharedStringValue },\n { t: Cell.Types.RichText, f: RichTextValue },\n { t: Cell.Types.Boolean, f: BooleanValue },\n { t: Cell.Types.Error, f: ErrorValue }\n ].reduce(\n (\n p: (\n | typeof NullValue\n | typeof NumberValue\n | typeof StringValue\n | typeof DateValue\n | typeof HyperlinkValue\n | typeof FormulaValue\n | typeof MergeValue\n | typeof JSONValue\n | typeof SharedStringValue\n | typeof RichTextValue\n | typeof BooleanValue\n | typeof ErrorValue\n )[],\n t\n ) => {\n p[t.t] = t.f;\n return p;\n },\n []\n ),\n\n create(type: number, cell: Cell, value?: CellValueType): ICellValue {\n const T = this.types[type];\n if (!T) {\n throw new Error(`Could not create Value of type ${type}`);\n }\n return new T(cell, value);\n }\n};\n\nexport { Cell };\n","import { Enums } from \"./enums\";\nimport { colCache } from \"../utils/col-cache\";\nimport { Cell, type CellModel, type CellAddress } from \"./cell\";\nimport type { Worksheet } from \"./worksheet\";\nimport type { Column } from \"./column\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellValue,\n RowValues,\n RowBreak\n} from \"../types\";\n\n// Internal interface for row dimensions\ninterface RowDimensions {\n min: number;\n max: number;\n}\n\n// Internal interface for row model (serialization)\nexport interface RowModel {\n cells: CellModel[];\n number: number;\n min: number;\n max: number;\n height?: number;\n style: Partial<Style>;\n hidden: boolean;\n outlineLevel: number;\n collapsed: boolean;\n}\n\nclass Row {\n // Type declarations only - no runtime overhead\n declare private _worksheet: Worksheet;\n declare private _number: number;\n declare private _cells: Cell[];\n declare public style: Partial<Style>;\n declare private _hidden?: boolean;\n declare private _outlineLevel?: number;\n declare public height?: number;\n\n constructor(worksheet: Worksheet, number: number) {\n this._worksheet = worksheet;\n this._number = number;\n this._cells = [];\n this.style = {};\n this.outlineLevel = 0;\n }\n\n /**\n * The row number\n */\n get number(): number {\n return this._number;\n }\n\n /**\n * The worksheet that contains this row\n */\n get worksheet(): Worksheet {\n return this._worksheet;\n }\n\n /**\n * Commit a completed row to stream.\n * Inform Streaming Writer that this row (and all rows before it) are complete\n * and ready to write. Has no effect on Worksheet document.\n */\n commit(): void {\n this._worksheet._commitRow(this);\n }\n\n /**\n * Helps GC by breaking cyclic references\n */\n destroy(): void {\n delete this._worksheet;\n delete this._cells;\n delete this.style;\n }\n\n findCell(colNumber: number): Cell | undefined {\n return this._cells[colNumber - 1];\n }\n\n // given {address, row, col}, find or create new cell\n getCellEx(address: CellAddress): Cell {\n let cell = this._cells[address.col - 1];\n if (!cell) {\n const column = this._worksheet.getColumn(address.col);\n cell = new Cell(this, column, address.address);\n this._cells[address.col - 1] = cell;\n }\n return cell;\n }\n\n /**\n * Get cell by number, column letter or column key\n */\n getCell(col: string | number): Cell {\n let colNum: number;\n if (typeof col === \"string\") {\n // is it a key?\n const column = this._worksheet.getColumnKey(col);\n if (column) {\n colNum = column.number;\n } else {\n colNum = colCache.l2n(col);\n }\n } else {\n colNum = col;\n }\n return (\n this._cells[colNum - 1] ||\n this.getCellEx({\n address: colCache.encodeAddress(this._number, colNum),\n row: this._number,\n col: colNum\n })\n );\n }\n\n /**\n * Cut one or more cells (cells to the right are shifted left)\n *\n * Note: this operation will not affect other rows\n */\n splice(start: number, count: number, ...inserts: CellValue[]): void {\n const nKeep = start + count;\n const nExpand = inserts.length - count;\n const nEnd = this._cells.length;\n let i: number;\n let cSrc: Cell | undefined;\n let cDst: Cell | undefined;\n\n if (nExpand < 0) {\n // remove cells\n for (i = start + inserts.length; i <= nEnd; i++) {\n cDst = this._cells[i - 1];\n cSrc = this._cells[i - nExpand - 1];\n if (cSrc) {\n cDst = this.getCell(i);\n cDst.value = cSrc.value;\n cDst.style = cSrc.style;\n cDst.comment = cSrc.comment;\n } else if (cDst) {\n cDst.value = null;\n cDst.style = {};\n cDst.comment = undefined;\n }\n }\n } else if (nExpand > 0) {\n // insert new cells\n for (i = nEnd; i >= nKeep; i--) {\n cSrc = this._cells[i - 1];\n if (cSrc) {\n cDst = this.getCell(i + nExpand);\n cDst.value = cSrc.value;\n cDst.style = cSrc.style;\n cDst.comment = cSrc.comment;\n } else {\n this._cells[i + nExpand - 1] = undefined;\n }\n }\n }\n\n // now add the new values\n for (i = 0; i < inserts.length; i++) {\n cDst = this.getCell(start + i);\n cDst.value = inserts[i];\n cDst.style = {};\n cDst.comment = undefined;\n }\n }\n\n /**\n * Iterate over all non-null cells in a row\n */\n eachCell(callback: (cell: Cell, colNumber: number) => void): void;\n /**\n * Iterate over all cells in a row (including empty cells)\n */\n eachCell(\n opt: { includeEmpty?: boolean },\n callback: (cell: Cell, colNumber: number) => void\n ): void;\n eachCell(\n optOrCallback: { includeEmpty?: boolean } | ((cell: Cell, colNumber: number) => void),\n maybeCallback?: (cell: Cell, colNumber: number) => void\n ): void {\n let options: { includeEmpty?: boolean } | null = null;\n let callback: (cell: Cell, colNumber: number) => void;\n if (typeof optOrCallback === \"function\") {\n callback = optOrCallback;\n } else {\n options = optOrCallback;\n callback = maybeCallback!;\n }\n if (options && options.includeEmpty) {\n const n = this._cells.length;\n for (let i = 1; i <= n; i++) {\n callback(this.getCell(i), i);\n }\n } else {\n this._cells.forEach((cell, index) => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n callback(cell, index + 1);\n }\n });\n }\n }\n\n // ===========================================================================\n // Page Breaks\n addPageBreak(lft?: number, rght?: number): void {\n const ws = this._worksheet;\n const left = Math.max(0, (lft || 0) - 1) || 0;\n const right = Math.max(0, (rght || 0) - 1) || 16838;\n const pb: RowBreak = {\n id: this._number,\n max: right,\n man: 1\n };\n if (left) {\n pb.min = left;\n }\n\n ws.rowBreaks.push(pb);\n }\n\n /**\n * Get a row as a sparse array\n */\n get values(): CellValue[] {\n const values: CellValue[] = [];\n this._cells.forEach(cell => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n values[cell.col] = cell.value;\n }\n });\n return values;\n }\n\n /**\n * Set the values by contiguous or sparse array, or by key'd object literal\n */\n set values(value: RowValues) {\n // this operation is not additive - any prior cells are removed\n this._cells = [];\n if (!value) {\n // empty row\n } else if (value instanceof Array) {\n let offset = 0;\n if (Object.prototype.hasOwnProperty.call(value, \"0\")) {\n // contiguous array - start at column 1\n offset = 1;\n }\n value.forEach((item, index) => {\n if (item !== undefined) {\n this.getCellEx({\n address: colCache.encodeAddress(this._number, index + offset),\n row: this._number,\n col: index + offset\n }).value = item;\n }\n });\n } else {\n // assume object with column keys\n this._worksheet.eachColumnKey((column: Column, key: string) => {\n if (value[key] !== undefined) {\n this.getCellEx({\n address: colCache.encodeAddress(this._number, column.number),\n row: this._number,\n col: column.number\n }).value = value[key];\n }\n });\n }\n }\n\n /**\n * Returns true if the row includes at least one cell with a value\n */\n get hasValues(): boolean {\n return this._cells.some(cell => cell && cell.type !== Enums.ValueType.Null);\n }\n\n /**\n * Number of cells including empty ones\n */\n get cellCount(): number {\n return this._cells.length;\n }\n\n /**\n * Number of non-empty cells\n */\n get actualCellCount(): number {\n let count = 0;\n this.eachCell(() => {\n count++;\n });\n return count;\n }\n\n /**\n * Get the min and max column number for the non-null cells in this row or null\n */\n get dimensions(): RowDimensions | null {\n let min = 0;\n let max = 0;\n this._cells.forEach(cell => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n if (!min || min > cell.col) {\n min = cell.col;\n }\n if (max < cell.col) {\n max = cell.col;\n }\n }\n });\n return min > 0\n ? {\n min,\n max\n }\n : null;\n }\n\n // =========================================================================\n // styles\n private _applyStyle<K extends keyof Style>(name: K, value: Style[K]): void {\n this.style[name] = value;\n this._cells.forEach(cell => {\n if (cell) {\n cell.style[name] = value;\n }\n });\n }\n\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"numFmt\", value);\n }\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"font\", value);\n }\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"alignment\", value);\n }\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"protection\", value);\n }\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"border\", value);\n }\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n if (value !== undefined) {\n this._applyStyle(\"fill\", value);\n }\n }\n\n get hidden(): boolean {\n return !!this._hidden;\n }\n\n set hidden(value: boolean) {\n this._hidden = value;\n }\n\n get outlineLevel(): number {\n return this._outlineLevel || 0;\n }\n\n set outlineLevel(value: number) {\n this._outlineLevel = value;\n }\n\n get collapsed(): boolean {\n return !!(\n this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow\n );\n }\n\n // =========================================================================\n get model(): RowModel | null {\n const cells: CellModel[] = [];\n let min = 0;\n let max = 0;\n this._cells.forEach(cell => {\n if (cell) {\n const cellModel = cell.model;\n if (cellModel) {\n if (!min || min > cell.col) {\n min = cell.col;\n }\n if (max < cell.col) {\n max = cell.col;\n }\n cells.push(cellModel);\n }\n }\n });\n\n return this.height || cells.length\n ? {\n cells,\n number: this.number,\n min,\n max,\n height: this.height,\n style: this.style,\n hidden: this.hidden,\n outlineLevel: this.outlineLevel,\n collapsed: this.collapsed\n }\n : null;\n }\n\n set model(value: RowModel) {\n if (value.number !== this._number) {\n throw new Error(\"Invalid row number in model\");\n }\n this._cells = [];\n let previousAddress: CellAddress | undefined;\n value.cells.forEach(cellModel => {\n switch (cellModel.type) {\n case Cell.Types.Merge:\n // special case - don't add this types\n break;\n default: {\n let address: CellAddress | undefined;\n if (cellModel.address) {\n address = colCache.decodeAddress(cellModel.address);\n } else if (previousAddress) {\n // This is a <c> element without an r attribute\n // Assume that it's the cell for the next column\n const { row } = previousAddress;\n const col = previousAddress.col + 1;\n address = {\n row,\n col,\n address: colCache.encodeAddress(row, col),\n $col$row: `$${colCache.n2l(col)}$${row}`\n };\n }\n previousAddress = address;\n const cell = this.getCellEx(address);\n cell.model = cellModel;\n break;\n }\n }\n });\n\n if (value.height) {\n this.height = value.height;\n } else {\n delete this.height;\n }\n\n this.hidden = value.hidden;\n this.outlineLevel = value.outlineLevel || 0;\n\n this.style = (value.style && JSON.parse(JSON.stringify(value.style))) || {};\n }\n}\n\nexport { Row };\n","import { colCache } from \"../utils/col-cache\";\nimport { isEqual } from \"../utils/under-dash\";\nimport { Enums } from \"./enums\";\nimport type { Cell, CellValueType } from \"./cell\";\nimport type { Row } from \"./row\";\nimport type { Worksheet } from \"./worksheet\";\nimport type {\n Style,\n NumFmt,\n Font,\n Alignment,\n Protection,\n Borders,\n Fill,\n CellValue,\n ColBreak\n} from \"../types\";\n\nconst DEFAULT_COLUMN_WIDTH = 9;\n\n/** Header value type - can be a single value or array for multi-row headers */\nexport type ColumnHeaderValue = CellValue | CellValue[];\n\nexport interface ColumnDefn {\n /** Column header value(s). Can be string, Date, number, or any CellValue type */\n header?: ColumnHeaderValue;\n key?: string;\n width?: number;\n outlineLevel?: number;\n hidden?: boolean;\n style?: Partial<Style>;\n}\n\nexport interface ColumnModel {\n min: number;\n max: number;\n width?: number;\n style?: Partial<Style>;\n isCustomWidth?: boolean;\n hidden?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n}\n\n/**\n * Column defines the column properties for 1 column.\n * This includes header rows, widths, key, (style), etc.\n * Worksheet will condense the columns as appropriate during serialization\n */\nclass Column {\n declare private _worksheet: Worksheet;\n declare private _number: number;\n declare private _header: ColumnHeaderValue | undefined;\n declare private _key: string | undefined;\n /** The width of the column */\n declare public width?: number;\n declare private _hidden: boolean | undefined;\n declare private _outlineLevel: number | undefined;\n /** Styles applied to the column */\n declare public style: Partial<Style>;\n\n constructor(worksheet: Worksheet, number: number, defn?: ColumnDefn | false) {\n this._worksheet = worksheet;\n this._number = number;\n if (defn !== false) {\n // sometimes defn will follow\n this.defn = defn;\n }\n }\n\n get number(): number {\n return this._number;\n }\n\n get worksheet(): Worksheet {\n return this._worksheet;\n }\n\n /**\n * Column letter key\n */\n get letter(): string {\n return colCache.n2l(this._number);\n }\n\n get isCustomWidth(): boolean {\n return this.width !== undefined && this.width !== DEFAULT_COLUMN_WIDTH;\n }\n\n get defn(): ColumnDefn {\n return {\n header: this._header,\n key: this.key,\n width: this.width,\n style: this.style,\n hidden: this.hidden,\n outlineLevel: this.outlineLevel\n };\n }\n\n set defn(value: ColumnDefn | undefined) {\n if (value) {\n this.key = value.key;\n this.width = value.width !== undefined ? value.width : DEFAULT_COLUMN_WIDTH;\n this.outlineLevel = value.outlineLevel;\n if (value.style) {\n this.style = value.style;\n } else {\n this.style = {};\n }\n\n // headers must be set after style\n this.header = value.header;\n this._hidden = !!value.hidden;\n } else {\n delete this._header;\n delete this._key;\n delete this.width;\n this.style = {};\n this.outlineLevel = 0;\n }\n }\n\n /**\n * Get header values as an array (for multi-row header support)\n */\n get headers(): CellValue[] {\n if (Array.isArray(this._header)) {\n return this._header;\n }\n if (this._header !== undefined) {\n return [this._header];\n }\n return [];\n }\n\n /**\n * Can be a single value or an array for multi-row headers.\n * Supports any CellValue type including Date, number, string, etc.\n */\n get header(): ColumnHeaderValue | undefined {\n return this._header;\n }\n\n set header(value: ColumnHeaderValue | undefined) {\n if (value !== undefined) {\n this._header = value;\n this.headers.forEach((cellValue, index) => {\n this._worksheet.getCell(index + 1, this.number).value = cellValue;\n });\n } else {\n this._header = undefined;\n }\n }\n\n /**\n * The name of the properties associated with this column in each row\n */\n get key(): string | undefined {\n return this._key;\n }\n\n set key(value: string | undefined) {\n const column = this._key && this._worksheet.getColumnKey(this._key);\n if (column === this) {\n this._worksheet.deleteColumnKey(this._key);\n }\n\n this._key = value;\n if (value) {\n this._worksheet.setColumnKey(this._key, this);\n }\n }\n\n /**\n * Hides the column\n */\n get hidden(): boolean {\n return !!this._hidden;\n }\n\n set hidden(value: boolean) {\n this._hidden = value;\n }\n\n /**\n * Set an outline level for columns\n */\n get outlineLevel(): number {\n return this._outlineLevel || 0;\n }\n\n set outlineLevel(value: number | undefined) {\n this._outlineLevel = value;\n }\n\n /**\n * Indicate the collapsed state based on outlineLevel\n */\n get collapsed(): boolean {\n return !!(\n this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelCol\n );\n }\n\n toString(): string {\n return JSON.stringify({\n key: this.key,\n width: this.width,\n headers: this.headers.length ? this.headers : undefined\n });\n }\n\n equivalentTo(other: Column): boolean {\n return (\n this.width === other.width &&\n this.hidden === other.hidden &&\n this.outlineLevel === other.outlineLevel &&\n isEqual(this.style, other.style)\n );\n }\n\n equivalentToModel(model: ColumnModel): boolean {\n return (\n this.width === model.width &&\n this.hidden === model.hidden &&\n this.outlineLevel === model.outlineLevel &&\n isEqual(this.style, model.style)\n );\n }\n\n get isDefault(): boolean {\n if (this.isCustomWidth) {\n return false;\n }\n if (this.hidden) {\n return false;\n }\n if (this.outlineLevel) {\n return false;\n }\n const s = this.style;\n if (s && (s.font || s.numFmt || s.alignment || s.border || s.fill || s.protection)) {\n return false;\n }\n return true;\n }\n\n get headerCount(): number {\n return this.headers.length;\n }\n\n /**\n * Iterate over all current cells in this column\n */\n eachCell(callback: (cell: Cell, rowNumber: number) => void): void;\n /**\n * Iterate over all current cells in this column including empty cells\n */\n eachCell(\n opt: { includeEmpty?: boolean },\n callback: (cell: Cell, rowNumber: number) => void\n ): void;\n eachCell(\n optionsOrCallback: { includeEmpty?: boolean } | ((cell: Cell, rowNumber: number) => void),\n maybeCallback?: (cell: Cell, rowNumber: number) => void\n ): void {\n const colNumber = this.number;\n let options: { includeEmpty?: boolean };\n let callback: (cell: Cell, rowNumber: number) => void;\n if (typeof optionsOrCallback === \"function\") {\n options = {};\n callback = optionsOrCallback;\n } else {\n options = optionsOrCallback;\n callback = maybeCallback!;\n }\n this._worksheet.eachRow(options, (row: Row, rowNumber: number) => {\n callback(row.getCell(colNumber), rowNumber);\n });\n }\n\n /**\n * The cell values in the column\n */\n get values(): CellValueType[] {\n const v: CellValueType[] = [];\n this.eachCell((cell, rowNumber) => {\n if (cell && cell.type !== Enums.ValueType.Null) {\n v[rowNumber] = cell.value;\n }\n });\n return v;\n }\n\n set values(v: CellValueType[]) {\n if (!v) {\n return;\n }\n const colNumber = this.number;\n let offset = 0;\n if (Object.prototype.hasOwnProperty.call(v, \"0\")) {\n // assume contiguous array, start at row 1\n offset = 1;\n }\n v.forEach((value, index) => {\n this._worksheet.getCell(index + offset, colNumber).value = value;\n });\n }\n\n // =========================================================================\n // Page Breaks\n\n /**\n * Add a page break after this column.\n * @param top - Optional top row limit for the page break (1-indexed)\n * @param bottom - Optional bottom row limit for the page break (1-indexed)\n */\n addPageBreak(top?: number, bottom?: number): void {\n const ws = this._worksheet;\n const topRow = Math.max(0, (top || 0) - 1) || 0;\n const bottomRow = Math.max(0, (bottom || 0) - 1) || 1048575;\n const pb: ColBreak = {\n id: this._number,\n max: bottomRow,\n man: 1\n };\n if (topRow) {\n pb.min = topRow;\n }\n\n ws.colBreaks.push(pb);\n }\n\n // =========================================================================\n // styles\n get numFmt(): string | NumFmt | undefined {\n return this.style.numFmt;\n }\n\n set numFmt(value: string | undefined) {\n this.style.numFmt = value;\n this.eachCell(cell => {\n cell.numFmt = value;\n });\n }\n\n get font(): Partial<Font> | undefined {\n return this.style.font;\n }\n\n set font(value: Partial<Font> | undefined) {\n this.style.font = value;\n this.eachCell(cell => {\n cell.font = value;\n });\n }\n\n get alignment(): Partial<Alignment> | undefined {\n return this.style.alignment;\n }\n\n set alignment(value: Partial<Alignment> | undefined) {\n this.style.alignment = value;\n this.eachCell(cell => {\n cell.alignment = value;\n });\n }\n\n get protection(): Partial<Protection> | undefined {\n return this.style.protection;\n }\n\n set protection(value: Partial<Protection> | undefined) {\n this.style.protection = value;\n this.eachCell(cell => {\n cell.protection = value;\n });\n }\n\n get border(): Partial<Borders> | undefined {\n return this.style.border;\n }\n\n set border(value: Partial<Borders> | undefined) {\n this.style.border = value;\n this.eachCell(cell => {\n cell.border = value;\n });\n }\n\n get fill(): Fill | undefined {\n return this.style.fill;\n }\n\n set fill(value: Fill | undefined) {\n this.style.fill = value;\n this.eachCell(cell => {\n cell.fill = value;\n });\n }\n\n // =============================================================================\n // static functions\n\n static toModel(columns: Column[]): ColumnModel[] | undefined {\n // Convert array of Column into compressed list cols\n const cols: ColumnModel[] = [];\n let col: ColumnModel | null = null;\n if (columns) {\n columns.forEach((column, index) => {\n if (column.isDefault) {\n if (col) {\n col = null;\n }\n } else if (!col || !column.equivalentToModel(col)) {\n col = {\n min: index + 1,\n max: index + 1,\n width: column.width !== undefined ? column.width : DEFAULT_COLUMN_WIDTH,\n style: column.style,\n isCustomWidth: column.isCustomWidth,\n hidden: column.hidden,\n outlineLevel: column.outlineLevel,\n collapsed: column.collapsed\n };\n cols.push(col);\n } else {\n col.max = index + 1;\n }\n });\n }\n return cols.length ? cols : undefined;\n }\n\n static fromModel(worksheet: Worksheet, cols: ColumnModel[]): Column[] | null {\n cols = cols || [];\n const columns: Column[] = [];\n let count = 1;\n let index = 0;\n /**\n * sort cols by min\n * If it is not sorted, the subsequent column configuration will be overwritten\n * */\n cols = cols.sort(function (pre, next) {\n return pre.min - next.min;\n });\n while (index < cols.length) {\n const col = cols[index++];\n while (count < col.min) {\n columns.push(new Column(worksheet, count++));\n }\n while (count <= col.max) {\n columns.push(new Column(worksheet, count++, col));\n }\n }\n return columns.length ? columns : null;\n }\n}\n\nexport { Column };\n","import { colCache } from \"../utils/col-cache\";\nimport type { Worksheet } from \"./worksheet\";\n\ninterface AnchorModel {\n nativeCol: number;\n nativeRow: number;\n nativeColOff: number;\n nativeRowOff: number;\n}\n\ninterface SimpleAddress {\n col: number;\n row: number;\n}\n\ntype AddressInput = string | AnchorModel | SimpleAddress;\n\nfunction isAnchorModel(value: AddressInput): value is AnchorModel {\n return (\n typeof value === \"object\" &&\n \"nativeCol\" in value &&\n \"nativeRow\" in value &&\n \"nativeColOff\" in value &&\n \"nativeRowOff\" in value\n );\n}\n\nfunction isSimpleAddress(value: AddressInput): value is SimpleAddress {\n return typeof value === \"object\" && \"col\" in value && \"row\" in value;\n}\n\nclass Anchor {\n declare public nativeCol: number;\n declare public nativeRow: number;\n declare public nativeColOff: number;\n declare public nativeRowOff: number;\n declare public worksheet?: Worksheet;\n\n constructor(worksheet?: Worksheet, address?: AddressInput | null, offset: number = 0) {\n this.worksheet = worksheet;\n\n if (!address) {\n this.nativeCol = 0;\n this.nativeColOff = 0;\n this.nativeRow = 0;\n this.nativeRowOff = 0;\n } else if (typeof address === \"string\") {\n const decoded = colCache.decodeAddress(address);\n this.nativeCol = decoded.col + offset;\n this.nativeColOff = 0;\n this.nativeRow = decoded.row + offset;\n this.nativeRowOff = 0;\n } else if (isAnchorModel(address)) {\n this.nativeCol = address.nativeCol || 0;\n this.nativeColOff = address.nativeColOff || 0;\n this.nativeRow = address.nativeRow || 0;\n this.nativeRowOff = address.nativeRowOff || 0;\n } else if (isSimpleAddress(address)) {\n this.col = address.col + offset;\n this.row = address.row + offset;\n } else {\n this.nativeCol = 0;\n this.nativeColOff = 0;\n this.nativeRow = 0;\n this.nativeRowOff = 0;\n }\n }\n\n static asInstance(model: AddressInput | Anchor | null | undefined): Anchor | null {\n if (model == null) {\n return null;\n }\n if (model instanceof Anchor) {\n return model;\n }\n return new Anchor(undefined, model);\n }\n\n get col(): number {\n return this.nativeCol + Math.min(this.colWidth - 1, this.nativeColOff) / this.colWidth;\n }\n\n set col(v: number) {\n this.nativeCol = Math.floor(v);\n this.nativeColOff = Math.floor((v - this.nativeCol) * this.colWidth);\n }\n\n get row(): number {\n return this.nativeRow + Math.min(this.rowHeight - 1, this.nativeRowOff) / this.rowHeight;\n }\n\n set row(v: number) {\n this.nativeRow = Math.floor(v);\n this.nativeRowOff = Math.floor((v - this.nativeRow) * this.rowHeight);\n }\n\n get colWidth(): number {\n return this.worksheet &&\n this.worksheet.getColumn(this.nativeCol + 1) &&\n this.worksheet.getColumn(this.nativeCol + 1).isCustomWidth\n ? Math.floor(this.worksheet.getColumn(this.nativeCol + 1).width! * 10000)\n : 640000;\n }\n\n get rowHeight(): number {\n return this.worksheet &&\n this.worksheet.getRow(this.nativeRow + 1) &&\n this.worksheet.getRow(this.nativeRow + 1).height\n ? Math.floor(this.worksheet.getRow(this.nativeRow + 1).height * 10000)\n : 180000;\n }\n\n get model(): AnchorModel {\n return {\n nativeCol: this.nativeCol,\n nativeColOff: this.nativeColOff,\n nativeRow: this.nativeRow,\n nativeRowOff: this.nativeRowOff\n };\n }\n\n set model(value: AnchorModel) {\n this.nativeCol = value.nativeCol;\n this.nativeColOff = value.nativeColOff;\n this.nativeRow = value.nativeRow;\n this.nativeRowOff = value.nativeRowOff;\n }\n}\n\nexport { Anchor };\nexport type { AnchorModel };\n\ntype IAnchor = Pick<\n InstanceType<typeof Anchor>,\n \"col\" | \"row\" | \"nativeCol\" | \"nativeRow\" | \"nativeColOff\" | \"nativeRowOff\"\n>;\nexport type { IAnchor };\n","import { colCache } from \"../utils/col-cache\";\nimport { Anchor, type AnchorModel } from \"./anchor\";\nimport type { Worksheet } from \"./worksheet\";\n\ninterface ImageHyperlinks {\n hyperlink?: string;\n tooltip?: string;\n}\n\ninterface ImageExt {\n width?: number;\n height?: number;\n}\n\ninterface ImageRange {\n tl: Anchor;\n br?: Anchor;\n ext?: ImageExt;\n editAs?: string;\n hyperlinks?: ImageHyperlinks;\n}\n\ninterface BackgroundModel {\n type: \"background\";\n imageId: string;\n}\n\ninterface ImageRangeModel {\n tl: AnchorModel;\n br?: AnchorModel;\n ext?: ImageExt;\n editAs?: string;\n}\n\ninterface ImageModel {\n type: \"image\";\n imageId: string;\n hyperlinks?: ImageHyperlinks;\n range: ImageRangeModel;\n}\n\ntype Model = BackgroundModel | ImageModel;\ntype ImageModelInput = ModelInput;\n\ninterface RangeInput {\n tl?: AnchorModel | { col: number; row: number } | string;\n br?: AnchorModel | { col: number; row: number } | string;\n ext?: ImageExt;\n editAs?: string;\n hyperlinks?: ImageHyperlinks;\n}\n\ninterface ModelInput {\n type: string;\n imageId: string;\n range?: string | RangeInput | ImageRangeModel;\n hyperlinks?: ImageHyperlinks;\n}\n\nclass Image {\n worksheet: Worksheet;\n type?: string;\n imageId?: string;\n range?: ImageRange;\n\n constructor(worksheet: Worksheet, model?: ModelInput) {\n this.worksheet = worksheet;\n if (model) {\n this.model = model;\n }\n }\n\n get model(): Model {\n switch (this.type) {\n case \"background\":\n return {\n type: this.type,\n imageId: this.imageId!\n };\n case \"image\":\n return {\n type: this.type,\n imageId: this.imageId!,\n hyperlinks: this.range!.hyperlinks,\n range: {\n tl: this.range!.tl.model,\n br: this.range!.br && this.range!.br.model,\n ext: this.range!.ext,\n editAs: this.range!.editAs\n }\n };\n default:\n throw new Error(\"Invalid Image Type\");\n }\n }\n\n set model({ type, imageId, range, hyperlinks }: ModelInput) {\n this.type = type;\n this.imageId = imageId;\n\n if (type === \"image\") {\n if (typeof range === \"string\") {\n const decoded = colCache.decode(range);\n if (\"top\" in decoded) {\n // It's a Location (range like \"A1:C3\")\n this.range = {\n tl: new Anchor(this.worksheet, { col: decoded.left, row: decoded.top }, -1),\n br: new Anchor(this.worksheet, { col: decoded.right, row: decoded.bottom }, 0),\n editAs: \"oneCell\"\n };\n }\n } else if (range) {\n this.range = {\n tl: new Anchor(this.worksheet, range.tl, 0),\n br: range.br ? new Anchor(this.worksheet, range.br, 0) : undefined,\n ext: range.ext,\n editAs: range.editAs,\n hyperlinks: hyperlinks || (\"hyperlinks\" in range ? range.hyperlinks : undefined)\n };\n }\n }\n }\n}\n\nexport { Image, type Model as ImageModel, type ImageModelInput };\n","import { colCache } from \"../utils/col-cache\";\nimport type {\n Address,\n CellFormulaValue,\n CellValue,\n Style,\n TableColumnProperties,\n TableStyleProperties\n} from \"../types\";\nimport type { Worksheet } from \"./worksheet\";\nimport type { Cell } from \"./cell\";\n\ninterface TableModel {\n ref: string;\n name: string;\n displayName?: string;\n columns: TableColumnProperties[];\n rows: CellValue[][];\n headerRow?: boolean;\n totalsRow?: boolean;\n style?: TableStyleProperties;\n tl?: Address;\n autoFilterRef?: string;\n tableRef?: string;\n}\n\ninterface CacheState {\n ref: string;\n width: number;\n tableHeight: number;\n}\n\nclass Column {\n // wrapper around column model, allowing access and manipulation\n table: Table;\n column: TableColumnProperties;\n index: number;\n\n constructor(table: Table, column: TableColumnProperties, index: number) {\n this.table = table;\n this.column = column;\n this.index = index;\n }\n\n private _set<K extends keyof TableColumnProperties>(\n name: K,\n value: TableColumnProperties[K]\n ): void {\n this.table.cacheState();\n this.column[name] = value;\n }\n\n get name(): string {\n return this.column.name;\n }\n set name(value: string) {\n this._set(\"name\", value);\n }\n\n get filterButton(): boolean | undefined {\n return this.column.filterButton;\n }\n set filterButton(value: boolean | undefined) {\n this.column.filterButton = value;\n }\n\n get style(): Partial<Style> | undefined {\n return this.column.style;\n }\n set style(value: Partial<Style> | undefined) {\n this.column.style = value;\n }\n\n get totalsRowLabel(): string | undefined {\n return this.column.totalsRowLabel;\n }\n set totalsRowLabel(value: string | undefined) {\n this._set(\"totalsRowLabel\", value);\n }\n\n get totalsRowFunction(): TableColumnProperties[\"totalsRowFunction\"] {\n return this.column.totalsRowFunction;\n }\n set totalsRowFunction(value: TableColumnProperties[\"totalsRowFunction\"]) {\n this._set(\"totalsRowFunction\", value);\n }\n\n get totalsRowResult(): CellValue {\n return this.column.totalsRowResult;\n }\n set totalsRowResult(value: CellFormulaValue[\"result\"]) {\n this._set(\"totalsRowResult\", value);\n }\n\n get totalsRowFormula(): string | undefined {\n return this.column.totalsRowFormula;\n }\n set totalsRowFormula(value: string | undefined) {\n this._set(\"totalsRowFormula\", value);\n }\n}\n\nclass Table {\n worksheet: Worksheet;\n table!: TableModel;\n declare private _cache?: CacheState;\n\n constructor(worksheet: Worksheet, table?: TableModel) {\n this.worksheet = worksheet;\n if (table) {\n this.table = table;\n // check things are ok first\n this.validate();\n\n this.store();\n }\n }\n\n getFormula(column: TableColumnProperties): string | null {\n // get the correct formula to apply to the totals row\n switch (column.totalsRowFunction) {\n case \"none\":\n return null;\n case \"average\":\n return `SUBTOTAL(101,${this.table.name}[${column.name}])`;\n case \"countNums\":\n return `SUBTOTAL(102,${this.table.name}[${column.name}])`;\n case \"count\":\n return `SUBTOTAL(103,${this.table.name}[${column.name}])`;\n case \"max\":\n return `SUBTOTAL(104,${this.table.name}[${column.name}])`;\n case \"min\":\n return `SUBTOTAL(105,${this.table.name}[${column.name}])`;\n case \"stdDev\":\n return `SUBTOTAL(106,${this.table.name}[${column.name}])`;\n case \"var\":\n return `SUBTOTAL(107,${this.table.name}[${column.name}])`;\n case \"sum\":\n return `SUBTOTAL(109,${this.table.name}[${column.name}])`;\n case \"custom\":\n return column.totalsRowFormula || null;\n default:\n throw new Error(`Invalid Totals Row Function: ${column.totalsRowFunction}`);\n }\n }\n\n get width(): number {\n // width of the table\n return this.table.columns.length;\n }\n\n get height(): number {\n // height of the table data\n return this.table.rows.length;\n }\n\n get filterHeight(): number {\n // height of the table data plus optional header row\n return this.height + (this.table.headerRow ? 1 : 0);\n }\n\n get tableHeight(): number {\n // full height of the table on the sheet\n return this.filterHeight + (this.table.totalsRow ? 1 : 0);\n }\n\n validate(): void {\n const { table } = this;\n // set defaults and check is valid\n const assign = <T extends object, K extends keyof T>(o: T, name: K, dflt: T[K]): void => {\n if (o[name] === undefined) {\n o[name] = dflt;\n }\n };\n assign(table, \"headerRow\", true);\n assign(table, \"totalsRow\", false);\n\n assign(table, \"style\", {});\n assign(table.style, \"theme\", \"TableStyleMedium2\");\n assign(table.style, \"showFirstColumn\", false);\n assign(table.style, \"showLastColumn\", false);\n assign(table.style, \"showRowStripes\", false);\n assign(table.style, \"showColumnStripes\", false);\n\n const assert = (test: boolean, message: string) => {\n if (!test) {\n throw new Error(message);\n }\n };\n assert(!!table.ref, \"Table must have ref\");\n assert(!!table.columns, \"Table must have column definitions\");\n assert(!!table.rows, \"Table must have row definitions\");\n\n table.tl = colCache.decodeAddress(table.ref);\n const { row, col } = table.tl;\n assert(row > 0, \"Table must be on valid row\");\n assert(col > 0, \"Table must be on valid col\");\n\n const { width, filterHeight, tableHeight } = this;\n\n // autoFilterRef is a range that includes optional headers only\n table.autoFilterRef = colCache.encode(row, col, row + filterHeight - 1, col + width - 1);\n\n // tableRef is a range that includes optional headers and totals\n table.tableRef = colCache.encode(row, col, row + tableHeight - 1, col + width - 1);\n\n table.columns.forEach((column, i) => {\n assert(!!column.name, `Column ${i} must have a name`);\n if (i === 0) {\n assign(column, \"totalsRowLabel\", \"Total\");\n } else {\n assign(column, \"totalsRowFunction\", \"none\");\n column.totalsRowFormula = this.getFormula(column) || undefined;\n }\n });\n }\n\n store(): void {\n // where the table needs to store table data, headers, footers in\n // the sheet...\n const assignStyle = (cell: Cell, style: Partial<Style> | undefined): void => {\n if (style) {\n Object.assign(cell.style, style);\n }\n };\n\n const { worksheet, table } = this;\n const { row, col } = table.tl;\n let count = 0;\n if (table.headerRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const { style, name } = column;\n const cell = r.getCell(col + j);\n cell.value = name;\n assignStyle(cell, style);\n });\n }\n table.rows.forEach(data => {\n const r = worksheet.getRow(row + count++);\n data.forEach((value, j) => {\n const cell = r.getCell(col + j);\n cell.value = value;\n\n assignStyle(cell, table.columns[j].style);\n });\n });\n\n if (table.totalsRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n if (j === 0) {\n cell.value = column.totalsRowLabel;\n } else {\n const formula = this.getFormula(column);\n if (formula) {\n cell.value = {\n formula: column.totalsRowFormula,\n result: column.totalsRowResult\n };\n } else {\n cell.value = null;\n }\n }\n\n assignStyle(cell, column.style);\n });\n }\n }\n\n load(worksheet: Worksheet): void {\n // where the table will read necessary features from a loaded sheet\n const { table } = this;\n const { row, col } = table.tl!;\n let count = 0;\n if (table.headerRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n cell.value = column.name;\n });\n }\n table.rows.forEach(data => {\n const r = worksheet.getRow(row + count++);\n data.forEach((value, j) => {\n const cell = r.getCell(col + j);\n cell.value = value;\n });\n });\n\n if (table.totalsRow) {\n const r = worksheet.getRow(row + count++);\n table.columns.forEach((column, j) => {\n const cell = r.getCell(col + j);\n if (j === 0) {\n cell.value = column.totalsRowLabel;\n } else {\n const formula = this.getFormula(column);\n if (formula) {\n cell.value = {\n formula: column.totalsRowFormula,\n result: column.totalsRowResult\n };\n }\n }\n });\n }\n }\n\n get model(): TableModel {\n return this.table;\n }\n\n set model(value: TableModel) {\n this.table = value;\n }\n\n // ================================================================\n // TODO: Mutating methods\n cacheState(): void {\n if (!this._cache) {\n this._cache = {\n ref: this.ref,\n width: this.width,\n tableHeight: this.tableHeight\n };\n }\n }\n\n commit(): void {\n // changes may have been made that might have on-sheet effects\n if (!this._cache) {\n return;\n }\n\n // check things are ok first\n this.validate();\n\n const ref = colCache.decodeAddress(this._cache.ref);\n if (this.ref !== this._cache.ref) {\n // wipe out whole table footprint at previous location\n for (let i = 0; i < this._cache.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = 0; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n } else {\n // clear out below table if it has shrunk\n for (let i = this.tableHeight; i < this._cache.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = 0; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n\n // clear out to right of table if it has lost columns\n for (let i = 0; i < this.tableHeight; i++) {\n const row = this.worksheet.getRow(ref.row + i);\n for (let j = this.width; j < this._cache.width; j++) {\n const cell = row.getCell(ref.col + j);\n cell.value = null;\n }\n }\n }\n\n this.store();\n }\n\n addRow(values: CellValue[], rowNumber?: number): void {\n // Add a row of data, either insert at rowNumber or append\n this.cacheState();\n\n if (rowNumber === undefined) {\n this.table.rows.push(values);\n } else {\n this.table.rows.splice(rowNumber, 0, values);\n }\n }\n\n removeRows(rowIndex: number, count: number = 1): void {\n // Remove a rows of data\n this.cacheState();\n this.table.rows.splice(rowIndex, count);\n }\n\n getColumn(colIndex: number): Column {\n const column = this.table.columns[colIndex];\n return new Column(this, column, colIndex);\n }\n\n addColumn(column: TableColumnProperties, values: CellValue[], colIndex?: number): void {\n // Add a new column, including column defn and values\n // Inserts at colNumber or adds to the right\n this.cacheState();\n\n if (colIndex === undefined) {\n this.table.columns.push(column);\n this.table.rows.forEach((row, i) => {\n row.push(values[i]);\n });\n } else {\n this.table.columns.splice(colIndex, 0, column);\n this.table.rows.forEach((row, i) => {\n row.splice(colIndex, 0, values[i]);\n });\n }\n }\n\n removeColumns(colIndex: number, count: number = 1): void {\n // Remove a column with data\n this.cacheState();\n\n this.table.columns.splice(colIndex, count);\n this.table.rows.forEach(row => {\n row.splice(colIndex, count);\n });\n }\n\n private _assign<T extends object, K extends keyof T>(target: T, prop: K, value: T[K]): void {\n this.cacheState();\n target[prop] = value;\n }\n\n get ref(): string {\n return this.table.ref;\n }\n set ref(value: string) {\n this._assign(this.table, \"ref\", value);\n }\n\n get name(): string {\n return this.table.name;\n }\n set name(value: string) {\n this.table.name = value;\n }\n\n get displayName(): string {\n return this.table.displayName || this.table.name;\n }\n set displayName(value: string) {\n this.table.displayName = value;\n }\n\n get headerRow(): boolean | undefined {\n return this.table.headerRow;\n }\n set headerRow(value: boolean | undefined) {\n this._assign(this.table, \"headerRow\", value);\n }\n\n get totalsRow(): boolean | undefined {\n return this.table.totalsRow;\n }\n set totalsRow(value: boolean | undefined) {\n this._assign(this.table, \"totalsRow\", value);\n }\n\n get theme(): TableStyleProperties[\"theme\"] {\n return this.table.style.theme;\n }\n set theme(value: TableStyleProperties[\"theme\"]) {\n this.table.style.theme = value;\n }\n\n get showFirstColumn(): boolean | undefined {\n return this.table.style.showFirstColumn;\n }\n set showFirstColumn(value: boolean | undefined) {\n this.table.style.showFirstColumn = value;\n }\n\n get showLastColumn(): boolean | undefined {\n return this.table.style.showLastColumn;\n }\n set showLastColumn(value: boolean | undefined) {\n this.table.style.showLastColumn = value;\n }\n\n get showRowStripes(): boolean | undefined {\n return this.table.style.showRowStripes;\n }\n set showRowStripes(value: boolean | undefined) {\n this.table.style.showRowStripes = value;\n }\n\n get showColumnStripes(): boolean | undefined {\n return this.table.style.showColumnStripes;\n }\n set showColumnStripes(value: boolean | undefined) {\n this.table.style.showColumnStripes = value;\n }\n}\n\nexport { Table, type TableModel };\n","import { colCache } from \"../utils/col-cache\";\n\ninterface ValidationModel {\n [address: string]: any;\n}\n\nclass DataValidations {\n model: ValidationModel;\n\n constructor(model?: ValidationModel) {\n this.model = model || {};\n }\n\n add(address: string, validation: any): any {\n return (this.model[address] = validation);\n }\n\n find(address: string): any {\n // First check direct address match\n const direct = this.model[address];\n if (direct !== undefined) {\n return direct;\n }\n\n // Check range: prefixed keys in model (from parsing large ranges)\n // Only decode address if we have range keys to check\n const keys = Object.keys(this.model);\n const rangeKeys = keys.filter(k => k.startsWith(\"range:\"));\n if (rangeKeys.length === 0) {\n return undefined;\n }\n\n const decoded = colCache.decodeAddress(address);\n for (const key of rangeKeys) {\n const rangeStr = key.slice(6); // Remove \"range:\" prefix\n const rangeDecoded = colCache.decodeEx(rangeStr) as any;\n if (rangeDecoded.dimensions) {\n const tl = rangeDecoded.tl as { row: number; col: number };\n const br = rangeDecoded.br as { row: number; col: number };\n if (\n decoded.row >= tl.row &&\n decoded.row <= br.row &&\n decoded.col >= tl.col &&\n decoded.col <= br.col\n ) {\n return this.model[key];\n }\n }\n }\n\n return undefined;\n }\n\n remove(address: string): void {\n this.model[address] = undefined;\n }\n}\n\nexport { DataValidations };\n","/**\n * Browser-compatible Buffer utilities\n * Provides base64 encoding/decoding and a Buffer-like wrapper for Uint8Array\n */\n\n/**\n * Convert Uint8Array to base64 string\n */\nexport function uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert base64 string to Uint8Array\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Buffer-like wrapper for Uint8Array with toString(\"base64\") support\n * This provides Node.js Buffer-like API for browser environments\n */\nexport class BrowserBuffer extends Uint8Array {\n toString(encoding?: string): string {\n if (encoding === \"base64\") {\n return uint8ArrayToBase64(this);\n }\n return new TextDecoder().decode(this);\n }\n\n static from(data: Uint8Array): BrowserBuffer {\n const buffer = new BrowserBuffer(data.length);\n buffer.set(data);\n return buffer;\n }\n}\n\n/**\n * Convert string to UTF-16LE Uint8Array (used for Excel password hashing)\n */\nexport function stringToUtf16Le(str: string): Uint8Array {\n const bytes = new Uint8Array(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n bytes[i * 2] = code & 0xff;\n bytes[i * 2 + 1] = (code >> 8) & 0xff;\n }\n return bytes;\n}\n\n/**\n * Concatenate multiple Uint8Arrays into one\n */\nexport function concatUint8Arrays(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n","/**\n * Browser-compatible Encryptor with pure JS SHA implementations\n * This provides synchronous hash functions for browser compatibility\n */\n\nimport {\n BrowserBuffer,\n base64ToUint8Array,\n uint8ArrayToBase64,\n stringToUtf16Le,\n concatUint8Arrays\n} from \"./browser-buffer\";\n\n// Helper to convert number to little-endian Uint8Array\nfunction uint32ToLe(num: number): Uint8Array {\n const bytes = new Uint8Array(4);\n bytes[0] = num & 0xff;\n bytes[1] = (num >> 8) & 0xff;\n bytes[2] = (num >> 16) & 0xff;\n bytes[3] = (num >> 24) & 0xff;\n return bytes;\n}\n\n// ============================================================================\n// Pure JavaScript SHA-512 implementation\n// ============================================================================\n\n// SHA-512 constants (first 80 primes 2..409)\nconst K = new BigUint64Array([\n 0x428a2f98d728ae22n,\n 0x7137449123ef65cdn,\n 0xb5c0fbcfec4d3b2fn,\n 0xe9b5dba58189dbb4n,\n 0x3956c25bf348b538n,\n 0x59f111f1b605d019n,\n 0x923f82a4af194f9bn,\n 0xab1c5ed5da6d8118n,\n 0xd807aa98a3030242n,\n 0x12835b0145706fben,\n 0x243185be4ee4b28cn,\n 0x550c7dc3d5ffb4e2n,\n 0x72be5d74f27b896fn,\n 0x80deb1fe3b1696b1n,\n 0x9bdc06a725c71235n,\n 0xc19bf174cf692694n,\n 0xe49b69c19ef14ad2n,\n 0xefbe4786384f25e3n,\n 0x0fc19dc68b8cd5b5n,\n 0x240ca1cc77ac9c65n,\n 0x2de92c6f592b0275n,\n 0x4a7484aa6ea6e483n,\n 0x5cb0a9dcbd41fbd4n,\n 0x76f988da831153b5n,\n 0x983e5152ee66dfabn,\n 0xa831c66d2db43210n,\n 0xb00327c898fb213fn,\n 0xbf597fc7beef0ee4n,\n 0xc6e00bf33da88fc2n,\n 0xd5a79147930aa725n,\n 0x06ca6351e003826fn,\n 0x142929670a0e6e70n,\n 0x27b70a8546d22ffcn,\n 0x2e1b21385c26c926n,\n 0x4d2c6dfc5ac42aedn,\n 0x53380d139d95b3dfn,\n 0x650a73548baf63den,\n 0x766a0abb3c77b2a8n,\n 0x81c2c92e47edaee6n,\n 0x92722c851482353bn,\n 0xa2bfe8a14cf10364n,\n 0xa81a664bbc423001n,\n 0xc24b8b70d0f89791n,\n 0xc76c51a30654be30n,\n 0xd192e819d6ef5218n,\n 0xd69906245565a910n,\n 0xf40e35855771202an,\n 0x106aa07032bbd1b8n,\n 0x19a4c116b8d2d0c8n,\n 0x1e376c085141ab53n,\n 0x2748774cdf8eeb99n,\n 0x34b0bcb5e19b48a8n,\n 0x391c0cb3c5c95a63n,\n 0x4ed8aa4ae3418acbn,\n 0x5b9cca4f7763e373n,\n 0x682e6ff3d6b2b8a3n,\n 0x748f82ee5defb2fcn,\n 0x78a5636f43172f60n,\n 0x84c87814a1f0ab72n,\n 0x8cc702081a6439ecn,\n 0x90befffa23631e28n,\n 0xa4506cebde82bde9n,\n 0xbef9a3f7b2c67915n,\n 0xc67178f2e372532bn,\n 0xca273eceea26619cn,\n 0xd186b8c721c0c207n,\n 0xeada7dd6cde0eb1en,\n 0xf57d4f7fee6ed178n,\n 0x06f067aa72176fban,\n 0x0a637dc5a2c898a6n,\n 0x113f9804bef90daen,\n 0x1b710b35131c471bn,\n 0x28db77f523047d84n,\n 0x32caab7b40c72493n,\n 0x3c9ebe0a15c9bebcn,\n 0x431d67c49c100d4cn,\n 0x4cc5d4becb3e42b6n,\n 0x597f299cfc657e2an,\n 0x5fcb6fab3ad6faecn,\n 0x6c44198c4a475817n\n]);\n\n// Initial hash values for SHA-512\nconst H0 = new BigUint64Array([\n 0x6a09e667f3bcc908n,\n 0xbb67ae8584caa73bn,\n 0x3c6ef372fe94f82bn,\n 0xa54ff53a5f1d36f1n,\n 0x510e527fade682d1n,\n 0x9b05688c2b3e6c1fn,\n 0x1f83d9abfb41bd6bn,\n 0x5be0cd19137e2179n\n]);\n\nfunction rotr64(x: bigint, n: number): bigint {\n return ((x >> BigInt(n)) | (x << BigInt(64 - n))) & 0xffffffffffffffffn;\n}\n\nfunction sha512(message: Uint8Array): Uint8Array {\n // Pre-processing: adding padding bits\n const msgLen = message.length;\n const msgBitLen = BigInt(msgLen * 8);\n\n // Calculate padding length (message + 1 + padding + 16 bytes for length) should be multiple of 128\n const padLen = (128 - ((msgLen + 17) % 128)) % 128;\n const paddedLen = msgLen + 1 + padLen + 16;\n\n const padded = new Uint8Array(paddedLen);\n padded.set(message);\n padded[msgLen] = 0x80;\n\n // Append original length in bits as 128-bit big-endian (we only use lower 64 bits)\n const view = new DataView(padded.buffer);\n // Upper 64 bits (always 0 for messages < 2^64 bits)\n view.setBigUint64(paddedLen - 16, 0n, false);\n // Lower 64 bits\n view.setBigUint64(paddedLen - 8, msgBitLen, false);\n\n // Initialize hash values\n const H = new BigUint64Array(H0);\n\n // Process message in 1024-bit (128-byte) chunks\n const W = new BigUint64Array(80);\n\n for (let chunkStart = 0; chunkStart < paddedLen; chunkStart += 128) {\n const chunkView = new DataView(padded.buffer, chunkStart, 128);\n\n // Copy chunk into first 16 words W[0..15]\n for (let i = 0; i < 16; i++) {\n W[i] = chunkView.getBigUint64(i * 8, false);\n }\n\n // Extend the first 16 words into the remaining 64 words W[16..79]\n for (let i = 16; i < 80; i++) {\n const s0 = rotr64(W[i - 15], 1) ^ rotr64(W[i - 15], 8) ^ (W[i - 15] >> 7n);\n const s1 = rotr64(W[i - 2], 19) ^ rotr64(W[i - 2], 61) ^ (W[i - 2] >> 6n);\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) & 0xffffffffffffffffn;\n }\n\n // Initialize working variables\n let a = H[0],\n b = H[1],\n c = H[2],\n d = H[3];\n let e = H[4],\n f = H[5],\n g = H[6],\n h = H[7];\n\n // Main loop\n for (let i = 0; i < 80; i++) {\n const S1 = rotr64(e, 14) ^ rotr64(e, 18) ^ rotr64(e, 41);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[i] + W[i]) & 0xffffffffffffffffn;\n const S0 = rotr64(a, 28) ^ rotr64(a, 34) ^ rotr64(a, 39);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + maj) & 0xffffffffffffffffn;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) & 0xffffffffffffffffn;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) & 0xffffffffffffffffn;\n }\n\n // Add compressed chunk to current hash value\n H[0] = (H[0] + a) & 0xffffffffffffffffn;\n H[1] = (H[1] + b) & 0xffffffffffffffffn;\n H[2] = (H[2] + c) & 0xffffffffffffffffn;\n H[3] = (H[3] + d) & 0xffffffffffffffffn;\n H[4] = (H[4] + e) & 0xffffffffffffffffn;\n H[5] = (H[5] + f) & 0xffffffffffffffffn;\n H[6] = (H[6] + g) & 0xffffffffffffffffn;\n H[7] = (H[7] + h) & 0xffffffffffffffffn;\n }\n\n // Produce the final hash value (big-endian)\n const result = new Uint8Array(64);\n const resultView = new DataView(result.buffer);\n for (let i = 0; i < 8; i++) {\n resultView.setBigUint64(i * 8, H[i], false);\n }\n\n return result;\n}\n\n// ============================================================================\n// Encryptor implementation\n// ============================================================================\n\nconst Encryptor = {\n /**\n * Calculate a hash of the concatenated buffers with the given algorithm.\n * @param algorithm - The hash algorithm.\n * @returns The hash as Uint8Array\n */\n hash(algorithm: string, ...buffers: Uint8Array[]): Uint8Array {\n const data = concatUint8Arrays(...buffers);\n const algo = algorithm.toLowerCase().replace(\"-\", \"\");\n\n if (algo === \"sha512\") {\n return sha512(data);\n }\n\n throw new Error(`Hash algorithm '${algorithm}' not supported in browser sync mode!`);\n },\n\n /**\n * Convert a password into an encryption key\n * @param password - The password\n * @param hashAlgorithm - The hash algorithm\n * @param saltValue - The salt value (base64 encoded)\n * @param spinCount - The spin count\n * @returns The encryption key (base64 encoded)\n */\n convertPasswordToHash(\n password: string,\n hashAlgorithm: string,\n saltValue: string,\n spinCount: number\n ): string {\n const algo = hashAlgorithm.toLowerCase().replace(\"-\", \"\");\n\n if (algo !== \"sha512\") {\n throw new Error(`Hash algorithm '${hashAlgorithm}' not supported in browser!`);\n }\n\n // Password must be in unicode buffer (UTF-16LE)\n const passwordBuffer = stringToUtf16Le(password);\n\n // Generate the initial hash\n const saltBuffer = base64ToUint8Array(saltValue);\n let key = this.hash(hashAlgorithm, saltBuffer, passwordBuffer);\n\n // Now regenerate until spin count\n for (let i = 0; i < spinCount; i++) {\n const iterator = uint32ToLe(i);\n key = this.hash(hashAlgorithm, key, iterator);\n }\n\n return uint8ArrayToBase64(key);\n },\n\n /**\n * Generates cryptographically strong pseudo-random data.\n * @param size The size argument is a number indicating the number of bytes to generate.\n */\n randomBytes(size: number): BrowserBuffer {\n const bytes = new BrowserBuffer(size);\n crypto.getRandomValues(bytes);\n return bytes;\n }\n};\n\nexport { Encryptor };\n","/**\n * Base utility functions shared between Node.js and Browser\n * Platform-independent implementations only\n */\n\n// =============================================================================\n// Basic utilities\n// =============================================================================\n\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function nop(): void {}\n\nexport const inherits = function <\n T extends new (...args: any[]) => any,\n S extends new (...args: any[]) => any\n>(cls: T, superCtor: S, statics?: any, prototype?: any): void {\n (cls as any).super_ = superCtor;\n\n if (!prototype) {\n prototype = statics;\n statics = null;\n }\n\n if (statics) {\n Object.keys(statics).forEach(i => {\n Object.defineProperty(cls, i, Object.getOwnPropertyDescriptor(statics, i)!);\n });\n }\n\n const properties: PropertyDescriptorMap = {\n constructor: {\n value: cls,\n enumerable: false,\n writable: false,\n configurable: true\n }\n };\n if (prototype) {\n Object.keys(prototype).forEach(i => {\n properties[i] = Object.getOwnPropertyDescriptor(prototype, i)!;\n });\n }\n\n cls.prototype = Object.create(superCtor.prototype, properties);\n};\n\n// =============================================================================\n// Date utilities\n// =============================================================================\n\nexport function dateToExcel(d: Date, date1904?: boolean): number {\n return 25569 + d.getTime() / (24 * 3600 * 1000) - (date1904 ? 1462 : 0);\n}\n\nexport function excelToDate(v: number, date1904?: boolean): Date {\n const millisecondSinceEpoch = Math.round((v - 25569 + (date1904 ? 1462 : 0)) * 24 * 3600 * 1000);\n return new Date(millisecondSinceEpoch);\n}\n\nexport function toIsoDateString(dt: Date): string {\n return dt.toISOString().substr(0, 10);\n}\n\n// =============================================================================\n// Path utilities\n// =============================================================================\n\ninterface PathInfo {\n path: string;\n name: string;\n}\n\nexport function parsePath(filepath: string): PathInfo {\n const last = filepath.lastIndexOf(\"/\");\n return {\n path: filepath.substring(0, last),\n name: filepath.substring(last + 1)\n };\n}\n\nexport function getRelsPath(filepath: string): string {\n const path = parsePath(filepath);\n return `${path.path}/_rels/${path.name}.rels`;\n}\n\n// =============================================================================\n// XML utilities\n// =============================================================================\n\nconst xmlDecodingMap: Record<string, string> = {\n lt: \"<\",\n gt: \">\",\n amp: \"&\",\n quot: '\"',\n apos: \"'\"\n};\n\nexport function xmlDecode(text: string): string {\n return text.replace(/&(#\\d+|#x[0-9A-Fa-f]+|\\w+);/g, (match: string, entity: string) => {\n if (entity[0] === \"#\") {\n // Numeric character reference\n const code = entity[1] === \"x\" ? parseInt(entity.slice(2), 16) : parseInt(entity.slice(1));\n return String.fromCodePoint(code);\n }\n return xmlDecodingMap[entity] || match;\n });\n}\n\n// =============================================================================\n// Parsing utilities\n// =============================================================================\n\nexport function validInt(value: string | number): number {\n const i = typeof value === \"number\" ? value : parseInt(value, 10);\n return Number.isNaN(i) ? 0 : i;\n}\n\nexport function isDateFmt(fmt: string | null | undefined): boolean {\n if (!fmt) {\n return false;\n }\n // must not be a string fmt\n if (fmt.indexOf(\"@\") > -1) {\n return false;\n }\n // must remove all chars inside quotes and []\n let cleanFmt = fmt.replace(/\\[[^\\]]*]/g, \"\");\n cleanFmt = cleanFmt.replace(/\"[^\"]*\"/g, \"\");\n // then check for date formatting chars\n return cleanFmt.match(/[ymdhMsb]+/) !== null;\n}\n\nexport function parseBoolean(value: any): boolean {\n return value === true || value === \"true\" || value === 1 || value === \"1\";\n}\n\n// =============================================================================\n// Collection utilities\n// =============================================================================\n\nexport function* range(start: number, stop: number, step: number = 1): Generator<number> {\n const compareOrder = step > 0 ? (a: number, b: number) => a < b : (a: number, b: number) => a > b;\n for (let value = start; compareOrder(value, stop); value += step) {\n yield value;\n }\n}\n\nexport function toSortedArray(values: Iterable<any>): any[] {\n const result = Array.from(values);\n // If all numbers, use numeric sort\n if (result.every(item => Number.isFinite(item))) {\n return result.sort((a, b) => a - b);\n }\n return result.sort();\n}\n\nexport function objectFromProps<T = any>(\n props: string[],\n value: T | null = null\n): Record<string, T | null> {\n return props.reduce((result: Record<string, T | null>, property: string) => {\n result[property] = value;\n return result;\n }, {});\n}\n\n// =============================================================================\n// Buffer utilities (cross-platform)\n// =============================================================================\n\nconst textDecoder = new TextDecoder(\"utf-8\");\n\n/**\n * Convert a Buffer, ArrayBuffer, or Uint8Array to a UTF-8 string\n * Works in both Node.js and browser environments\n */\nexport function bufferToString(chunk: ArrayBuffer | Uint8Array | string): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n return textDecoder.decode(chunk);\n}\n","/**\n * Browser utility functions\n * Re-exports shared utilities and adds browser-specific implementations\n */\n\n// Re-export all shared utilities\nexport {\n delay,\n nop,\n inherits,\n dateToExcel,\n excelToDate,\n toIsoDateString,\n parsePath,\n getRelsPath,\n xmlDecode,\n validInt,\n isDateFmt,\n parseBoolean,\n range,\n toSortedArray,\n objectFromProps,\n bufferToString\n} from \"./utils.base\";\n\n// =============================================================================\n// XML encoding (Browser version with full Unicode support)\n// =============================================================================\n\nconst xmlEncodingMap: Record<string, string> = {\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n \"&\": \"&amp;\",\n '\"': \"&quot;\",\n \"'\": \"&apos;\"\n};\n\nexport function xmlEncode(text: string): string {\n // Handles special characters:\n // 1. XML entities: < > & \" '\n // 2. Control characters (0x00-0x1F except tab, newline, carriage return)\n // 3. Invalid XML characters: 0xFFFE, 0xFFFF\n // 4. Characters that need escaping in attributes\n\n // First pass: escape XML entities\n let result = text.replace(/[<>&\"']/g, char => xmlEncodingMap[char] || char);\n\n // Second pass: handle control characters and invalid XML characters\n // Valid XML chars: #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n // oxlint-disable-next-line no-control-regex\n result = result.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F\\uFFFE\\uFFFF]/g, char => {\n const code = char.charCodeAt(0);\n // For control characters, use numeric character reference\n return `&#x${code.toString(16).toUpperCase()};`;\n });\n\n // Third pass: handle invalid surrogate pairs\n result = result.replace(\n /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g,\n () => \"\\uFFFD\" // replacement character\n );\n\n return result;\n}\n\n// =============================================================================\n// File system utilities (Browser stub - always returns false)\n// =============================================================================\n\nexport function fileExists(_path: string): Promise<boolean> {\n return Promise.resolve(false);\n}\n\n// =============================================================================\n// Legacy export for backward compatibility\n// =============================================================================\n\nimport {\n nop,\n inherits,\n dateToExcel,\n excelToDate,\n parsePath,\n getRelsPath,\n xmlDecode,\n validInt,\n isDateFmt,\n toIsoDateString,\n parseBoolean,\n range,\n toSortedArray,\n objectFromProps\n} from \"./utils.base\";\n\n/** @deprecated Import functions directly instead of using the utils object */\nexport const utils = {\n nop,\n inherits,\n dateToExcel,\n excelToDate,\n parsePath,\n getRelsPath,\n xmlEncode,\n xmlDecode,\n validInt,\n isDateFmt,\n fs: {\n exists: fileExists\n },\n toIsoDateString,\n parseBoolean,\n range,\n toSortedArray,\n objectFromProps\n};\n","import { range, toSortedArray } from \"../utils/utils\";\nimport { colCache } from \"../utils/col-cache\";\nimport type { Table } from \"./table\";\n\n/**\n * Interface representing the source data abstraction for pivot tables.\n * This allows both Worksheet and Table to be used as pivot table data sources.\n */\nexport interface PivotTableSource {\n /** Name of the source (worksheet name or table name) */\n name: string;\n /** Get row values by 1-indexed row number */\n getRow(rowNumber: number): { values: any[] };\n /** Get column values by 1-indexed column number */\n getColumn(columnNumber: number): { values: any[] };\n /** Get all sheet values as a sparse 2D array */\n getSheetValues(): any[][];\n /** Dimensions with short range reference (e.g., \"A1:E10\") */\n dimensions: { shortRange: string };\n}\n\n/**\n * Model for creating a new pivot table.\n * Pass this to worksheet.addPivotTable() to create a pivot table.\n */\nexport interface PivotTableModel {\n /**\n * Source worksheet for the pivot table data.\n * Either sourceSheet or sourceTable must be provided (mutually exclusive).\n */\n sourceSheet?: PivotTableSource;\n /**\n * Source table for the pivot table data.\n * Either sourceSheet or sourceTable must be provided (mutually exclusive).\n * The table must have headerRow=true and contain at least one data row.\n */\n sourceTable?: Table;\n /** Column names to use as row fields in the pivot table */\n rows: string[];\n /**\n * Column names to use as column fields in the pivot table.\n * If omitted or empty, Excel will use \"Values\" as the column field.\n * @default []\n */\n columns?: string[];\n /** Column names to aggregate as values in the pivot table */\n values: string[];\n /**\n * Aggregation metric for the pivot table values.\n * - 'sum': Sum of values (default)\n * - 'count': Count of values\n * @default 'sum'\n */\n metric?: \"sum\" | \"count\";\n /**\n * Controls whether pivot table style overrides worksheet column widths.\n * - '0': Preserve worksheet column widths (useful for custom sizing)\n * - '1': Apply pivot table style width/height (default Excel behavior)\n * @default '1'\n */\n applyWidthHeightFormats?: \"0\" | \"1\";\n}\n\n/**\n * Represents a cache field in a pivot table.\n * Cache fields store unique values from source columns for row/column grouping.\n */\nexport interface CacheField {\n /** Name of the field (column header from source) */\n name: string;\n /** Unique values for row/column fields, null for value fields */\n sharedItems: any[] | null;\n}\n\n/** Aggregation function types for pivot table data fields */\nexport type PivotTableSubtotal =\n | \"sum\"\n | \"count\"\n | \"average\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"countNums\"\n | \"stdDev\"\n | \"stdDevP\"\n | \"var\"\n | \"varP\";\n\n/**\n * Data field configuration for pivot table aggregation.\n * Defines how values are aggregated in the pivot table.\n */\nexport interface DataField {\n /** Display name for the data field (e.g., \"Sum of Sales\") */\n name: string;\n /** Index of the source field in cacheFields */\n fld: number;\n /** Base field index for calculated fields */\n baseField?: number;\n /** Base item index for calculated fields */\n baseItem?: number;\n /** Aggregation function (default: 'sum') */\n subtotal?: PivotTableSubtotal;\n}\n\n/**\n * Internal pivot table representation used by the library.\n * This is the processed model after calling makePivotTable().\n */\nexport interface PivotTable {\n /** Source data adapter (always present for new pivot tables) */\n source?: PivotTableSource;\n /** Field indices for row fields */\n rows: number[];\n /** Field indices for column fields */\n columns: number[];\n /** Field indices for value fields */\n values: number[];\n /** Aggregation metric */\n metric: \"sum\" | \"count\";\n /** Cache fields with shared items */\n cacheFields: CacheField[];\n /** Cache ID for linking to pivot cache */\n cacheId: string;\n /** Width/height format setting */\n applyWidthHeightFormats: \"0\" | \"1\";\n /** 1-indexed table number for file naming (pivotTable1.xml, pivotTable2.xml, etc.) */\n tableNumber: number;\n /** Flag indicating this pivot table was loaded from file (not newly created) */\n isLoaded?: boolean;\n /** Data fields for loaded pivot tables */\n dataFields?: DataField[];\n /** Cache definition for loaded pivot tables */\n cacheDefinition?: ParsedCacheDefinition;\n /** Cache records for loaded pivot tables */\n cacheRecords?: ParsedCacheRecords;\n}\n\n/**\n * Parsed cache definition from loaded pivot table files.\n */\nexport interface ParsedCacheDefinition {\n sourceRef?: string;\n sourceSheet?: string;\n cacheFields: CacheField[];\n recordCount?: number;\n rId?: string;\n isLoaded?: boolean;\n}\n\n/**\n * Parsed cache records from loaded pivot table files.\n */\nexport interface ParsedCacheRecords {\n records: Array<Array<{ type: string; value?: any }>>;\n count: number;\n isLoaded?: boolean;\n}\n\n// TK(2023-10-10): turn this into a class constructor.\n\n/**\n * Creates a PivotTableSource adapter from a Table object.\n * This allows Tables to be used as pivot table data sources with the same interface as Worksheets.\n */\nfunction createTableSourceAdapter(table: Table): PivotTableSource {\n const tableModel = table.model;\n\n // Validate that table has headerRow enabled (required for pivot table column names)\n if (tableModel.headerRow === false) {\n throw new Error(\n \"Cannot create pivot table from a table without headers. Set headerRow: true on the table.\"\n );\n }\n\n // Validate table has data rows\n if (!tableModel.rows || tableModel.rows.length === 0) {\n throw new Error(\"Cannot create pivot table from an empty table. Add data rows to the table.\");\n }\n\n const columnNames = tableModel.columns.map(col => col.name);\n\n // Check for duplicate column names\n const nameSet = new Set<string>();\n for (const name of columnNames) {\n if (nameSet.has(name)) {\n throw new Error(\n `Duplicate column name \"${name}\" found in table. Pivot tables require unique column names.`\n );\n }\n nameSet.add(name);\n }\n\n // Build the full data array: headers + rows\n const headerRow = [undefined, ...columnNames]; // sparse array starting at index 1\n const dataRows = tableModel.rows.map(row => [undefined, ...row]); // sparse array starting at index 1\n\n // Calculate the range reference for the table\n const tl = tableModel.tl!;\n const startRow = tl.row;\n const startCol = tl.col;\n const endRow = startRow + tableModel.rows.length; // header row + data rows\n const endCol = startCol + columnNames.length - 1;\n\n const shortRange = colCache.encode(startRow, startCol, endRow, endCol);\n\n return {\n name: tableModel.name,\n getRow(rowNumber: number): { values: any[] } {\n if (rowNumber === 1) {\n return { values: headerRow };\n }\n const dataIndex = rowNumber - 2; // rowNumber 2 maps to index 0\n if (dataIndex >= 0 && dataIndex < dataRows.length) {\n return { values: dataRows[dataIndex] };\n }\n return { values: [] };\n },\n getColumn(columnNumber: number): { values: any[] } {\n // Validate column number is within bounds\n if (columnNumber < 1 || columnNumber > columnNames.length) {\n return { values: [] };\n }\n // Values should be sparse array with header at index 1, data starting at index 2\n const values: any[] = [];\n values[1] = columnNames[columnNumber - 1];\n for (let i = 0; i < tableModel.rows.length; i++) {\n values[i + 2] = tableModel.rows[i][columnNumber - 1];\n }\n return { values };\n },\n getSheetValues(): any[][] {\n // Return sparse array where index 1 is header row, and subsequent indices are data rows\n const result: any[][] = [];\n result[1] = headerRow;\n for (let i = 0; i < dataRows.length; i++) {\n result[i + 2] = dataRows[i];\n }\n return result;\n },\n dimensions: { shortRange }\n };\n}\n\n/**\n * Resolves the data source from the model, supporting both sourceSheet and sourceTable.\n */\nfunction resolveSource(model: PivotTableModel): PivotTableSource {\n if (model.sourceTable) {\n return createTableSourceAdapter(model.sourceTable);\n }\n // For sourceSheet, it already implements the required interface\n return model.sourceSheet as PivotTableSource;\n}\n\nfunction makePivotTable(worksheet: any, model: PivotTableModel): PivotTable {\n // Example `model`:\n // {\n // // Source of data (either sourceSheet OR sourceTable):\n // sourceSheet: worksheet1, // Use entire sheet range\n // // OR\n // sourceTable: table, // Use table data\n //\n // // Pivot table fields: values indicate field names;\n // // they come from the first row in `worksheet1` or table column names.\n // rows: ['A', 'B'],\n // columns: ['C'],\n // values: ['E'], // only 1 item possible for now\n // metric: 'sum', // only 'sum' possible for now\n // }\n\n // Validate source exists before trying to resolve it\n if (!model.sourceSheet && !model.sourceTable) {\n throw new Error(\"Either sourceSheet or sourceTable must be provided.\");\n }\n if (model.sourceSheet && model.sourceTable) {\n throw new Error(\"Cannot specify both sourceSheet and sourceTable. Choose one.\");\n }\n\n // Resolve source first to avoid creating adapter multiple times\n const source = resolveSource(model);\n\n validate(worksheet, model, source);\n\n const { rows, values } = model;\n const columns = model.columns ?? [];\n\n const cacheFields = makeCacheFields(source, [...rows, ...columns]);\n\n const nameToIndex = cacheFields.reduce(\n (result: Record<string, number>, cacheField: CacheField, index: number) => {\n result[cacheField.name] = index;\n return result;\n },\n {} as Record<string, number>\n );\n const rowIndices = rows.map(row => nameToIndex[row]);\n const columnIndices = columns.map(column => nameToIndex[column]);\n const valueIndices = values.map(value => nameToIndex[value]);\n\n // Calculate tableNumber based on existing pivot tables (1-indexed)\n const tableNumber = worksheet.workbook.pivotTables.length + 1;\n\n // Base cache ID starts at 10 (Excel convention), each subsequent table increments\n const BASE_CACHE_ID = 10;\n\n // form pivot table object\n return {\n source,\n rows: rowIndices,\n columns: columnIndices,\n values: valueIndices,\n metric: model.metric ?? \"sum\",\n cacheFields,\n // Dynamic cacheId: 10 for first table, 11 for second, etc.\n // Used in <pivotTableDefinition> and xl/workbook.xml\n cacheId: String(BASE_CACHE_ID + tableNumber - 1),\n // Control whether pivot table style overrides worksheet column widths\n // '0' = preserve worksheet column widths (useful for custom sizing)\n // '1' = apply pivot table style width/height (default Excel behavior)\n applyWidthHeightFormats: model.applyWidthHeightFormats ?? \"1\",\n // Table number for file naming (pivotTable1.xml, pivotTable2.xml, etc.)\n tableNumber\n };\n}\n\nfunction validate(_worksheet: any, model: PivotTableModel, source: PivotTableSource): void {\n if (model.metric && model.metric !== \"sum\" && model.metric !== \"count\") {\n throw new Error('Only the \"sum\" and \"count\" metrics are supported at this time.');\n }\n\n const columns = model.columns ?? [];\n\n // Get header names from source (already resolved)\n const headerNames = source.getRow(1).values.slice(1);\n // Use Set for O(1) lookup\n const headerNameSet = new Set(headerNames);\n for (const name of [...model.rows, ...columns, ...model.values]) {\n if (!headerNameSet.has(name)) {\n throw new Error(`The header name \"${name}\" was not found in ${source.name}.`);\n }\n }\n\n if (!model.rows.length) {\n throw new Error(\"No pivot table rows specified.\");\n }\n\n // Allow empty columns - Excel will use \"Values\" as column field\n // But can't have multiple values with columns specified\n if (model.values.length < 1) {\n throw new Error(\"Must have at least one value.\");\n }\n\n if (model.values.length > 1 && columns.length > 0) {\n throw new Error(\n \"It is currently not possible to have multiple values when columns are specified. Please either supply an empty array for columns or a single value.\"\n );\n }\n}\n\nfunction makeCacheFields(\n source: PivotTableSource,\n fieldNamesWithSharedItems: string[]\n): CacheField[] {\n // Cache fields are used in pivot tables to reference source data.\n // Fields in fieldNamesWithSharedItems get their unique values extracted as sharedItems.\n // Other fields (typically numeric) have sharedItems = null.\n\n const names = source.getRow(1).values;\n // Use Set for O(1) lookup instead of object\n const sharedItemsFields = new Set(fieldNamesWithSharedItems);\n\n const aggregate = (columnIndex: number): any[] => {\n const columnValues = source.getColumn(columnIndex).values;\n // Build unique values set directly, skipping header (index 0,1) and null/undefined\n const uniqueValues = new Set<any>();\n for (let i = 2; i < columnValues.length; i++) {\n const v = columnValues[i];\n if (v !== null && v !== undefined) {\n uniqueValues.add(v);\n }\n }\n return toSortedArray(uniqueValues);\n };\n\n // Build result array\n const result: CacheField[] = [];\n for (const columnIndex of range(1, names.length)) {\n const name = names[columnIndex];\n const sharedItems = sharedItemsFields.has(name) ? aggregate(columnIndex) : null;\n result.push({ name, sharedItems });\n }\n return result;\n}\n\nexport { makePivotTable };\n","interface StyleObject {\n [key: string]: any;\n}\n\nconst oneDepthCopy = (obj: StyleObject, nestKeys: string[]): StyleObject => ({\n ...obj,\n ...nestKeys.reduce((memo: StyleObject, key: string) => {\n if (obj[key]) {\n memo[key] = { ...obj[key] };\n }\n return memo;\n }, {})\n});\n\nconst setIfExists = (\n src: StyleObject,\n dst: StyleObject,\n key: string,\n nestKeys: string[] = []\n): void => {\n if (src[key]) {\n dst[key] = oneDepthCopy(src[key], nestKeys);\n }\n};\n\nconst isEmptyObj = (obj: StyleObject): boolean => Object.keys(obj).length === 0;\n\nconst copyStyle = (style: StyleObject | null | undefined): StyleObject | null | undefined => {\n if (!style) {\n return style;\n }\n if (isEmptyObj(style)) {\n return {};\n }\n\n const copied: StyleObject = { ...style };\n\n setIfExists(style, copied, \"font\", [\"color\"]);\n setIfExists(style, copied, \"alignment\");\n setIfExists(style, copied, \"protection\");\n if (style.border) {\n setIfExists(style, copied, \"border\");\n setIfExists(style.border, copied.border, \"top\", [\"color\"]);\n setIfExists(style.border, copied.border, \"left\", [\"color\"]);\n setIfExists(style.border, copied.border, \"bottom\", [\"color\"]);\n setIfExists(style.border, copied.border, \"right\", [\"color\"]);\n setIfExists(style.border, copied.border, \"diagonal\", [\"color\"]);\n }\n\n if (style.fill) {\n setIfExists(style, copied, \"fill\", [\"fgColor\", \"bgColor\", \"center\"]);\n if (style.fill.stops) {\n copied.fill.stops = style.fill.stops.map((s: StyleObject) => oneDepthCopy(s, [\"color\"]));\n }\n }\n\n return copied;\n};\n\nexport { copyStyle };\n","import { colCache, type DecodedRange } from \"../utils/col-cache\";\nimport { Range, type RangeInput } from \"./range\";\nimport { Row, type RowModel } from \"./row\";\nimport { Column, type ColumnModel, type ColumnDefn } from \"./column\";\nimport type { Cell, FormulaResult, FormulaValueData } from \"./cell\";\nimport { Enums } from \"./enums\";\nimport { Image, type ImageModel } from \"./image\";\nimport { Table, type TableModel } from \"./table\";\nimport { DataValidations } from \"./data-validations\";\nimport { Encryptor } from \"../utils/encryptor\";\nimport { makePivotTable, type PivotTable, type PivotTableModel } from \"./pivot-table\";\nimport { copyStyle } from \"../utils/copy-style\";\nimport type { Workbook } from \"./workbook\";\nimport type {\n AddImageRange,\n AutoFilter,\n CellValue,\n ColBreak,\n ConditionalFormattingOptions,\n DataValidation,\n RowBreak,\n RowValues,\n TableProperties,\n WorksheetProperties,\n WorksheetView\n} from \"../types\";\n\n// Type for data validation model - maps address to validation\ntype DataValidationModel = { [address: string]: DataValidation | undefined };\n\ninterface SheetProtection {\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n selectLockedCells?: boolean;\n selectUnlockedCells?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\ninterface WorksheetOptions {\n workbook?: Workbook;\n id?: number;\n orderNo?: number;\n name?: string;\n state?: string;\n properties?: Partial<WorksheetProperties>;\n pageSetup?: Partial<PageSetup>;\n headerFooter?: Partial<HeaderFooter>;\n views?: Partial<WorksheetView>[];\n autoFilter?: AutoFilter | null;\n}\n\ninterface PageSetupMargins {\n left: number;\n right: number;\n top: number;\n bottom: number;\n header: number;\n footer: number;\n}\n\ninterface PageSetup {\n margins: PageSetupMargins;\n orientation: string;\n horizontalDpi: number;\n verticalDpi: number;\n fitToPage: boolean;\n pageOrder: string;\n blackAndWhite: boolean;\n draft: boolean;\n cellComments: string;\n errors: string;\n scale: number;\n fitToWidth: number;\n fitToHeight: number;\n paperSize?: number;\n showRowColHeaders: boolean;\n showGridLines: boolean;\n firstPageNumber?: number;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n rowBreaks: RowBreak[];\n printTitlesRow?: string;\n printTitlesColumn?: string;\n}\n\ninterface HeaderFooter {\n differentFirst: boolean;\n differentOddEven: boolean;\n oddHeader: string | null;\n oddFooter: string | null;\n evenHeader: string | null;\n evenFooter: string | null;\n firstHeader: string | null;\n firstFooter: string | null;\n}\n\ninterface WorksheetModel {\n id: number;\n name: string;\n dataValidations: DataValidationModel;\n properties: Partial<WorksheetProperties>;\n state: string;\n pageSetup: PageSetup;\n headerFooter: HeaderFooter;\n rowBreaks: RowBreak[];\n colBreaks: ColBreak[];\n views: Partial<WorksheetView>[];\n autoFilter: AutoFilter | null;\n media: ImageModel[];\n sheetProtection: SheetProtection | null;\n tables: TableModel[];\n pivotTables: PivotTable[];\n conditionalFormattings: ConditionalFormattingOptions[];\n cols?: ColumnModel[];\n rows?: RowModel[];\n dimensions?: Range;\n merges?: string[];\n mergeCells?: string[];\n}\n\n// Worksheet requirements\n// Operate as sheet inside workbook or standalone\n// Load and Save from file and stream\n// Access/Add/Delete individual cells\n// Manage column widths and row heights\n\nclass Worksheet {\n // Type declarations only - no runtime overhead\n declare private _workbook: Workbook;\n declare public id: number;\n declare public orderNo: number;\n declare private _name: string;\n declare public state: string;\n declare private _rows: Row[];\n declare private _columns: Column[] | null;\n declare private _keys: { [key: string]: Column };\n declare private _merges: { [key: string]: Range };\n declare public rowBreaks: RowBreak[];\n declare public colBreaks: ColBreak[];\n declare public properties: Partial<WorksheetProperties>;\n declare public pageSetup: PageSetup;\n declare public headerFooter: HeaderFooter;\n declare public dataValidations: DataValidations;\n declare public views: Partial<WorksheetView>[];\n declare public autoFilter: AutoFilter | null;\n declare private _media: Image[];\n declare public sheetProtection: SheetProtection | null;\n declare public tables: { [key: string]: Table };\n declare public pivotTables: PivotTable[];\n declare public conditionalFormattings: ConditionalFormattingOptions[];\n declare private _headerRowCount?: number;\n\n constructor(options: WorksheetOptions) {\n options = options || {};\n this._workbook = options.workbook;\n\n // in a workbook, each sheet will have a number\n this.id = options.id || 0;\n this.orderNo = options.orderNo || 0;\n\n // and a name - use the setter to ensure validation and truncation\n this.name = options.name || `sheet${this.id}`;\n\n // add a state\n this.state = options.state || \"visible\";\n\n // rows allows access organised by row. Sparse array of arrays indexed by row-1, col\n // Note: _rows is zero based. Must subtract 1 to go from cell.row to index\n this._rows = [];\n\n // column definitions\n this._columns = null;\n\n // column keys (addRow convenience): key ==> this._collumns index\n this._keys = {};\n\n // keep record of all merges\n this._merges = {};\n\n // record of all row and column pageBreaks\n this.rowBreaks = [];\n this.colBreaks = [];\n\n // for tabColor, default row height, outline levels, etc\n this.properties = Object.assign(\n {},\n {\n defaultRowHeight: 15,\n dyDescent: 55,\n outlineLevelCol: 0,\n outlineLevelRow: 0\n },\n options.properties\n );\n\n // for all things printing\n this.pageSetup = Object.assign(\n {},\n {\n margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 },\n orientation: \"portrait\",\n horizontalDpi: 4294967295,\n verticalDpi: 4294967295,\n fitToPage: !!(\n options.pageSetup &&\n (options.pageSetup.fitToWidth || options.pageSetup.fitToHeight) &&\n !options.pageSetup.scale\n ),\n pageOrder: \"downThenOver\",\n blackAndWhite: false,\n draft: false,\n cellComments: \"None\",\n errors: \"displayed\",\n scale: 100,\n fitToWidth: 1,\n fitToHeight: 1,\n paperSize: undefined,\n showRowColHeaders: false,\n showGridLines: false,\n firstPageNumber: undefined,\n horizontalCentered: false,\n verticalCentered: false,\n rowBreaks: null,\n colBreaks: null\n },\n options.pageSetup\n );\n\n this.headerFooter = Object.assign(\n {},\n {\n differentFirst: false,\n differentOddEven: false,\n oddHeader: null,\n oddFooter: null,\n evenHeader: null,\n evenFooter: null,\n firstHeader: null,\n firstFooter: null\n },\n options.headerFooter\n );\n\n this.dataValidations = new DataValidations();\n\n // for freezepanes, split, zoom, gridlines, etc\n this.views = options.views || [];\n\n this.autoFilter = options.autoFilter || null;\n\n // for images, etc\n this._media = [];\n\n // worksheet protection\n this.sheetProtection = null;\n\n // for tables\n this.tables = {};\n\n this.pivotTables = [];\n\n this.conditionalFormattings = [];\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(name: string | undefined) {\n if (name === undefined) {\n name = `sheet${this.id}`;\n }\n\n if (this._name === name) {\n return;\n }\n\n if (typeof name !== \"string\") {\n throw new Error(\"The name has to be a string.\");\n }\n\n if (name === \"\") {\n throw new Error(\"The name can't be empty.\");\n }\n\n if (name === \"History\") {\n throw new Error('The name \"History\" is protected. Please use a different name.');\n }\n\n // Illegal character in worksheet name: asterisk (*), question mark (?),\n // colon (:), forward slash (/ \\), or bracket ([])\n if (/[*?:/\\\\[\\]]/.test(name)) {\n throw new Error(\n `Worksheet name ${name} cannot include any of the following characters: * ? : \\\\ / [ ]`\n );\n }\n\n if (/(^')|('$)/.test(name)) {\n throw new Error(\n `The first or last character of worksheet name cannot be a single quotation mark: ${name}`\n );\n }\n\n if (name && name.length > 31) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Worksheet name ${name} exceeds 31 chars. This will be truncated`);\n }\n name = name.substring(0, 31);\n }\n\n if (this._workbook.worksheets.find(ws => ws && ws.name.toLowerCase() === name.toLowerCase())) {\n throw new Error(`Worksheet name already exists: ${name}`);\n }\n\n this._name = name;\n }\n\n /**\n * The workbook that contains this worksheet\n */\n get workbook(): Workbook {\n return this._workbook;\n }\n\n /**\n * When you're done with this worksheet, call this to remove from workbook\n */\n destroy(): void {\n this._workbook.removeWorksheetEx(this);\n }\n\n /**\n * Get the bounding range of the cells in this worksheet\n */\n get dimensions(): Range {\n const dimensions = new Range();\n this._rows.forEach(row => {\n if (row) {\n const rowDims = row.dimensions;\n if (rowDims) {\n dimensions.expand(row.number, rowDims.min, row.number, rowDims.max);\n }\n }\n });\n return dimensions;\n }\n\n // =========================================================================\n // Columns\n\n /**\n * Get the current columns array\n */\n get columns(): Column[] {\n return this._columns;\n }\n\n /**\n * Add column headers and define column keys and widths.\n *\n * Note: these column structures are a workbook-building convenience only,\n * apart from the column width, they will not be fully persisted.\n */\n set columns(value: ColumnDefn[]) {\n // calculate max header row count\n this._headerRowCount = value.reduce((pv, cv) => {\n const headerCount = Array.isArray(cv.header) ? cv.header.length : cv.header ? 1 : 0;\n return Math.max(pv, headerCount);\n }, 0);\n\n // construct Column objects\n let count = 1;\n const columns: Column[] = (this._columns = []);\n value.forEach(defn => {\n const column = new Column(this, count++, false);\n columns.push(column);\n column.defn = defn;\n });\n }\n\n getColumnKey(key: string): Column | undefined {\n return this._keys[key];\n }\n\n setColumnKey(key: string, value: Column): void {\n this._keys[key] = value;\n }\n\n deleteColumnKey(key: string): void {\n delete this._keys[key];\n }\n\n eachColumnKey(f: (column: Column, key: string) => void): void {\n Object.keys(this._keys).forEach(key => f(this._keys[key], key));\n }\n\n /**\n * Access an individual column by key, letter and 1-based column number\n */\n getColumn(c: string | number): Column {\n let colNum: number;\n if (typeof c === \"string\") {\n // if it matches a key'd column, return that\n const col = this._keys[c];\n if (col) {\n return col;\n }\n\n // otherwise, assume letter\n colNum = colCache.l2n(c);\n } else {\n colNum = c;\n }\n if (!this._columns) {\n this._columns = [];\n }\n if (colNum > this._columns.length) {\n let n = this._columns.length + 1;\n while (n <= colNum) {\n this._columns.push(new Column(this, n++));\n }\n }\n return this._columns[colNum - 1];\n }\n\n /**\n * Cut one or more columns (columns to the right are shifted left)\n * and optionally insert more\n *\n * If column properties have been defined, they will be cut or moved accordingly\n *\n * Known Issue: If a splice causes any merged cells to move, the results may be unpredictable\n *\n * Also: If the worksheet has more rows than values in the column inserts,\n * the rows will still be shifted as if the values existed\n */\n spliceColumns(start: number, count: number, ...inserts: CellValue[][]): void {\n const rows = this._rows;\n const nRows = rows.length;\n if (inserts.length > 0) {\n // must iterate over all rows whether they exist yet or not\n for (let i = 0; i < nRows; i++) {\n const insertValues = inserts.map(insert => insert[i] || null);\n const row = this.getRow(i + 1);\n row.splice(start, count, ...insertValues);\n }\n } else {\n // nothing to insert, so just splice all rows\n this._rows.forEach(r => {\n if (r) {\n r.splice(start, count);\n }\n });\n }\n\n // splice column definitions\n const nExpand = inserts.length - count;\n const nKeep = start + count;\n const nEnd = this._columns ? this._columns.length : 0;\n if (nExpand < 0) {\n for (let i = start + inserts.length; i <= nEnd; i++) {\n this.getColumn(i).defn = this.getColumn(i - nExpand).defn;\n }\n } else if (nExpand > 0) {\n for (let i = nEnd; i >= nKeep; i--) {\n this.getColumn(i + nExpand).defn = this.getColumn(i).defn;\n }\n }\n for (let i = start; i < start + inserts.length; i++) {\n this.getColumn(i).defn = undefined;\n }\n\n // account for defined names\n this.workbook.definedNames.spliceColumns(this.name, start, count, inserts.length);\n }\n\n /**\n * Get the last column in a worksheet\n */\n get lastColumn(): Column {\n return this.getColumn(this.columnCount);\n }\n\n /**\n * The total column size of the document. Equal to the maximum cell count from all of the rows\n */\n get columnCount(): number {\n let maxCount = 0;\n this.eachRow(row => {\n maxCount = Math.max(maxCount, row.cellCount);\n });\n return maxCount;\n }\n\n /**\n * A count of the number of columns that have values\n */\n get actualColumnCount(): number {\n // performance nightmare - for each row, counts all the columns used\n const counts: boolean[] = [];\n let count = 0;\n this.eachRow(row => {\n row.eachCell(({ col }: { col: number }) => {\n if (!counts[col]) {\n counts[col] = true;\n count++;\n }\n });\n });\n return count;\n }\n\n // =========================================================================\n // Rows\n\n _commitRow(row: Row): void {\n // nop - allows streaming reader to fill a document\n }\n\n get _lastRowNumber(): number {\n // need to cope with results of splice\n const rows = this._rows;\n let n = rows.length;\n while (n > 0 && rows[n - 1] === undefined) {\n n--;\n }\n return n;\n }\n\n get _nextRow(): number {\n return this._lastRowNumber + 1;\n }\n\n /**\n * Get the last editable row in a worksheet (or undefined if there are none)\n */\n get lastRow(): Row | undefined {\n if (this._rows.length) {\n return this._rows[this._rows.length - 1];\n }\n return undefined;\n }\n\n /**\n * Tries to find and return row for row number, else undefined\n *\n * @param r - The 1-indexed row number\n */\n findRow(r: number): Row | undefined {\n return this._rows[r - 1];\n }\n\n /**\n * Tries to find and return rows for row number start and length, else undefined\n *\n * @param start - The 1-indexed starting row number\n * @param length - The length of the expected array\n */\n findRows(start: number, length: number): (Row | undefined)[] {\n return this._rows.slice(start - 1, start - 1 + length);\n }\n\n /**\n * The total row size of the document. Equal to the row number of the last row that has values.\n */\n get rowCount(): number {\n return this._lastRowNumber;\n }\n\n /**\n * A count of the number of rows that have values. If a mid-document row is empty, it will not be included in the count.\n */\n get actualRowCount(): number {\n // counts actual rows that have actual data\n let count = 0;\n this.eachRow(() => {\n count++;\n });\n return count;\n }\n\n // get a row by row number.\n getRow(r: number): any {\n let row = this._rows[r - 1];\n if (!row) {\n row = this._rows[r - 1] = new Row(this, r);\n }\n return row;\n }\n\n // get multiple rows by row number.\n getRows(start: number, length: number): any[] | undefined {\n if (length < 1) {\n return undefined;\n }\n const rows: any[] = [];\n for (let i = start; i < start + length; i++) {\n rows.push(this.getRow(i));\n }\n return rows;\n }\n\n addRow(value: any, style: string = \"n\"): any {\n const rowNo = this._nextRow;\n const row = this.getRow(rowNo);\n row.values = value;\n this._setStyleOption(rowNo, style[0] === \"i\" ? style : \"n\");\n return row;\n }\n\n addRows(value: any[], style: string = \"n\"): any[] {\n const rows: Row[] = [];\n value.forEach(row => {\n rows.push(this.addRow(row, style));\n });\n return rows;\n }\n\n insertRow(pos: number, value: any, style: string = \"n\"): any {\n this.spliceRows(pos, 0, value);\n this._setStyleOption(pos, style);\n return this.getRow(pos);\n }\n\n insertRows(pos: number, values: any[], style: string = \"n\"): Row[] | undefined {\n this.spliceRows(pos, 0, ...values);\n if (style !== \"n\") {\n // copy over the styles\n for (let i = 0; i < values.length; i++) {\n if (style[0] === \"o\" && this.findRow(values.length + pos + i) !== undefined) {\n this._copyStyle(values.length + pos + i, pos + i, style[1] === \"+\");\n } else if (style[0] === \"i\" && this.findRow(pos - 1) !== undefined) {\n this._copyStyle(pos - 1, pos + i, style[1] === \"+\");\n }\n }\n }\n return this.getRows(pos, values.length);\n }\n\n // set row at position to same style as of either pervious row (option 'i') or next row (option 'o')\n _setStyleOption(pos: number, style: string = \"n\"): void {\n if (style[0] === \"o\" && this.findRow(pos + 1) !== undefined) {\n this._copyStyle(pos + 1, pos, style[1] === \"+\");\n } else if (style[0] === \"i\" && this.findRow(pos - 1) !== undefined) {\n this._copyStyle(pos - 1, pos, style[1] === \"+\");\n }\n }\n\n _copyStyle(src: number, dest: number, styleEmpty: boolean = false): void {\n const rSrc = this.getRow(src);\n const rDst = this.getRow(dest);\n rDst.style = copyStyle(rSrc.style);\n rSrc.eachCell({ includeEmpty: styleEmpty }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = copyStyle(cell.style);\n });\n rDst.height = rSrc.height;\n }\n\n /**\n * Duplicate rows and insert new rows\n */\n duplicateRow(rowNum: number, count: number, insert: boolean = false): void {\n // create count duplicates of rowNum\n // either inserting new or overwriting existing rows\n\n const rSrc = this._rows[rowNum - 1];\n const inserts = Array.from<RowValues>({ length: count }).fill(rSrc.values);\n this.spliceRows(rowNum + 1, insert ? 0 : count, ...inserts);\n\n // now copy styles...\n for (let i = 0; i < count; i++) {\n const rDst = this._rows[rowNum + i];\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n });\n }\n }\n\n /**\n * Cut one or more rows (rows below are shifted up)\n * and optionally insert more\n *\n * Known Issue: If a splice causes any merged cells to move, the results may be unpredictable\n */\n spliceRows(start: number, count: number, ...inserts: RowValues[]): void {\n // same problem as row.splice, except worse.\n const nKeep = start + count;\n const nInserts = inserts.length;\n const nExpand = nInserts - count;\n const nEnd = this._rows.length;\n let i: number;\n let rSrc: Row | undefined;\n if (nExpand < 0) {\n // remove rows\n if (start === nEnd) {\n this._rows[nEnd - 1] = undefined;\n }\n for (i = nKeep; i <= nEnd; i++) {\n rSrc = this._rows[i - 1];\n if (rSrc) {\n const rDst = this.getRow(i + nExpand);\n rDst.values = rSrc.values;\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n });\n this._rows[i - 1] = undefined;\n } else {\n this._rows[i + nExpand - 1] = undefined;\n }\n }\n } else if (nExpand > 0) {\n // insert new cells\n for (i = nEnd; i >= nKeep; i--) {\n rSrc = this._rows[i - 1];\n if (rSrc) {\n const rDst = this.getRow(i + nExpand);\n rDst.values = rSrc.values;\n rDst.style = rSrc.style;\n rDst.height = rSrc.height;\n rSrc.eachCell({ includeEmpty: true }, (cell: Cell, colNumber: number) => {\n rDst.getCell(colNumber).style = cell.style;\n\n // remerge cells accounting for insert offset\n if (cell.type === Enums.ValueType.Merge) {\n const cellToBeMerged = this.getRow(cell.row + nInserts).getCell(colNumber);\n const prevMaster = cell.master;\n const newMaster = this.getRow(prevMaster.row + nInserts).getCell(prevMaster.col);\n cellToBeMerged.merge(newMaster);\n }\n });\n } else {\n this._rows[i + nExpand - 1] = undefined;\n }\n }\n }\n\n // now copy over the new values\n for (i = 0; i < nInserts; i++) {\n const rDst = this.getRow(start + i);\n rDst.style = {};\n rDst.values = inserts[i];\n }\n\n // account for defined names\n this.workbook.definedNames.spliceRows(this.name, start, count, nInserts);\n }\n\n /**\n * Iterate over all rows that have values in a worksheet\n */\n eachRow(callback: (row: Row, rowNumber: number) => void): void;\n /**\n * Iterate over all rows (including empty rows) in a worksheet\n */\n eachRow(opt: { includeEmpty?: boolean }, callback: (row: Row, rowNumber: number) => void): void;\n eachRow(\n optOrCallback: { includeEmpty?: boolean } | ((row: Row, rowNumber: number) => void),\n maybeCallback?: (row: Row, rowNumber: number) => void\n ): void {\n let options: { includeEmpty?: boolean } | undefined;\n let callback: (row: Row, rowNumber: number) => void;\n if (typeof optOrCallback === \"function\") {\n callback = optOrCallback;\n } else {\n options = optOrCallback;\n callback = maybeCallback!;\n }\n if (options && options.includeEmpty) {\n const n = this._rows.length;\n for (let i = 1; i <= n; i++) {\n callback(this.getRow(i), i);\n }\n } else {\n this._rows.forEach(row => {\n if (row && row.hasValues) {\n callback(row, row.number);\n }\n });\n }\n }\n\n /**\n * Return all rows as sparse array\n */\n getSheetValues(): CellValue[][] {\n const rows: CellValue[][] = [];\n this._rows.forEach(row => {\n if (row) {\n rows[row.number] = row.values;\n }\n });\n return rows;\n }\n\n // =========================================================================\n // Cells\n\n /**\n * Returns the cell at [r,c] or address given by r. If not found, return undefined\n */\n findCell(r: number | string, c?: number): Cell | undefined {\n const address = colCache.getAddress(r, c);\n const row = this._rows[address.row - 1];\n return row ? row.findCell(address.col) : undefined;\n }\n\n /**\n * Get or create cell at [r,c] or address given by r\n */\n getCell(r: number | string, c?: number): Cell {\n const address = colCache.getAddress(r, c);\n const row = this.getRow(address.row);\n return row.getCellEx(address);\n }\n\n // =========================================================================\n // Merge\n\n /**\n * Merge cells, either:\n *\n * tlbr string, e.g. `'A4:B5'`\n *\n * tl string, br string, e.g. `'G10', 'H11'`\n *\n * t, l, b, r numbers, e.g. `10,11,12,13`\n */\n mergeCells(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n this._mergeCellsInternal(dimensions);\n }\n\n mergeCellsWithoutStyle(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n this._mergeCellsInternal(dimensions, true);\n }\n\n _mergeCellsInternal(dimensions: Range, ignoreStyle?: boolean): void {\n // check cells aren't already merged\n Object.values(this._merges).forEach((merge: Range) => {\n if (merge.intersects(dimensions)) {\n throw new Error(\"Cannot merge already merged cells\");\n }\n });\n\n // apply merge\n const master = this.getCell(dimensions.top, dimensions.left);\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n // merge all but the master cell\n if (i > dimensions.top || j > dimensions.left) {\n this.getCell(i, j).merge(master, ignoreStyle);\n }\n }\n }\n\n // index merge\n this._merges[master.address] = dimensions;\n }\n\n _unMergeMaster(master: Cell): void {\n // master is always top left of a rectangle\n const merge = this._merges[master.address];\n if (merge) {\n for (let i = merge.top; i <= merge.bottom; i++) {\n for (let j = merge.left; j <= merge.right; j++) {\n this.getCell(i, j).unmerge();\n }\n }\n delete this._merges[master.address];\n }\n }\n\n get hasMerges(): boolean {\n // return true if this._merges has a merge object\n return Object.values(this._merges).some(Boolean);\n }\n\n /**\n * Scan the range and if any cell is part of a merge, un-merge the group.\n * Note this function can affect multiple merges and merge-blocks are\n * atomic - either they're all merged or all un-merged.\n */\n unMergeCells(...cells: RangeInput[]): void {\n const dimensions = new Range(cells);\n\n // find any cells in that range and unmerge them\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n const cell = this.findCell(i, j);\n if (cell) {\n if (cell.type === Enums.ValueType.Merge) {\n // this cell merges to another master\n this._unMergeMaster(cell.master);\n } else if (this._merges[cell.address]) {\n // this cell is a master\n this._unMergeMaster(cell);\n }\n }\n }\n }\n }\n\n // ===========================================================================\n // Shared/Array Formula\n fillFormula(\n range: string,\n formula: string,\n results?:\n | FormulaResult[][]\n | FormulaResult[]\n | ((row: number, col: number) => FormulaResult | undefined),\n shareType: string = \"shared\"\n ): void {\n // Define formula for top-left cell and share to rest\n const decoded = colCache.decode(range) as DecodedRange;\n const { top, left, bottom, right } = decoded;\n const width = right - left + 1;\n const masterAddress = colCache.encodeAddress(top, left);\n const isShared = shareType === \"shared\";\n\n // work out result accessor\n let getResult: (row: number, col: number) => FormulaResult | undefined;\n if (typeof results === \"function\") {\n getResult = results;\n } else if (Array.isArray(results)) {\n if (Array.isArray(results[0])) {\n getResult = (row: number, col: number) =>\n (results as FormulaResult[][])[row - top][col - left];\n } else {\n getResult = (row: number, col: number) =>\n (results as FormulaResult[])[(row - top) * width + (col - left)];\n }\n } else {\n getResult = () => undefined;\n }\n let first = true;\n for (let r = top; r <= bottom; r++) {\n for (let c = left; c <= right; c++) {\n if (first) {\n const cell = this.getCell(r, c);\n const formulaValue: FormulaValueData = {\n shareType,\n formula,\n ref: range,\n result: getResult(r, c)\n };\n cell.value = formulaValue as CellValue;\n first = false;\n } else {\n this.getCell(r, c).value = isShared\n ? {\n sharedFormula: masterAddress,\n result: getResult(r, c)\n }\n : getResult(r, c);\n }\n }\n }\n }\n\n // =========================================================================\n // Images\n\n /**\n * Using the image id from `Workbook.addImage`,\n * embed an image within the worksheet to cover a range\n */\n addImage(imageId: string | number, range: AddImageRange): void {\n const model = {\n type: \"image\",\n imageId: String(imageId),\n range\n };\n this._media.push(new Image(this, model));\n }\n\n getImages(): Image[] {\n return this._media.filter(m => m.type === \"image\");\n }\n\n /**\n * Using the image id from `Workbook.addImage`, set the background to the worksheet\n */\n addBackgroundImage(imageId: string | number): void {\n const model = {\n type: \"background\",\n imageId: String(imageId)\n };\n this._media.push(new Image(this, model));\n }\n\n getBackgroundImageId(): string | undefined {\n const image = this._media.find(m => m.type === \"background\");\n return image && image.imageId;\n }\n\n // =========================================================================\n // Worksheet Protection\n\n /**\n * Protect the worksheet with optional password and options\n */\n protect(password?: string, options?: Partial<SheetProtection>): Promise<void> {\n // TODO: make this function truly async\n // perhaps marshal to worker thread or something\n return new Promise(resolve => {\n this.sheetProtection = {\n sheet: true\n };\n if (options && \"spinCount\" in options) {\n // force spinCount to be integer >= 0\n options.spinCount = Number.isFinite(options.spinCount)\n ? Math.round(Math.max(0, options.spinCount))\n : 100000;\n }\n if (password) {\n this.sheetProtection.algorithmName = \"SHA-512\";\n this.sheetProtection.saltValue = Encryptor.randomBytes(16).toString(\"base64\");\n this.sheetProtection.spinCount =\n options && \"spinCount\" in options ? options.spinCount : 100000; // allow user specified spinCount\n this.sheetProtection.hashValue = Encryptor.convertPasswordToHash(\n password,\n \"SHA512\",\n this.sheetProtection.saltValue,\n this.sheetProtection.spinCount\n );\n }\n if (options) {\n this.sheetProtection = Object.assign(this.sheetProtection, options);\n if (!password && \"spinCount\" in options) {\n delete this.sheetProtection.spinCount;\n }\n }\n resolve();\n });\n }\n\n unprotect(): void {\n this.sheetProtection = null;\n }\n\n // =========================================================================\n // Tables\n\n /**\n * Add a new table and return a reference to it\n */\n addTable(model: TableProperties): Table {\n const table = new Table(this, model);\n this.tables[model.name] = table;\n return table;\n }\n\n /**\n * Fetch table by name\n */\n getTable(name: string): Table {\n return this.tables[name];\n }\n\n /**\n * Delete table by name\n */\n removeTable(name: string): void {\n delete this.tables[name];\n }\n\n /**\n * Fetch all tables in the worksheet\n */\n getTables(): Table[] {\n return Object.values(this.tables);\n }\n\n // =========================================================================\n // Pivot Tables\n addPivotTable(model: PivotTableModel): PivotTable {\n const pivotTable = makePivotTable(this, model);\n\n this.pivotTables.push(pivotTable);\n this.workbook.pivotTables.push(pivotTable);\n\n return pivotTable;\n }\n\n // ===========================================================================\n // Conditional Formatting\n\n /**\n * Add conditional formatting rules\n */\n addConditionalFormatting(cf: ConditionalFormattingOptions): void {\n this.conditionalFormattings.push(cf);\n }\n\n /**\n * Delete conditional formatting rules\n */\n removeConditionalFormatting(\n filter:\n | number\n | ((\n value: ConditionalFormattingOptions,\n index: number,\n array: ConditionalFormattingOptions[]\n ) => boolean)\n ): void {\n if (typeof filter === \"number\") {\n this.conditionalFormattings.splice(filter, 1);\n } else if (filter instanceof Function) {\n this.conditionalFormattings = this.conditionalFormattings.filter(filter);\n } else {\n this.conditionalFormattings = [];\n }\n }\n\n // ===========================================================================\n // Model\n\n get model(): WorksheetModel {\n const model: WorksheetModel = {\n id: this.id,\n name: this.name,\n dataValidations: this.dataValidations.model,\n properties: this.properties,\n state: this.state,\n pageSetup: this.pageSetup,\n headerFooter: this.headerFooter,\n rowBreaks: this.rowBreaks,\n colBreaks: this.colBreaks,\n views: this.views,\n autoFilter: this.autoFilter,\n media: this._media.map(medium => medium.model),\n sheetProtection: this.sheetProtection,\n tables: Object.values(this.tables).map(table => table.model),\n pivotTables: this.pivotTables,\n conditionalFormattings: this.conditionalFormattings\n };\n\n // =================================================\n // columns\n model.cols = Column.toModel(this.columns || []);\n\n // ==========================================================\n // Rows\n const rows: RowModel[] = (model.rows = []);\n const dimensions: Range = (model.dimensions = new Range());\n this._rows.forEach(row => {\n const rowModel = row && row.model;\n if (rowModel) {\n dimensions.expand(rowModel.number, rowModel.min, rowModel.number, rowModel.max);\n rows.push(rowModel);\n }\n });\n\n // ==========================================================\n // Merges\n model.merges = [];\n Object.values(this._merges).forEach((merge: Range) => {\n model.merges!.push(merge.range);\n });\n\n return model;\n }\n\n _parseRows(model: WorksheetModel): void {\n this._rows = [];\n if (model.rows) {\n model.rows.forEach(rowModel => {\n const row = new Row(this, rowModel.number);\n this._rows[row.number - 1] = row;\n row.model = rowModel;\n });\n }\n }\n\n _parseMergeCells(model: WorksheetModel): void {\n if (model.mergeCells) {\n model.mergeCells.forEach((merge: string) => {\n // Do not merge styles when importing an Excel file\n // since each cell may have different styles intentionally.\n this.mergeCellsWithoutStyle(merge);\n });\n }\n }\n\n set model(value: WorksheetModel) {\n this.name = value.name;\n this._columns = Column.fromModel(this, value.cols);\n this._parseRows(value);\n\n this._parseMergeCells(value);\n this.dataValidations = new DataValidations(value.dataValidations);\n this.properties = value.properties;\n this.pageSetup = value.pageSetup;\n this.headerFooter = value.headerFooter;\n this.rowBreaks = value.rowBreaks || [];\n this.colBreaks = value.colBreaks || [];\n this.views = value.views;\n this.autoFilter = value.autoFilter;\n this._media = value.media.map(medium => new Image(this, medium));\n this.sheetProtection = value.sheetProtection;\n this.tables = value.tables.reduce((tables: { [key: string]: Table }, table: TableModel) => {\n const t = new Table(this, table);\n t.model = table;\n tables[table.name] = t;\n return tables;\n }, {});\n this.pivotTables = value.pivotTables;\n this.conditionalFormattings = value.conditionalFormattings;\n }\n}\n\nexport { Worksheet, type WorksheetModel };\n","import { colCache } from \"./col-cache\";\n\n// Helper to check for prototype pollution\nfunction isSafeKey(key: string | number): boolean {\n if (typeof key === \"number\") {\n return true;\n }\n return key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\";\n}\n\n// Safe deep clone that filters out prototype pollution keys\nfunction safeDeepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(item => safeDeepClone(item)) as T;\n }\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n if (isSafeKey(key)) {\n result[key] = safeDeepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return result as T;\n}\n\ninterface CellAddress {\n sheetName?: string;\n address: string;\n row: number;\n col: number;\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\ntype Cell = CellAddress & any;\ntype Row = Cell[];\ntype Sheet = Row[];\ntype Sheets = Record<string, Sheet>;\n\nclass CellMatrix {\n template: any;\n sheets: Sheets;\n\n constructor(template?: any) {\n this.template = template;\n this.sheets = {};\n }\n\n addCell(addressStr: string): void {\n this.addCellEx(colCache.decodeEx(addressStr) as any);\n }\n\n getCell(addressStr: string): Cell {\n return this.findCellEx(colCache.decodeEx(addressStr) as any, true);\n }\n\n findCell(addressStr: string): Cell | undefined {\n return this.findCellEx(colCache.decodeEx(addressStr) as any, false);\n }\n\n findCellAt(sheetName: string, rowNumber: number, colNumber: number): Cell | undefined {\n const sheet = this.sheets[sheetName];\n const row = sheet && sheet[rowNumber];\n return row && row[colNumber];\n }\n\n addCellEx(address: CellAddress): void {\n if (address.top !== undefined) {\n for (let row = address.top; row <= address.bottom!; row++) {\n for (let col = address.left!; col <= address.right!; col++) {\n this.getCellAt(address.sheetName!, row, col);\n }\n }\n } else {\n this.findCellEx(address, true);\n }\n }\n\n getCellEx(address: CellAddress): Cell {\n return this.findCellEx(address, true);\n }\n\n findCellEx(address: CellAddress, create: boolean): Cell | undefined {\n const sheet = this.findSheet(address, create);\n const row = this.findSheetRow(sheet, address, create);\n return this.findRowCell(row, address, create);\n }\n\n getCellAt(sheetName: string, rowNumber: number, colNumber: number): Cell {\n if (!isSafeKey(sheetName)) {\n throw new Error(`Invalid sheet name: ${sheetName}`);\n }\n const sheet = this.sheets[sheetName] || (this.sheets[sheetName] = []);\n const row = sheet[rowNumber] || (sheet[rowNumber] = []);\n const cell =\n row[colNumber] ||\n (row[colNumber] = {\n sheetName,\n address: colCache.n2l(colNumber) + rowNumber,\n row: rowNumber,\n col: colNumber\n });\n return cell;\n }\n\n removeCellEx(address: CellAddress): void {\n const sheet = this.findSheet(address, false);\n if (!sheet) {\n return;\n }\n const row = this.findSheetRow(sheet, address, false);\n if (!row) {\n return;\n }\n delete row[address.col];\n }\n\n forEachInSheet(\n sheetName: string,\n callback: (cell: Cell, rowNumber: number, colNumber: number) => void\n ): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n sheet.forEach((row, rowNumber) => {\n if (row) {\n row.forEach((cell, colNumber) => {\n if (cell) {\n callback(cell, rowNumber, colNumber);\n }\n });\n }\n });\n }\n }\n\n forEach(callback: (cell: Cell) => void): void {\n Object.keys(this.sheets).forEach(sheetName => {\n this.forEachInSheet(sheetName as string, callback);\n });\n }\n\n map<T>(callback: (cell: Cell) => T): T[] {\n const results: T[] = [];\n this.forEach(cell => {\n results.push(callback(cell));\n });\n return results;\n }\n\n findSheet(address: CellAddress, create: boolean): Sheet | undefined {\n const name = address.sheetName!;\n if (!isSafeKey(name)) {\n throw new Error(`Invalid sheet name: ${name}`);\n }\n if (Object.prototype.hasOwnProperty.call(this.sheets, name)) {\n return this.sheets[name];\n }\n if (create) {\n return (this.sheets[name] = []);\n }\n return undefined;\n }\n\n findSheetRow(sheet: Sheet | undefined, address: CellAddress, create: boolean): Row | undefined {\n const { row } = address;\n if (!isSafeKey(row)) {\n throw new Error(`Invalid row: ${row}`);\n }\n if (sheet && sheet[row]) {\n return sheet[row];\n }\n if (create) {\n return (sheet![row] = []);\n }\n return undefined;\n }\n\n findRowCell(row: Row | undefined, address: CellAddress, create: boolean): Cell | undefined {\n const { col } = address;\n if (!isSafeKey(col)) {\n throw new Error(`Invalid column: ${col}`);\n }\n if (row && row[col]) {\n return row[col];\n }\n if (create) {\n return (row![col] = this.template\n ? { ...address, ...safeDeepClone(this.template) }\n : address);\n }\n return undefined;\n }\n\n spliceRows(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n const inserts: Row[] = [];\n for (let i = 0; i < numInsert; i++) {\n inserts.push([]);\n }\n sheet.splice(start, numDelete, ...inserts);\n }\n }\n\n spliceColumns(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n const sheet = this.sheets[sheetName];\n if (sheet) {\n const inserts: (Cell | null)[] = [];\n for (let i = 0; i < numInsert; i++) {\n inserts.push(null);\n }\n Object.values(sheet).forEach((row: Row) => {\n row.splice(start, numDelete, ...inserts);\n });\n }\n }\n}\n\nexport { CellMatrix };\n","import { colCache, type DecodedRange } from \"../utils/col-cache\";\nimport { CellMatrix } from \"../utils/cell-matrix\";\nimport { Range } from \"./range\";\nimport type { Address } from \"../types\";\n\nconst rangeRegexp = /[$](\\w+)[$](\\d+)(:[$](\\w+)[$](\\d+))?/;\n\n// Cell type for defined names - extends Address with mark for exploration algorithm\ninterface DefinedNameCell {\n sheetName?: string;\n address: string;\n row: number;\n col: number;\n mark?: boolean;\n}\n\n// Location can be a single cell address or a range\ntype CellLocation = Address | DecodedRange;\n\ninterface DefinedNameModel {\n name: string;\n ranges: string[];\n}\n\nclass DefinedNames {\n matrixMap: Record<string, CellMatrix>;\n\n constructor() {\n this.matrixMap = {};\n }\n\n getMatrix(name: string): CellMatrix {\n const matrix = this.matrixMap[name] || (this.matrixMap[name] = new CellMatrix());\n return matrix;\n }\n\n // add a name to a cell. locStr in the form SheetName!$col$row or SheetName!$c1$r1:$c2:$r2\n add(locStr: string, name: string): void {\n const location = colCache.decodeEx(locStr);\n if (\"error\" in location) {\n return; // Invalid reference, skip\n }\n this.addEx(location, name);\n }\n\n addEx(location: CellLocation, name: string): void {\n const matrix = this.getMatrix(name);\n if (\"top\" in location) {\n // It's a range (DecodedRange has top/left/bottom/right from Location)\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n const address = {\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n };\n\n matrix.addCellEx(address);\n }\n }\n } else {\n // It's a single cell address\n matrix.addCellEx(location);\n }\n }\n\n remove(locStr: string, name: string): void {\n const location = colCache.decodeEx(locStr);\n if (\"error\" in location) {\n return; // Invalid reference, skip\n }\n this.removeEx(location, name);\n }\n\n removeEx(location: CellLocation, name: string): void {\n const matrix = this.getMatrix(name);\n if (\"top\" in location) {\n // Range - remove each cell\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n matrix.removeCellEx({\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n });\n }\n }\n } else {\n matrix.removeCellEx(location);\n }\n }\n\n removeAllNames(location: CellLocation): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n if (\"top\" in location) {\n // Range - remove each cell\n for (let col = location.left; col <= location.right; col++) {\n for (let row = location.top; row <= location.bottom; row++) {\n matrix.removeCellEx({\n sheetName: location.sheetName,\n address: colCache.n2l(col) + row,\n row,\n col\n });\n }\n }\n } else {\n matrix.removeCellEx(location);\n }\n });\n }\n\n forEach(callback: (name: string, cell: DefinedNameCell) => void): void {\n Object.entries(this.matrixMap).forEach(([name, matrix]) => {\n matrix.forEach((cell: DefinedNameCell) => {\n callback(name, cell);\n });\n });\n }\n\n // get all the names of a cell\n getNames(addressStr: string): string[] {\n const location = colCache.decodeEx(addressStr);\n if (\"error\" in location || \"top\" in location) {\n return []; // Invalid reference or range not supported\n }\n return this.getNamesEx(location);\n }\n\n getNamesEx(address: Address): string[] {\n return Object.entries(this.matrixMap)\n .map(([name, matrix]) => matrix.findCellEx(address, false) && name)\n .filter((name): name is string => Boolean(name));\n }\n\n _explore(matrix: CellMatrix, cell: DefinedNameCell): Range {\n cell.mark = false;\n const { sheetName } = cell;\n\n const range = new Range(cell.row, cell.col, cell.row, cell.col, sheetName);\n let x: number;\n let y: number;\n\n // Helper to get cell with proper type\n const getCell = (row: number, col: number): DefinedNameCell | undefined => {\n return matrix.findCellAt(sheetName!, row, col) as DefinedNameCell | undefined;\n };\n\n // grow vertical - only one col to worry about\n function vGrow(yy: number, edge: \"top\" | \"bottom\"): boolean {\n const c = getCell(yy, cell.col);\n if (!c || !c.mark) {\n return false;\n }\n range[edge] = yy;\n c.mark = false;\n return true;\n }\n for (y = cell.row - 1; vGrow(y, \"top\"); y--) {}\n for (y = cell.row + 1; vGrow(y, \"bottom\"); y++) {}\n\n // grow horizontal - ensure all rows can grow\n function hGrow(xx: number, edge: \"left\" | \"right\"): boolean {\n const cells: DefinedNameCell[] = [];\n for (y = range.top; y <= range.bottom; y++) {\n const c = getCell(y, xx);\n if (c && c.mark) {\n cells.push(c);\n } else {\n return false;\n }\n }\n range[edge] = xx;\n for (let i = 0; i < cells.length; i++) {\n cells[i].mark = false;\n }\n return true;\n }\n for (x = cell.col - 1; hGrow(x, \"left\"); x--) {}\n for (x = cell.col + 1; hGrow(x, \"right\"); x++) {}\n\n return range;\n }\n\n getRanges(name: string, matrix?: CellMatrix): DefinedNameModel {\n matrix = matrix || this.matrixMap[name];\n\n if (!matrix) {\n return { name, ranges: [] };\n }\n\n // mark and sweep!\n matrix.forEach((cell: DefinedNameCell) => {\n cell.mark = true;\n });\n const ranges = matrix\n .map((cell: DefinedNameCell) => cell.mark && this._explore(matrix!, cell))\n .filter(Boolean)\n .map((range: Range) => range.$shortRange);\n\n return {\n name,\n ranges\n };\n }\n\n normaliseMatrix(matrix: CellMatrix, sheetName: string): void {\n // some of the cells might have shifted on specified sheet\n // need to reassign rows, cols\n matrix.forEachInSheet(\n sheetName,\n (cell: DefinedNameCell | undefined, row: number, col: number) => {\n if (cell) {\n if (cell.row !== row || cell.col !== col) {\n cell.row = row;\n cell.col = col;\n cell.address = colCache.n2l(col) + row;\n }\n }\n }\n );\n }\n\n spliceRows(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n matrix.spliceRows(sheetName, start, numDelete, numInsert);\n this.normaliseMatrix(matrix, sheetName);\n });\n }\n\n spliceColumns(sheetName: string, start: number, numDelete: number, numInsert: number): void {\n Object.values(this.matrixMap).forEach((matrix: CellMatrix) => {\n matrix.spliceColumns(sheetName, start, numDelete, numInsert);\n this.normaliseMatrix(matrix, sheetName);\n });\n }\n\n get model(): DefinedNameModel[] {\n // To get names per cell - just iterate over all names finding cells if they exist\n return Object.entries(this.matrixMap)\n .map(([name, matrix]) => this.getRanges(name, matrix))\n .filter((definedName: DefinedNameModel) => definedName.ranges.length);\n }\n\n set model(value: DefinedNameModel[]) {\n // value is [ { name, ranges }, ... ]\n const matrixMap = (this.matrixMap = {});\n value.forEach(definedName => {\n const matrix = (matrixMap[definedName.name] = new CellMatrix());\n definedName.ranges.forEach(rangeStr => {\n if (rangeRegexp.test(rangeStr.split(\"!\").pop() || \"\")) {\n matrix.addCell(rangeStr);\n }\n });\n });\n }\n}\n\nexport { DefinedNames, type DefinedNameModel };\n","/**\n * WorkbookBase - Platform-independent base class for Workbook\n *\n * This file contains all the shared logic between Node.js and Browser versions.\n * Platform-specific features (xlsx, csv, streaming) are added by subclasses.\n */\n\nimport { Worksheet, type WorksheetModel } from \"./worksheet\";\nimport { DefinedNames, type DefinedNameModel } from \"./defined-names\";\nimport type { PivotTable } from \"./pivot-table\";\nimport type {\n AddWorksheetOptions,\n CalculationProperties,\n Image,\n WorkbookProperties,\n WorkbookView,\n Buffer as ExcelBuffer\n} from \"../types\";\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\n/** Internal media type - more flexible than public Media type */\nexport interface WorkbookMedia {\n type: string;\n extension: string;\n filename?: string;\n buffer?: ExcelBuffer | Uint8Array;\n base64?: string;\n name?: string;\n}\n\n/** Internal model type for serialization */\nexport interface WorkbookModel {\n creator?: string;\n lastModifiedBy?: string;\n lastPrinted?: Date;\n created: Date;\n modified: Date;\n properties: Partial<WorkbookProperties>;\n worksheets: WorksheetModel[];\n sheets?: WorksheetModel[];\n definedNames: DefinedNameModel[];\n views: WorkbookView[];\n company: string;\n manager: string;\n title: string;\n subject: string;\n keywords: string;\n category: string;\n description: string;\n language?: string;\n revision?: number;\n contentStatus?: string;\n themes?: unknown;\n media: WorkbookMedia[];\n pivotTables: PivotTable[];\n /** Loaded pivot tables from file - used during reconciliation */\n loadedPivotTables?: any[];\n calcProperties: Partial<CalculationProperties>;\n}\n\n// =============================================================================\n// WorkbookBase Class\n// =============================================================================\n\n/**\n * Base class for Workbook containing all platform-independent functionality.\n *\n * Subclasses add:\n * - Node.js: xlsx (full), csv, streaming (createStreamWriter/Reader)\n * - Browser: xlsx (buffer only), no csv, no streaming\n */\nexport abstract class WorkbookBase {\n // Metadata\n declare public category: string;\n declare public company: string;\n declare public created: Date;\n declare public description: string;\n declare public keywords: string;\n declare public manager: string;\n declare public modified: Date;\n declare public subject: string;\n declare public title: string;\n declare public creator?: string;\n declare public lastModifiedBy?: string;\n declare public lastPrinted?: Date;\n declare public language?: string;\n declare public revision?: number;\n declare public contentStatus?: string;\n\n // Properties\n declare public properties: Partial<WorkbookProperties>;\n declare public calcProperties: Partial<CalculationProperties>;\n declare public views: WorkbookView[];\n declare public media: WorkbookMedia[];\n declare public pivotTables: PivotTable[];\n\n // Internal\n declare protected _worksheets: Worksheet[];\n declare protected _definedNames: DefinedNames;\n declare protected _themes?: unknown;\n\n constructor() {\n this.category = \"\";\n this.company = \"\";\n this.created = new Date();\n this.description = \"\";\n this.keywords = \"\";\n this.manager = \"\";\n this.modified = this.created;\n this.properties = {};\n this.calcProperties = {};\n this._worksheets = [];\n this.subject = \"\";\n this.title = \"\";\n this.views = [];\n this.media = [];\n this.pivotTables = [];\n this._definedNames = new DefinedNames();\n }\n\n // ===========================================================================\n // Worksheet Management\n // ===========================================================================\n\n get nextId(): number {\n // Find the next unique spot to add worksheet\n for (let i = 1; i < this._worksheets.length; i++) {\n if (!this._worksheets[i]) {\n return i;\n }\n }\n return this._worksheets.length || 1;\n }\n\n /**\n * Add a new worksheet and return a reference to it\n */\n addWorksheet(name?: string, options?: AddWorksheetOptions): Worksheet {\n const id = this.nextId;\n\n const lastOrderNo = this._worksheets.reduce(\n (acc, ws) => ((ws && ws.orderNo) > acc ? ws.orderNo : acc),\n 0\n );\n const worksheetOptions = {\n ...options,\n id,\n name,\n orderNo: lastOrderNo + 1,\n workbook: this as any\n };\n\n const worksheet = new Worksheet(worksheetOptions);\n\n this._worksheets[id] = worksheet;\n return worksheet;\n }\n\n removeWorksheetEx(worksheet: Worksheet): void {\n delete this._worksheets[worksheet.id];\n }\n\n removeWorksheet(id: number | string): void {\n const worksheet = this.getWorksheet(id);\n if (worksheet) {\n worksheet.destroy();\n }\n }\n\n /**\n * Fetch sheet by name or id\n */\n getWorksheet(id?: number | string): Worksheet | undefined {\n if (id === undefined) {\n return this._worksheets.find(Boolean);\n }\n if (typeof id === \"number\") {\n return this._worksheets[id];\n }\n if (typeof id === \"string\") {\n return this._worksheets.find(worksheet => worksheet && worksheet.name === id);\n }\n return undefined;\n }\n\n /**\n * Return a clone of worksheets in order\n */\n get worksheets(): Worksheet[] {\n return this._worksheets\n .slice(1)\n .sort((a, b) => a.orderNo - b.orderNo)\n .filter(Boolean);\n }\n\n /**\n * Iterate over all sheets.\n *\n * Note: `workbook.worksheets.forEach` will still work but this is better.\n */\n eachSheet(callback: (sheet: Worksheet, id: number) => void): void {\n this.worksheets.forEach(sheet => {\n callback(sheet, sheet.id);\n });\n }\n\n // ===========================================================================\n // Defined Names\n // ===========================================================================\n\n get definedNames(): DefinedNames {\n return this._definedNames;\n }\n\n // ===========================================================================\n // Themes\n // ===========================================================================\n\n clearThemes(): void {\n // Note: themes are not an exposed feature, meddle at your peril!\n this._themes = undefined;\n }\n\n // ===========================================================================\n // Images\n // ===========================================================================\n\n /**\n * Add Image to Workbook and return the id\n */\n addImage(image: Image): number {\n const id = this.media.length;\n this.media.push({ ...image, type: \"image\" });\n return id;\n }\n\n getImage(id: number | string): WorkbookMedia | undefined {\n return this.media[Number(id)];\n }\n\n // ===========================================================================\n // Model (Serialization)\n // ===========================================================================\n\n get model(): WorkbookModel {\n return {\n creator: this.creator || \"Unknown\",\n lastModifiedBy: this.lastModifiedBy || \"Unknown\",\n lastPrinted: this.lastPrinted,\n created: this.created,\n modified: this.modified,\n properties: this.properties,\n worksheets: this.worksheets.map(worksheet => worksheet.model),\n sheets: this.worksheets.map(ws => ws.model).filter(Boolean),\n definedNames: this._definedNames.model,\n views: this.views,\n company: this.company,\n manager: this.manager,\n title: this.title,\n subject: this.subject,\n keywords: this.keywords,\n category: this.category,\n description: this.description,\n language: this.language,\n revision: this.revision,\n contentStatus: this.contentStatus,\n themes: this._themes,\n media: this.media,\n pivotTables: this.pivotTables,\n calcProperties: this.calcProperties\n };\n }\n\n set model(value: WorkbookModel) {\n this.creator = value.creator;\n this.lastModifiedBy = value.lastModifiedBy;\n this.lastPrinted = value.lastPrinted;\n this.created = value.created;\n this.modified = value.modified;\n this.company = value.company;\n this.manager = value.manager;\n this.title = value.title;\n this.subject = value.subject;\n this.keywords = value.keywords;\n this.category = value.category;\n this.description = value.description;\n this.language = value.language;\n this.revision = value.revision;\n this.contentStatus = value.contentStatus;\n\n this.properties = value.properties;\n this.calcProperties = value.calcProperties;\n this._worksheets = [];\n value.worksheets.forEach(worksheetModel => {\n const { id, name, state } = worksheetModel;\n const orderNo = value.sheets && value.sheets.findIndex(ws => ws.id === id);\n const worksheet = (this._worksheets[id] = new Worksheet({\n id,\n name,\n orderNo: orderNo !== -1 ? orderNo : undefined,\n state,\n workbook: this as any\n }));\n worksheet.model = worksheetModel;\n });\n\n this._definedNames.model = value.definedNames;\n this.views = value.views;\n this._themes = value.themes;\n this.media = value.media || [];\n\n // Handle pivot tables - either newly created or loaded from file\n // Loaded pivot tables come from loadedPivotTables after reconciliation\n this.pivotTables = value.pivotTables || value.loadedPivotTables || [];\n }\n}\n","/**\n * Base compression utilities using Web Streams API\n * Shared between Node.js and Browser implementations\n *\n * Uses CompressionStream/DecompressionStream API with \"deflate-raw\" format\n * (raw DEFLATE without zlib header/trailer, required for ZIP files)\n *\n * Browser fallback: For browsers without deflate-raw support (Firefox < 113, Safari < 16.4),\n * see deflate-fallback.ts for pure JS implementation\n */\n\n/**\n * Compression options\n */\nexport interface CompressOptions {\n /**\n * Compression level (0-9)\n * - 0: No compression (STORE)\n * - 1: Fastest compression\n * - 6: Default compression (good balance)\n * - 9: Best compression (slowest)\n *\n * Note: CompressionStream does not support level configuration,\n * it uses a fixed level (~6)\n */\n level?: number;\n}\n\n/**\n * Check if CompressionStream is available\n */\nexport function hasCompressionStream(): boolean {\n return typeof CompressionStream !== \"undefined\";\n}\n\n/**\n * Compress using CompressionStream API\n * Uses \"deflate-raw\" format (required for ZIP files)\n *\n * @param data - Data to compress\n * @returns Compressed data\n */\nexport async function compressWithStream(data: Uint8Array): Promise<Uint8Array> {\n const cs = new CompressionStream(\"deflate-raw\");\n const writer = cs.writable.getWriter();\n const reader = cs.readable.getReader();\n\n // Write data and close\n writer.write(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength) as unknown as BufferSource\n );\n writer.close();\n\n // Read all compressed chunks\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n totalLength += value.length;\n }\n\n // Combine chunks into single array\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n\n/**\n * Decompress using DecompressionStream API\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport async function decompressWithStream(data: Uint8Array): Promise<Uint8Array> {\n const ds = new DecompressionStream(\"deflate-raw\");\n const writer = ds.writable.getWriter();\n const reader = ds.readable.getReader();\n\n // Write data and close\n writer.write(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength) as unknown as BufferSource\n );\n writer.close();\n\n // Read all decompressed chunks\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n totalLength += value.length;\n }\n\n // Combine chunks into single array\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n","/**\n * Pure JavaScript DEFLATE implementation for browsers without CompressionStream support\n *\n * This fallback supports:\n * - Decompression: Full DEFLATE decompression (RFC 1951)\n * - Compression: STORE mode only (no compression, but valid DEFLATE format)\n *\n * Used automatically when CompressionStream with \"deflate-raw\" is unavailable:\n * - Firefox < 113\n * - Safari < 16.4\n * - Chrome < 103\n */\n\n// ============================================================================\n// DEFLATE Decompression (Full implementation)\n// ============================================================================\n\n// Fixed Huffman code lengths for literals/lengths (RFC 1951)\nconst FIXED_LITERAL_LENGTHS = new Uint8Array(288);\nfor (let i = 0; i <= 143; i++) {\n FIXED_LITERAL_LENGTHS[i] = 8;\n}\nfor (let i = 144; i <= 255; i++) {\n FIXED_LITERAL_LENGTHS[i] = 9;\n}\nfor (let i = 256; i <= 279; i++) {\n FIXED_LITERAL_LENGTHS[i] = 7;\n}\nfor (let i = 280; i <= 287; i++) {\n FIXED_LITERAL_LENGTHS[i] = 8;\n}\n\n// Fixed Huffman code lengths for distances\nconst FIXED_DISTANCE_LENGTHS = new Uint8Array(32).fill(5);\n\n// Length base values and extra bits (codes 257-285)\nconst LENGTH_BASE = [\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131,\n 163, 195, 227, 258\n];\nconst LENGTH_EXTRA = [\n 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0\n];\n\n// Distance base values and extra bits (codes 0-29)\nconst DISTANCE_BASE = [\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049,\n 3073, 4097, 6145, 8193, 12289, 16385, 24577\n];\nconst DISTANCE_EXTRA = [\n 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13\n];\n\n// Code length order for dynamic Huffman tables\nconst CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n\n/**\n * Huffman tree node\n */\ninterface HuffmanNode {\n symbol?: number;\n left?: HuffmanNode;\n right?: HuffmanNode;\n}\n\n/**\n * Build Huffman tree from code lengths\n */\nfunction buildHuffmanTree(lengths: Uint8Array, maxSymbol: number): HuffmanNode {\n // Count codes of each length\n const blCount = new Uint16Array(16);\n for (let i = 0; i < maxSymbol; i++) {\n if (lengths[i] > 0) {\n blCount[lengths[i]]++;\n }\n }\n\n // Find first code value for each length\n const nextCode = new Uint16Array(16);\n let code = 0;\n for (let bits = 1; bits <= 15; bits++) {\n code = (code + blCount[bits - 1]) << 1;\n nextCode[bits] = code;\n }\n\n // Build tree\n const root: HuffmanNode = {};\n\n for (let symbol = 0; symbol < maxSymbol; symbol++) {\n const len = lengths[symbol];\n if (len === 0) {\n continue;\n }\n\n code = nextCode[len]++;\n let node = root;\n\n for (let bit = len - 1; bit >= 0; bit--) {\n const b = (code >> bit) & 1;\n if (b === 0) {\n if (!node.left) {\n node.left = {};\n }\n node = node.left;\n } else {\n if (!node.right) {\n node.right = {};\n }\n node = node.right;\n }\n }\n node.symbol = symbol;\n }\n\n return root;\n}\n\n/**\n * Bit reader for DEFLATE streams\n */\nclass BitReader {\n private data: Uint8Array;\n private pos: number;\n private bitBuf: number;\n private bitCount: number;\n\n constructor(data: Uint8Array) {\n this.data = data;\n this.pos = 0;\n this.bitBuf = 0;\n this.bitCount = 0;\n }\n\n /**\n * Read n bits (LSB first)\n */\n readBits(n: number): number {\n while (this.bitCount < n) {\n if (this.pos >= this.data.length) {\n throw new Error(\"Unexpected end of DEFLATE data\");\n }\n this.bitBuf |= this.data[this.pos++] << this.bitCount;\n this.bitCount += 8;\n }\n const result = this.bitBuf & ((1 << n) - 1);\n this.bitBuf >>= n;\n this.bitCount -= n;\n return result;\n }\n\n /**\n * Decode a symbol using Huffman tree\n */\n decodeSymbol(tree: HuffmanNode): number {\n let node = tree;\n while (node.symbol === undefined) {\n const bit = this.readBits(1);\n node = bit === 0 ? node.left! : node.right!;\n if (!node) {\n throw new Error(\"Invalid Huffman code\");\n }\n }\n return node.symbol;\n }\n\n /**\n * Align to byte boundary\n */\n alignToByte(): void {\n this.bitBuf = 0;\n this.bitCount = 0;\n }\n\n /**\n * Read a byte directly (must be aligned)\n */\n readByte(): number {\n if (this.pos >= this.data.length) {\n throw new Error(\"Unexpected end of data\");\n }\n return this.data[this.pos++];\n }\n\n /**\n * Read 16-bit little-endian value (must be aligned)\n */\n readUint16(): number {\n return this.readByte() | (this.readByte() << 8);\n }\n}\n\n/**\n * Decompress DEFLATE data (raw format, no zlib header)\n *\n * @param data - Compressed data in deflate-raw format\n * @returns Decompressed data\n */\nexport function inflateRaw(data: Uint8Array): Uint8Array {\n const reader = new BitReader(data);\n const output: number[] = [];\n\n let isFinal = false;\n\n while (!isFinal) {\n isFinal = reader.readBits(1) === 1;\n const blockType = reader.readBits(2);\n\n if (blockType === 0) {\n // Stored block (no compression)\n reader.alignToByte();\n const len = reader.readUint16();\n const nlen = reader.readUint16();\n\n if ((len ^ nlen) !== 0xffff) {\n throw new Error(\"Invalid stored block length\");\n }\n\n for (let i = 0; i < len; i++) {\n output.push(reader.readByte());\n }\n } else if (blockType === 1 || blockType === 2) {\n // Compressed block\n let literalTree: HuffmanNode;\n let distanceTree: HuffmanNode;\n\n if (blockType === 1) {\n // Fixed Huffman codes\n literalTree = buildHuffmanTree(FIXED_LITERAL_LENGTHS, 288);\n distanceTree = buildHuffmanTree(FIXED_DISTANCE_LENGTHS, 32);\n } else {\n // Dynamic Huffman codes\n const hlit = reader.readBits(5) + 257;\n const hdist = reader.readBits(5) + 1;\n const hclen = reader.readBits(4) + 4;\n\n // Read code length code lengths\n const codeLengthLengths = new Uint8Array(19);\n for (let i = 0; i < hclen; i++) {\n codeLengthLengths[CODE_LENGTH_ORDER[i]] = reader.readBits(3);\n }\n\n const codeLengthTree = buildHuffmanTree(codeLengthLengths, 19);\n\n // Decode literal/length and distance code lengths\n const allLengths = new Uint8Array(hlit + hdist);\n let i = 0;\n\n while (i < hlit + hdist) {\n const symbol = reader.decodeSymbol(codeLengthTree);\n\n if (symbol < 16) {\n allLengths[i++] = symbol;\n } else if (symbol === 16) {\n // Copy previous length 3-6 times\n const repeat = reader.readBits(2) + 3;\n const prev = allLengths[i - 1];\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = prev;\n }\n } else if (symbol === 17) {\n // Repeat 0 for 3-10 times\n const repeat = reader.readBits(3) + 3;\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = 0;\n }\n } else if (symbol === 18) {\n // Repeat 0 for 11-138 times\n const repeat = reader.readBits(7) + 11;\n for (let j = 0; j < repeat; j++) {\n allLengths[i++] = 0;\n }\n }\n }\n\n literalTree = buildHuffmanTree(allLengths.subarray(0, hlit), hlit);\n distanceTree = buildHuffmanTree(allLengths.subarray(hlit), hdist);\n }\n\n // Decode compressed data\n while (true) {\n const symbol = reader.decodeSymbol(literalTree);\n\n if (symbol < 256) {\n // Literal byte\n output.push(symbol);\n } else if (symbol === 256) {\n // End of block\n break;\n } else {\n // Length/distance pair\n const lengthCode = symbol - 257;\n const length = LENGTH_BASE[lengthCode] + reader.readBits(LENGTH_EXTRA[lengthCode]);\n\n const distCode = reader.decodeSymbol(distanceTree);\n const distance = DISTANCE_BASE[distCode] + reader.readBits(DISTANCE_EXTRA[distCode]);\n\n // Copy from output buffer\n const start = output.length - distance;\n for (let i = 0; i < length; i++) {\n output.push(output[start + i]);\n }\n }\n }\n } else {\n throw new Error(\"Invalid DEFLATE block type: \" + blockType);\n }\n }\n\n return new Uint8Array(output);\n}\n\n// ============================================================================\n// DEFLATE Compression (STORE mode only - no actual compression)\n// ============================================================================\n\n/**\n * Compress data using DEFLATE STORE mode (no compression)\n *\n * This creates valid DEFLATE data but without actual compression.\n * Files will be larger but this works on all browsers.\n *\n * @param data - Data to \"compress\"\n * @returns DEFLATE-formatted data (stored, not compressed)\n */\nexport function deflateRawStore(data: Uint8Array): Uint8Array {\n // Maximum stored block size is 65535 bytes\n const MAX_BLOCK_SIZE = 65535;\n const numBlocks = Math.ceil(data.length / MAX_BLOCK_SIZE) || 1;\n\n // Calculate output size: 5 bytes header per block + data\n const outputSize = numBlocks * 5 + data.length;\n const output = new Uint8Array(outputSize);\n let outPos = 0;\n let inPos = 0;\n\n for (let block = 0; block < numBlocks; block++) {\n const isLast = block === numBlocks - 1;\n const blockSize = Math.min(MAX_BLOCK_SIZE, data.length - inPos);\n\n // Block header: BFINAL (1 bit) + BTYPE=00 (2 bits) = stored block\n // Then align to byte boundary (5 bits padding)\n output[outPos++] = isLast ? 0x01 : 0x00;\n\n // LEN (16-bit little-endian)\n output[outPos++] = blockSize & 0xff;\n output[outPos++] = (blockSize >> 8) & 0xff;\n\n // NLEN (one's complement of LEN)\n output[outPos++] = ~blockSize & 0xff;\n output[outPos++] = (~blockSize >> 8) & 0xff;\n\n // Data\n output.set(data.subarray(inPos, inPos + blockSize), outPos);\n outPos += blockSize;\n inPos += blockSize;\n }\n\n return output.subarray(0, outPos);\n}\n\n// ============================================================================\n// LZ77 + Huffman Compression (Basic implementation)\n// ============================================================================\n\n/**\n * Compress data using DEFLATE with fixed Huffman codes\n *\n * This provides real compression using LZ77 + fixed Huffman codes.\n * Not as efficient as full DEFLATE but much better than STORE mode.\n *\n * @param data - Data to compress\n * @returns Compressed data in deflate-raw format\n */\nexport function deflateRawCompressed(data: Uint8Array): Uint8Array {\n if (data.length === 0) {\n // Empty input: single final block with just end-of-block symbol\n return new Uint8Array([0x03, 0x00]);\n }\n\n // For small data, use STORE mode\n if (data.length < 100) {\n return deflateRawStore(data);\n }\n\n const output = new BitWriter();\n\n // Write final block header with fixed Huffman (BFINAL=1, BTYPE=01)\n output.writeBits(1, 1); // BFINAL\n output.writeBits(1, 2); // BTYPE = 01 (fixed Huffman)\n\n // LZ77 compression with hash table\n const hashTable = new Map<number, number>();\n let pos = 0;\n\n while (pos < data.length) {\n // Try to find a match\n let bestLen = 0;\n let bestDist = 0;\n\n if (pos + 2 < data.length) {\n const hash = (data[pos] << 16) | (data[pos + 1] << 8) | data[pos + 2];\n const matchPos = hashTable.get(hash);\n\n if (matchPos !== undefined && pos - matchPos <= 32768) {\n const dist = pos - matchPos;\n let len = 0;\n const maxLen = Math.min(258, data.length - pos);\n\n while (len < maxLen && data[matchPos + len] === data[pos + len]) {\n len++;\n }\n\n if (len >= 3) {\n bestLen = len;\n bestDist = dist;\n }\n }\n\n // Update hash table\n hashTable.set(hash, pos);\n }\n\n if (bestLen >= 3) {\n // Write length/distance pair\n writeLengthCode(output, bestLen);\n writeDistanceCode(output, bestDist);\n pos += bestLen;\n } else {\n // Write literal\n writeLiteralCode(output, data[pos]);\n pos++;\n }\n }\n\n // Write end-of-block symbol (256)\n writeLiteralCode(output, 256);\n\n return output.finish();\n}\n\n/**\n * Bit writer for DEFLATE output\n */\nclass BitWriter {\n private chunks: Uint8Array[] = [];\n private buffer: number[] = [];\n private bitBuf = 0;\n private bitCount = 0;\n\n writeBits(value: number, count: number): void {\n this.bitBuf |= value << this.bitCount;\n this.bitCount += count;\n\n while (this.bitCount >= 8) {\n this.buffer.push(this.bitBuf & 0xff);\n this.bitBuf >>= 8;\n this.bitCount -= 8;\n\n if (this.buffer.length >= 65536) {\n this.chunks.push(new Uint8Array(this.buffer));\n this.buffer = [];\n }\n }\n }\n\n writeBitsReverse(value: number, count: number): void {\n // Write bits in reverse order (MSB first, used for Huffman codes)\n let reversed = 0;\n for (let i = 0; i < count; i++) {\n reversed = (reversed << 1) | ((value >> i) & 1);\n }\n this.writeBits(reversed, count);\n }\n\n finish(): Uint8Array {\n // Flush remaining bits\n if (this.bitCount > 0) {\n this.buffer.push(this.bitBuf & 0xff);\n }\n\n if (this.chunks.length === 0) {\n return new Uint8Array(this.buffer);\n }\n\n this.chunks.push(new Uint8Array(this.buffer));\n const totalLength = this.chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n}\n\n// Fixed Huffman code tables\nconst LITERAL_CODES: Array<[number, number]> = [];\nconst LITERAL_LENGTHS_TABLE: number[] = [];\n\n// Build fixed literal/length Huffman codes\nfor (let i = 0; i <= 287; i++) {\n let code: number;\n let len: number;\n\n if (i <= 143) {\n // 00110000 - 10111111 (8 bits)\n code = 0x30 + i;\n len = 8;\n } else if (i <= 255) {\n // 110010000 - 111111111 (9 bits)\n code = 0x190 + (i - 144);\n len = 9;\n } else if (i <= 279) {\n // 0000000 - 0010111 (7 bits)\n code = i - 256;\n len = 7;\n } else {\n // 11000000 - 11000111 (8 bits)\n code = 0xc0 + (i - 280);\n len = 8;\n }\n\n LITERAL_CODES[i] = [code, len];\n LITERAL_LENGTHS_TABLE[i] = len;\n}\n\n/**\n * Write a literal or end-of-block symbol using fixed Huffman codes\n */\nfunction writeLiteralCode(output: BitWriter, symbol: number): void {\n const [code, len] = LITERAL_CODES[symbol];\n output.writeBitsReverse(code, len);\n}\n\n/**\n * Write a length code (257-285)\n */\nfunction writeLengthCode(output: BitWriter, length: number): void {\n let code: number;\n let extraBits: number;\n let extraValue: number;\n\n if (length <= 10) {\n code = 257 + length - 3;\n extraBits = 0;\n extraValue = 0;\n } else if (length <= 18) {\n const base = length - 11;\n code = 265 + Math.floor(base / 2);\n extraBits = 1;\n extraValue = base % 2;\n } else if (length <= 34) {\n const base = length - 19;\n code = 269 + Math.floor(base / 4);\n extraBits = 2;\n extraValue = base % 4;\n } else if (length <= 66) {\n const base = length - 35;\n code = 273 + Math.floor(base / 8);\n extraBits = 3;\n extraValue = base % 8;\n } else if (length <= 130) {\n const base = length - 67;\n code = 277 + Math.floor(base / 16);\n extraBits = 4;\n extraValue = base % 16;\n } else if (length <= 257) {\n const base = length - 131;\n code = 281 + Math.floor(base / 32);\n extraBits = 5;\n extraValue = base % 32;\n } else {\n code = 285;\n extraBits = 0;\n extraValue = 0;\n }\n\n writeLiteralCode(output, code);\n if (extraBits > 0) {\n output.writeBits(extraValue, extraBits);\n }\n}\n\n/**\n * Write a distance code\n */\nfunction writeDistanceCode(output: BitWriter, distance: number): void {\n // Distance code table from RFC 1951\n // Each entry: [maxDistance, code, extraBits]\n const DIST_TABLE: Array<[number, number, number]> = [\n [1, 0, 0],\n [2, 1, 0],\n [3, 2, 0],\n [4, 3, 0],\n [6, 4, 1],\n [8, 5, 1],\n [12, 6, 2],\n [16, 7, 2],\n [24, 8, 3],\n [32, 9, 3],\n [48, 10, 4],\n [64, 11, 4],\n [96, 12, 5],\n [128, 13, 5],\n [192, 14, 6],\n [256, 15, 6],\n [384, 16, 7],\n [512, 17, 7],\n [768, 18, 8],\n [1024, 19, 8],\n [1536, 20, 9],\n [2048, 21, 9],\n [3072, 22, 10],\n [4096, 23, 10],\n [6144, 24, 11],\n [8192, 25, 11],\n [12288, 26, 12],\n [16384, 27, 12],\n [24576, 28, 13],\n [32768, 29, 13]\n ];\n\n // Find the appropriate distance code\n let code = 0;\n let extraBits = 0;\n let baseDistance = 1;\n\n for (const [maxDist, c, extra] of DIST_TABLE) {\n if (distance <= maxDist) {\n code = c;\n extraBits = extra;\n break;\n }\n baseDistance = maxDist + 1;\n }\n\n const extraValue = distance - baseDistance;\n\n // Distance codes use 5-bit fixed code (reversed for Huffman)\n output.writeBitsReverse(code, 5);\n if (extraBits > 0) {\n output.writeBits(extraValue, extraBits);\n }\n}\n","/**\n * Browser compression utilities\n *\n * Primary: CompressionStream API (Chrome 103+, Firefox 113+, Safari 16.4+)\n * Fallback: Pure JS DEFLATE implementation for older browsers\n *\n * Supported browsers with fallback:\n * - Chrome >= 85\n * - Firefox >= 79\n * - Safari >= 14\n * - Edge >= 85\n */\n\nimport { type CompressOptions, compressWithStream, decompressWithStream } from \"./compress.base\";\nimport { inflateRaw, deflateRawCompressed, deflateRawStore } from \"./deflate-fallback\";\n\n// Re-export shared types\nexport { type CompressOptions };\n\n/**\n * Check if CompressionStream with \"deflate-raw\" is available\n * Note: Chrome 80-102 has CompressionStream but not deflate-raw support\n */\nexport function hasCompressionStream(): boolean {\n if (typeof CompressionStream === \"undefined\") {\n return false;\n }\n // Test if deflate-raw is supported (not just CompressionStream existence)\n try {\n new CompressionStream(\"deflate-raw\");\n return true;\n } catch {\n return false;\n }\n}\n\n// Cache the detection result for performance\nlet _hasDeflateRaw: boolean | null = null;\n\n/**\n * Check if deflate-raw is supported, with caching for performance.\n * The cache is bypassed if CompressionStream is undefined (for testing).\n */\nfunction hasDeflateRawSupport(): boolean {\n // If API doesn't exist, return false immediately (bypass cache for tests)\n if (typeof CompressionStream === \"undefined\") {\n return false;\n }\n\n // Use cached result for performance\n if (_hasDeflateRaw === null) {\n _hasDeflateRaw = hasCompressionStream();\n }\n return _hasDeflateRaw;\n}\n\n/**\n * Check if native zlib is available (always false in browser)\n */\nexport function hasNativeZlib(): boolean {\n return false;\n}\n\n/**\n * Compress data using browser's native CompressionStream or JS fallback\n *\n * @param data - Data to compress\n * @param options - Compression options\n * @returns Compressed data\n *\n * @example\n * ```ts\n * const data = new TextEncoder().encode(\"Hello, World!\");\n * const compressed = await compress(data, { level: 6 });\n * ```\n */\nexport async function compress(\n data: Uint8Array,\n options: { level?: number } = {}\n): Promise<Uint8Array> {\n const level = options.level ?? 6;\n\n // Level 0 means no compression (STORE mode)\n if (level === 0) {\n return deflateRawStore(data);\n }\n\n // Use native CompressionStream if available\n if (hasDeflateRawSupport()) {\n return compressWithStream(data);\n }\n\n // Fallback to pure JS implementation\n return deflateRawCompressed(data);\n}\n\n/**\n * Compress data synchronously using pure JS implementation\n *\n * @param data - Data to compress\n * @param options - Compression options\n * @returns Compressed data\n */\nexport function compressSync(data: Uint8Array, options: { level?: number } = {}): Uint8Array {\n const level = options.level ?? 6;\n\n // Level 0 means no compression (STORE mode)\n if (level === 0) {\n return deflateRawStore(data);\n }\n\n // Pure JS implementation\n return deflateRawCompressed(data);\n}\n\n/**\n * Decompress data using browser's native DecompressionStream or JS fallback\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport async function decompress(data: Uint8Array): Promise<Uint8Array> {\n // Use native DecompressionStream if available\n if (hasDeflateRawSupport()) {\n return decompressWithStream(data);\n }\n\n // Fallback to pure JS implementation\n return inflateRaw(data);\n}\n\n/**\n * Decompress data synchronously using pure JS implementation\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport function decompressSync(data: Uint8Array): Uint8Array {\n return inflateRaw(data);\n}\n","/**\n * Pure Uint8Array-based ZIP parser\n * Works in both Node.js and browser environments\n * No dependency on Node.js stream module\n */\n\nimport { decompress, decompressSync } from \"../zip/compress\";\n\n// ZIP file signatures\nconst LOCAL_FILE_HEADER_SIG = 0x04034b50;\nconst CENTRAL_DIR_HEADER_SIG = 0x02014b50;\nconst END_OF_CENTRAL_DIR_SIG = 0x06054b50;\nconst ZIP64_END_OF_CENTRAL_DIR_SIG = 0x06064b50;\nconst ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG = 0x07064b50;\n\n// Compression methods\nconst COMPRESSION_STORED = 0;\nconst COMPRESSION_DEFLATE = 8;\n\n/**\n * Parse DOS date/time format to JavaScript Date\n * Dates in zip file entries are stored as DosDateTime\n * Spec: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-dosdatetimetofiletime\n */\nfunction parseDateTime(date: number, time?: number): Date {\n const day = date & 0x1f;\n const month = (date >> 5) & 0x0f;\n const year = ((date >> 9) & 0x7f) + 1980;\n const seconds = time ? (time & 0x1f) * 2 : 0;\n const minutes = time ? (time >> 5) & 0x3f : 0;\n const hours = time ? time >> 11 : 0;\n\n return new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));\n}\n\n/**\n * Parse ZIP64 extra field\n */\nfunction parseZip64ExtraField(\n extraField: Uint8Array,\n compressedSize: number,\n uncompressedSize: number,\n localHeaderOffset: number\n): { compressedSize: number; uncompressedSize: number; localHeaderOffset: number } {\n const view = new DataView(extraField.buffer, extraField.byteOffset, extraField.byteLength);\n let offset = 0;\n\n while (offset + 4 <= extraField.length) {\n const signature = view.getUint16(offset, true);\n const partSize = view.getUint16(offset + 2, true);\n\n if (signature === 0x0001) {\n // ZIP64 extended information\n let fieldOffset = offset + 4;\n\n if (uncompressedSize === 0xffffffff && fieldOffset + 8 <= offset + 4 + partSize) {\n uncompressedSize = Number(view.getBigUint64(fieldOffset, true));\n fieldOffset += 8;\n }\n if (compressedSize === 0xffffffff && fieldOffset + 8 <= offset + 4 + partSize) {\n compressedSize = Number(view.getBigUint64(fieldOffset, true));\n fieldOffset += 8;\n }\n if (localHeaderOffset === 0xffffffff && fieldOffset + 8 <= offset + 4 + partSize) {\n localHeaderOffset = Number(view.getBigUint64(fieldOffset, true));\n }\n break;\n }\n\n offset += 4 + partSize;\n }\n\n return { compressedSize, uncompressedSize, localHeaderOffset };\n}\n\n/**\n * Parsed ZIP entry\n */\nexport interface ZipEntryInfo {\n /** File path within the ZIP */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n /** Compression method (0 = stored, 8 = deflate) */\n compressionMethod: number;\n /** CRC-32 checksum */\n crc32: number;\n /** Last modified date */\n lastModified: Date;\n /** Offset to local file header */\n localHeaderOffset: number;\n /** File comment */\n comment: string;\n /** External file attributes */\n externalAttributes: number;\n /** Is encrypted */\n isEncrypted: boolean;\n}\n\n/**\n * ZIP parsing options\n */\nexport interface ZipParseOptions {\n /** Whether to decode file names as UTF-8 (default: true) */\n decodeStrings?: boolean;\n}\n\n/**\n * DataView helper for reading little-endian values\n */\nclass BinaryReader {\n private view: DataView;\n private offset: number;\n private data: Uint8Array;\n\n constructor(data: Uint8Array, offset = 0) {\n this.data = data;\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this.offset = offset;\n }\n\n get position(): number {\n return this.offset;\n }\n\n set position(value: number) {\n this.offset = value;\n }\n\n get remaining(): number {\n return this.data.length - this.offset;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.offset, true);\n this.offset += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n readBigUint64(): bigint {\n const value = this.view.getBigUint64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n readBytes(length: number): Uint8Array {\n const bytes = this.data.subarray(this.offset, this.offset + length);\n this.offset += length;\n return bytes;\n }\n\n readString(length: number, utf8 = true): string {\n const bytes = this.readBytes(length);\n if (utf8) {\n return new TextDecoder(\"utf-8\").decode(bytes);\n }\n // Fallback to ASCII/Latin-1\n return String.fromCharCode(...bytes);\n }\n\n skip(length: number): void {\n this.offset += length;\n }\n\n slice(start: number, end: number): Uint8Array {\n return this.data.subarray(start, end);\n }\n\n peekUint32(offset: number): number {\n return this.view.getUint32(offset, true);\n }\n}\n\n/**\n * Find the End of Central Directory record\n * Searches backwards from the end of the file\n */\nfunction findEndOfCentralDir(data: Uint8Array): number {\n // EOCD is at least 22 bytes, search backwards\n // Comment can be up to 65535 bytes\n const minOffset = Math.max(0, data.length - 65557);\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n for (let i = data.length - 22; i >= minOffset; i--) {\n if (view.getUint32(i, true) === END_OF_CENTRAL_DIR_SIG) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Find ZIP64 End of Central Directory Locator\n */\nfunction findZip64EOCDLocator(data: Uint8Array, eocdOffset: number): number {\n // ZIP64 EOCD Locator is 20 bytes and appears right before EOCD\n const locatorOffset = eocdOffset - 20;\n if (locatorOffset < 0) {\n return -1;\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n if (view.getUint32(locatorOffset, true) === ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG) {\n return locatorOffset;\n }\n\n return -1;\n}\n\n/**\n * Parse ZIP file entries from Central Directory\n */\nexport function parseZipEntries(data: Uint8Array, options: ZipParseOptions = {}): ZipEntryInfo[] {\n const { decodeStrings = true } = options;\n const entries: ZipEntryInfo[] = [];\n\n // Find End of Central Directory\n const eocdOffset = findEndOfCentralDir(data);\n if (eocdOffset === -1) {\n throw new Error(\"Invalid ZIP file: End of Central Directory not found\");\n }\n\n const reader = new BinaryReader(data, eocdOffset);\n\n // Read EOCD\n // Offset Size Description\n // 0 4 EOCD signature (0x06054b50)\n // 4 2 Number of this disk\n // 6 2 Disk where central directory starts\n // 8 2 Number of central directory records on this disk\n // 10 2 Total number of central directory records\n // 12 4 Size of central directory (bytes)\n // 16 4 Offset of start of central directory\n // 20 2 Comment length\n reader.skip(4); // signature\n reader.skip(2); // disk number\n reader.skip(2); // disk where central dir starts\n reader.skip(2); // entries on this disk\n let totalEntries = reader.readUint16(); // total entries\n reader.skip(4); // central directory size (unused)\n let centralDirOffset = reader.readUint32();\n\n // Check for ZIP64\n const zip64LocatorOffset = findZip64EOCDLocator(data, eocdOffset);\n if (zip64LocatorOffset !== -1) {\n const locatorReader = new BinaryReader(data, zip64LocatorOffset);\n locatorReader.skip(4); // signature\n locatorReader.skip(4); // disk number with ZIP64 EOCD\n const zip64EOCDOffset = Number(locatorReader.readBigUint64());\n\n // Read ZIP64 EOCD\n const zip64Reader = new BinaryReader(data, zip64EOCDOffset);\n const zip64Sig = zip64Reader.readUint32();\n if (zip64Sig === ZIP64_END_OF_CENTRAL_DIR_SIG) {\n zip64Reader.skip(8); // size of ZIP64 EOCD\n zip64Reader.skip(2); // version made by\n zip64Reader.skip(2); // version needed\n zip64Reader.skip(4); // disk number\n zip64Reader.skip(4); // disk with central dir\n const zip64TotalEntries = Number(zip64Reader.readBigUint64());\n zip64Reader.skip(8); // central directory size (unused)\n const zip64CentralDirOffset = Number(zip64Reader.readBigUint64());\n\n // Use ZIP64 values if standard values are maxed out\n if (totalEntries === 0xffff) {\n totalEntries = zip64TotalEntries;\n }\n if (centralDirOffset === 0xffffffff) {\n centralDirOffset = zip64CentralDirOffset;\n }\n }\n }\n\n // Read Central Directory entries\n const centralReader = new BinaryReader(data, centralDirOffset);\n\n for (let i = 0; i < totalEntries; i++) {\n const sig = centralReader.readUint32();\n if (sig !== CENTRAL_DIR_HEADER_SIG) {\n throw new Error(`Invalid Central Directory header signature at entry ${i}`);\n }\n\n // Central Directory File Header format:\n // Offset Size Description\n // 0 4 Central directory file header signature (0x02014b50)\n // 4 2 Version made by\n // 6 2 Version needed to extract\n // 8 2 General purpose bit flag\n // 10 2 Compression method\n // 12 2 File last modification time\n // 14 2 File last modification date\n // 16 4 CRC-32\n // 20 4 Compressed size\n // 24 4 Uncompressed size\n // 28 2 File name length\n // 30 2 Extra field length\n // 32 2 File comment length\n // 34 2 Disk number where file starts\n // 36 2 Internal file attributes\n // 38 4 External file attributes\n // 42 4 Relative offset of local file header\n // 46 n File name\n // 46+n m Extra field\n // 46+n+m k File comment\n\n centralReader.skip(2); // version made by\n centralReader.skip(2); // version needed\n const flags = centralReader.readUint16();\n const compressionMethod = centralReader.readUint16();\n const lastModTime = centralReader.readUint16();\n const lastModDate = centralReader.readUint16();\n const crc32 = centralReader.readUint32();\n let compressedSize = centralReader.readUint32();\n let uncompressedSize = centralReader.readUint32();\n const fileNameLength = centralReader.readUint16();\n const extraFieldLength = centralReader.readUint16();\n const commentLength = centralReader.readUint16();\n centralReader.skip(2); // disk number start\n centralReader.skip(2); // internal attributes\n const externalAttributes = centralReader.readUint32();\n let localHeaderOffset = centralReader.readUint32();\n\n // Check for UTF-8 flag (bit 11)\n const isUtf8 = (flags & 0x800) !== 0;\n const useUtf8 = decodeStrings && isUtf8;\n\n const fileName = centralReader.readString(fileNameLength, useUtf8);\n const extraField = centralReader.readBytes(extraFieldLength);\n const comment = centralReader.readString(commentLength, useUtf8);\n\n // Parse extra field for ZIP64 values\n if (extraFieldLength > 0) {\n const parsed = parseZip64ExtraField(\n extraField,\n compressedSize,\n uncompressedSize,\n localHeaderOffset\n );\n compressedSize = parsed.compressedSize;\n uncompressedSize = parsed.uncompressedSize;\n localHeaderOffset = parsed.localHeaderOffset;\n }\n\n const isDirectory = fileName.endsWith(\"/\") || (externalAttributes & 0x10) !== 0;\n const isEncrypted = (flags & 0x01) !== 0;\n\n entries.push({\n path: fileName,\n isDirectory,\n compressedSize,\n uncompressedSize,\n compressionMethod,\n crc32,\n lastModified: parseDateTime(lastModDate, lastModTime),\n localHeaderOffset,\n comment,\n externalAttributes,\n isEncrypted\n });\n }\n\n return entries;\n}\n\n/**\n * Extract file data for a specific entry\n */\nexport async function extractEntryData(data: Uint8Array, entry: ZipEntryInfo): Promise<Uint8Array> {\n if (entry.isDirectory) {\n return new Uint8Array(0);\n }\n\n if (entry.isEncrypted) {\n throw new Error(`File \"${entry.path}\" is encrypted and cannot be extracted`);\n }\n\n const reader = new BinaryReader(data, entry.localHeaderOffset);\n\n // Read local file header\n const sig = reader.readUint32();\n if (sig !== LOCAL_FILE_HEADER_SIG) {\n throw new Error(`Invalid local file header signature for \"${entry.path}\"`);\n }\n\n reader.skip(2); // version needed\n reader.skip(2); // flags\n reader.skip(2); // compression method\n reader.skip(2); // last mod time\n reader.skip(2); // last mod date\n reader.skip(4); // crc32\n reader.skip(4); // compressed size\n reader.skip(4); // uncompressed size\n const fileNameLength = reader.readUint16();\n const extraFieldLength = reader.readUint16();\n\n reader.skip(fileNameLength);\n reader.skip(extraFieldLength);\n\n // Extract compressed data\n const compressedData = reader.readBytes(entry.compressedSize);\n\n // Decompress if needed\n if (entry.compressionMethod === COMPRESSION_STORED) {\n return compressedData;\n } else if (entry.compressionMethod === COMPRESSION_DEFLATE) {\n return decompress(compressedData);\n } else {\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n }\n}\n\n/**\n * Extract file data synchronously (Node.js only)\n */\nexport function extractEntryDataSync(data: Uint8Array, entry: ZipEntryInfo): Uint8Array {\n if (entry.isDirectory) {\n return new Uint8Array(0);\n }\n\n if (entry.isEncrypted) {\n throw new Error(`File \"${entry.path}\" is encrypted and cannot be extracted`);\n }\n\n const reader = new BinaryReader(data, entry.localHeaderOffset);\n\n // Read local file header\n const sig = reader.readUint32();\n if (sig !== LOCAL_FILE_HEADER_SIG) {\n throw new Error(`Invalid local file header signature for \"${entry.path}\"`);\n }\n\n reader.skip(2); // version needed\n reader.skip(2); // flags\n reader.skip(2); // compression method\n reader.skip(2); // last mod time\n reader.skip(2); // last mod date\n reader.skip(4); // crc32\n reader.skip(4); // compressed size\n reader.skip(4); // uncompressed size\n const fileNameLength = reader.readUint16();\n const extraFieldLength = reader.readUint16();\n\n reader.skip(fileNameLength);\n reader.skip(extraFieldLength);\n\n // Extract compressed data\n const compressedData = reader.readBytes(entry.compressedSize);\n\n // Decompress if needed\n if (entry.compressionMethod === COMPRESSION_STORED) {\n return compressedData;\n } else if (entry.compressionMethod === COMPRESSION_DEFLATE) {\n return decompressSync(compressedData);\n } else {\n throw new Error(`Unsupported compression method: ${entry.compressionMethod}`);\n }\n}\n\n/**\n * High-level ZIP parser class\n */\nexport class ZipParser {\n private data: Uint8Array;\n private entries: ZipEntryInfo[];\n private entryMap: Map<string, ZipEntryInfo>;\n\n constructor(data: Uint8Array | ArrayBuffer, options: ZipParseOptions = {}) {\n this.data = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n this.entries = parseZipEntries(this.data, options);\n this.entryMap = new Map(this.entries.map(e => [e.path, e]));\n }\n\n /**\n * Get all entries in the ZIP file\n */\n getEntries(): ZipEntryInfo[] {\n return this.entries;\n }\n\n /**\n * Get entry by path\n */\n getEntry(path: string): ZipEntryInfo | undefined {\n return this.entryMap.get(path);\n }\n\n /**\n * Check if entry exists\n */\n hasEntry(path: string): boolean {\n return this.entryMap.has(path);\n }\n\n /**\n * List all file paths\n */\n listFiles(): string[] {\n return this.entries.map(e => e.path);\n }\n\n /**\n * Extract a single file (async)\n */\n async extract(path: string): Promise<Uint8Array | null> {\n const entry = this.entryMap.get(path);\n if (!entry) {\n return null;\n }\n return extractEntryData(this.data, entry);\n }\n\n /**\n * Extract a single file (sync, Node.js only)\n */\n extractSync(path: string): Uint8Array | null {\n const entry = this.entryMap.get(path);\n if (!entry) {\n return null;\n }\n return extractEntryDataSync(this.data, entry);\n }\n\n /**\n * Extract all files (async)\n */\n async extractAll(): Promise<Map<string, Uint8Array>> {\n const result = new Map<string, Uint8Array>();\n for (const entry of this.entries) {\n const data = await extractEntryData(this.data, entry);\n result.set(entry.path, data);\n }\n return result;\n }\n\n /**\n * Extract all files (sync, Node.js only)\n * Returns object with file paths as keys and Uint8Array content as values\n */\n extractAllSync(): Record<string, Uint8Array> {\n const result: Record<string, Uint8Array> = {};\n for (const entry of this.entries) {\n result[entry.path] = extractEntryDataSync(this.data, entry);\n }\n return result;\n }\n\n /**\n * Iterate over entries with async callback\n */\n async forEach(\n callback: (entry: ZipEntryInfo, getData: () => Promise<Uint8Array>) => Promise<boolean | void>\n ): Promise<void> {\n for (const entry of this.entries) {\n let dataPromise: Promise<Uint8Array> | null = null;\n const getData = () => {\n if (!dataPromise) {\n dataPromise = extractEntryData(this.data, entry);\n }\n return dataPromise;\n };\n\n const shouldContinue = await callback(entry, getData);\n if (shouldContinue === false) {\n break;\n }\n }\n }\n}\n","/**\n * CRC32 calculation utility for ZIP files (Browser version)\n *\n * Uses lookup table optimization - no Node.js dependencies\n *\n * The polynomial used is the standard CRC-32 IEEE 802.3:\n * x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1\n * Represented as 0xEDB88320 in reversed (LSB-first) form\n */\n\n/**\n * Pre-computed CRC32 lookup table (256 entries)\n * Generated using the standard polynomial 0xEDB88320\n */\nconst CRC32_TABLE = /* @__PURE__ */ (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let crc = i;\n for (let j = 0; j < 8; j++) {\n crc = crc & 1 ? 0xedb88320 ^ (crc >>> 1) : crc >>> 1;\n }\n table[i] = crc;\n }\n return table;\n})();\n\n/**\n * Calculate CRC32 checksum for the given data\n *\n * @param data - Input data as Uint8Array\n * @returns CRC32 checksum as unsigned 32-bit integer\n *\n * @example\n * ```ts\n * const data = new TextEncoder().encode(\"Hello, World!\");\n * const checksum = crc32(data);\n * console.log(checksum.toString(16)); // \"ec4ac3d0\"\n * ```\n */\nexport function crc32(data: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\n/**\n * Ensure CRC32 is ready (no-op in browser, for API compatibility)\n */\nexport async function ensureCrc32(): Promise<void> {\n // No-op in browser\n}\n\n/**\n * Calculate CRC32 incrementally (useful for streaming)\n * Call with initial crc of 0xffffffff, then finalize with crc32Finalize\n *\n * @param crc - Current CRC value (start with 0xffffffff)\n * @param data - Input data chunk\n * @returns Updated CRC value (not finalized)\n *\n * @example\n * ```ts\n * let crc = 0xffffffff;\n * crc = crc32Update(crc, chunk1);\n * crc = crc32Update(crc, chunk2);\n * const checksum = crc32Finalize(crc);\n * ```\n */\nexport function crc32Update(crc: number, data: Uint8Array): number {\n for (let i = 0; i < data.length; i++) {\n crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return crc;\n}\n\n/**\n * Finalize CRC32 calculation\n * XOR with 0xffffffff and convert to unsigned 32-bit\n *\n * @param crc - CRC value from crc32Update\n * @returns Final CRC32 checksum\n */\nexport function crc32Finalize(crc: number): number {\n return (crc ^ 0xffffffff) >>> 0;\n}\n","/**\n * ZIP file format builder\n *\n * Implements ZIP file structure according to PKWARE's APPNOTE.TXT specification\n * https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n *\n * ZIP file structure:\n * ┌──────────────────────────┐\n * │ Local File Header 1 │\n * │ File Data 1 │\n * ├──────────────────────────┤\n * │ Local File Header 2 │\n * │ File Data 2 │\n * ├──────────────────────────┤\n * │ ... │\n * ├──────────────────────────┤\n * │ Central Directory 1 │\n * │ Central Directory 2 │\n * │ ... │\n * ├──────────────────────────┤\n * │ End of Central Directory │\n * └──────────────────────────┘\n */\n\nimport { crc32 } from \"./crc32\";\nimport { compress, compressSync, type CompressOptions } from \"./compress\";\n\n/**\n * ZIP file entry\n */\nexport interface ZipEntry {\n /** File name (can include directory path, use forward slashes) */\n name: string;\n /** File data (will be compressed unless level=0) */\n data: Uint8Array;\n /** File modification time (optional, defaults to current time) */\n modTime?: Date;\n /** File comment (optional) */\n comment?: string;\n}\n\n/**\n * ZIP builder options\n */\nexport interface ZipOptions extends CompressOptions {\n /** ZIP file comment (optional) */\n comment?: string;\n}\n\n/**\n * Internal file entry with compression info\n */\ninterface ProcessedEntry {\n name: Uint8Array;\n data: Uint8Array;\n compressedData: Uint8Array;\n crc: number;\n compressionMethod: number;\n modTime: number;\n modDate: number;\n comment: Uint8Array;\n offset: number;\n}\n\n// ZIP signature constants\nconst LOCAL_FILE_HEADER_SIG = 0x04034b50;\nconst CENTRAL_DIR_HEADER_SIG = 0x02014b50;\nconst END_OF_CENTRAL_DIR_SIG = 0x06054b50;\n\n// ZIP version constants\nconst VERSION_NEEDED = 20; // 2.0 - supports DEFLATE\nconst VERSION_MADE_BY = 20; // 2.0\n\n// Compression methods\nconst COMPRESSION_STORE = 0;\nconst COMPRESSION_DEFLATE = 8;\n\n/**\n * Convert Date to DOS time format\n * @param date - Date to convert\n * @returns [dosTime, dosDate]\n */\nfunction dateToDos(date: Date): [number, number] {\n const dosTime =\n ((date.getHours() & 0x1f) << 11) |\n ((date.getMinutes() & 0x3f) << 5) |\n ((date.getSeconds() >> 1) & 0x1f);\n\n const dosDate =\n (((date.getFullYear() - 1980) & 0x7f) << 9) |\n (((date.getMonth() + 1) & 0x0f) << 5) |\n (date.getDate() & 0x1f);\n\n return [dosTime, dosDate];\n}\n\n/**\n * Encode string to UTF-8 bytes\n */\nconst encoder = new TextEncoder();\nfunction encodeString(str: string): Uint8Array {\n return encoder.encode(str);\n}\n\n/**\n * Build Local File Header (30 bytes + filename + extra)\n */\nfunction buildLocalFileHeader(entry: ProcessedEntry): Uint8Array {\n const header = new Uint8Array(30 + entry.name.length);\n const view = new DataView(header.buffer);\n\n view.setUint32(0, LOCAL_FILE_HEADER_SIG, true); // Signature\n view.setUint16(4, VERSION_NEEDED, true); // Version needed to extract\n view.setUint16(6, 0x0800, true); // General purpose bit flag (UTF-8 names)\n view.setUint16(8, entry.compressionMethod, true); // Compression method\n view.setUint16(10, entry.modTime, true); // Last mod time\n view.setUint16(12, entry.modDate, true); // Last mod date\n view.setUint32(14, entry.crc, true); // CRC-32\n view.setUint32(18, entry.compressedData.length, true); // Compressed size\n view.setUint32(22, entry.data.length, true); // Uncompressed size\n view.setUint16(26, entry.name.length, true); // Filename length\n view.setUint16(28, 0, true); // Extra field length\n\n header.set(entry.name, 30);\n\n return header;\n}\n\n/**\n * Build Central Directory Header (46 bytes + filename + extra + comment)\n */\nfunction buildCentralDirHeader(entry: ProcessedEntry): Uint8Array {\n const header = new Uint8Array(46 + entry.name.length + entry.comment.length);\n const view = new DataView(header.buffer);\n\n view.setUint32(0, CENTRAL_DIR_HEADER_SIG, true); // Signature\n view.setUint16(4, VERSION_MADE_BY, true); // Version made by\n view.setUint16(6, VERSION_NEEDED, true); // Version needed to extract\n view.setUint16(8, 0x0800, true); // General purpose bit flag (UTF-8 names)\n view.setUint16(10, entry.compressionMethod, true); // Compression method\n view.setUint16(12, entry.modTime, true); // Last mod time\n view.setUint16(14, entry.modDate, true); // Last mod date\n view.setUint32(16, entry.crc, true); // CRC-32\n view.setUint32(20, entry.compressedData.length, true); // Compressed size\n view.setUint32(24, entry.data.length, true); // Uncompressed size\n view.setUint16(28, entry.name.length, true); // Filename length\n view.setUint16(30, 0, true); // Extra field length\n view.setUint16(32, entry.comment.length, true); // Comment length\n view.setUint16(34, 0, true); // Disk number start\n view.setUint16(36, 0, true); // Internal file attributes\n view.setUint32(38, 0, true); // External file attributes\n view.setUint32(42, entry.offset, true); // Relative offset of local header\n\n header.set(entry.name, 46);\n if (entry.comment.length > 0) {\n header.set(entry.comment, 46 + entry.name.length);\n }\n\n return header;\n}\n\n/**\n * Build End of Central Directory Record (22 bytes + comment)\n */\nfunction buildEndOfCentralDir(\n entryCount: number,\n centralDirSize: number,\n centralDirOffset: number,\n comment: Uint8Array\n): Uint8Array {\n const record = new Uint8Array(22 + comment.length);\n const view = new DataView(record.buffer);\n\n view.setUint32(0, END_OF_CENTRAL_DIR_SIG, true); // Signature\n view.setUint16(4, 0, true); // Number of this disk\n view.setUint16(6, 0, true); // Disk where central dir starts\n view.setUint16(8, entryCount, true); // Number of entries on this disk\n view.setUint16(10, entryCount, true); // Total number of entries\n view.setUint32(12, centralDirSize, true); // Size of central directory\n view.setUint32(16, centralDirOffset, true); // Offset of central directory\n view.setUint16(20, comment.length, true); // Comment length\n\n if (comment.length > 0) {\n record.set(comment, 22);\n }\n\n return record;\n}\n\n/**\n * Create a ZIP file from entries (async)\n *\n * @param entries - Files to include in ZIP\n * @param options - ZIP options\n * @returns ZIP file as Uint8Array\n *\n * @example\n * ```ts\n * const zip = await createZip([\n * { name: \"hello.txt\", data: new TextEncoder().encode(\"Hello!\") },\n * { name: \"folder/file.txt\", data: new TextEncoder().encode(\"Nested!\") }\n * ], { level: 6 });\n * ```\n */\nexport async function createZip(\n entries: ZipEntry[],\n options: ZipOptions = {}\n): Promise<Uint8Array> {\n const level = options.level ?? 6;\n const zipComment = encodeString(options.comment ?? \"\");\n const now = new Date();\n\n // Process entries\n const processedEntries: ProcessedEntry[] = [];\n let currentOffset = 0;\n\n for (const entry of entries) {\n const nameBytes = encodeString(entry.name);\n const commentBytes = encodeString(entry.comment ?? \"\");\n const modDate = entry.modTime ?? now;\n const [dosTime, dosDate] = dateToDos(modDate);\n\n // Compress data\n const isCompressed = level > 0 && entry.data.length > 0;\n const compressedData = isCompressed ? await compress(entry.data, { level }) : entry.data;\n\n const processedEntry: ProcessedEntry = {\n name: nameBytes,\n data: entry.data,\n compressedData,\n crc: crc32(entry.data),\n compressionMethod: isCompressed ? COMPRESSION_DEFLATE : COMPRESSION_STORE,\n modTime: dosTime,\n modDate: dosDate,\n comment: commentBytes,\n offset: currentOffset\n };\n\n // Calculate offset for next entry\n currentOffset += 30 + nameBytes.length + compressedData.length;\n\n processedEntries.push(processedEntry);\n }\n\n // Build ZIP structure\n const chunks: Uint8Array[] = [];\n\n // Local file headers and data\n for (const entry of processedEntries) {\n chunks.push(buildLocalFileHeader(entry));\n chunks.push(entry.compressedData);\n }\n\n const centralDirOffset = currentOffset;\n\n // Central directory\n const centralDirChunks: Uint8Array[] = [];\n for (const entry of processedEntries) {\n centralDirChunks.push(buildCentralDirHeader(entry));\n }\n chunks.push(...centralDirChunks);\n\n const centralDirSize = centralDirChunks.reduce((sum, c) => sum + c.length, 0);\n\n // End of central directory\n chunks.push(\n buildEndOfCentralDir(processedEntries.length, centralDirSize, centralDirOffset, zipComment)\n );\n\n // Combine all chunks\n const totalSize = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n\n/**\n * Create a ZIP file from entries (sync, Node.js only)\n *\n * @param entries - Files to include in ZIP\n * @param options - ZIP options\n * @returns ZIP file as Uint8Array\n * @throws Error if not in Node.js environment\n */\nexport function createZipSync(entries: ZipEntry[], options: ZipOptions = {}): Uint8Array {\n const level = options.level ?? 6;\n const zipComment = encodeString(options.comment ?? \"\");\n const now = new Date();\n\n // Process entries\n const processedEntries: ProcessedEntry[] = [];\n let currentOffset = 0;\n\n for (const entry of entries) {\n const nameBytes = encodeString(entry.name);\n const commentBytes = encodeString(entry.comment ?? \"\");\n const modDate = entry.modTime ?? now;\n const [dosTime, dosDate] = dateToDos(modDate);\n\n // Compress data\n const isCompressed = level > 0 && entry.data.length > 0;\n const compressedData = isCompressed ? compressSync(entry.data, { level }) : entry.data;\n\n const processedEntry: ProcessedEntry = {\n name: nameBytes,\n data: entry.data,\n compressedData,\n crc: crc32(entry.data),\n compressionMethod: isCompressed ? COMPRESSION_DEFLATE : COMPRESSION_STORE,\n modTime: dosTime,\n modDate: dosDate,\n comment: commentBytes,\n offset: currentOffset\n };\n\n currentOffset += 30 + nameBytes.length + compressedData.length;\n\n processedEntries.push(processedEntry);\n }\n\n // Build ZIP structure\n const chunks: Uint8Array[] = [];\n\n // Local file headers and data\n for (const entry of processedEntries) {\n chunks.push(buildLocalFileHeader(entry));\n chunks.push(entry.compressedData);\n }\n\n const centralDirOffset = currentOffset;\n\n // Central directory\n const centralDirChunks: Uint8Array[] = [];\n for (const entry of processedEntries) {\n centralDirChunks.push(buildCentralDirHeader(entry));\n }\n chunks.push(...centralDirChunks);\n\n const centralDirSize = centralDirChunks.reduce((sum, c) => sum + c.length, 0);\n\n // End of central directory\n chunks.push(\n buildEndOfCentralDir(processedEntries.length, centralDirSize, centralDirOffset, zipComment)\n );\n\n // Combine all chunks\n const totalSize = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n\n/**\n * Streaming ZIP builder for large files\n * Writes chunks to a callback as they are generated\n */\nexport class ZipBuilder {\n private entries: ProcessedEntry[] = [];\n private currentOffset = 0;\n private level: number;\n private zipComment: Uint8Array;\n private finalized = false;\n\n /**\n * Create a new ZIP builder\n * @param options - ZIP options\n */\n constructor(options: ZipOptions = {}) {\n this.level = options.level ?? 6;\n this.zipComment = encodeString(options.comment ?? \"\");\n }\n\n /**\n * Add a file to the ZIP (async)\n * @param entry - File entry\n * @returns Local file header and compressed data chunks\n */\n async addFile(entry: ZipEntry): Promise<Uint8Array[]> {\n if (this.finalized) {\n throw new Error(\"Cannot add files after finalizing\");\n }\n\n const nameBytes = encodeString(entry.name);\n const commentBytes = encodeString(entry.comment ?? \"\");\n const [dosTime, dosDate] = dateToDos(entry.modTime ?? new Date());\n\n // Compress data\n const isCompressed = this.level > 0 && entry.data.length > 0;\n const compressedData = isCompressed\n ? await compress(entry.data, { level: this.level })\n : entry.data;\n\n const processedEntry: ProcessedEntry = {\n name: nameBytes,\n data: entry.data,\n compressedData,\n crc: crc32(entry.data),\n compressionMethod: isCompressed ? COMPRESSION_DEFLATE : COMPRESSION_STORE,\n modTime: dosTime,\n modDate: dosDate,\n comment: commentBytes,\n offset: this.currentOffset\n };\n\n this.entries.push(processedEntry);\n this.currentOffset += 30 + nameBytes.length + compressedData.length;\n\n return [buildLocalFileHeader(processedEntry), compressedData];\n }\n\n /**\n * Add a file to the ZIP (sync, Node.js only)\n * @param entry - File entry\n * @returns Local file header and compressed data chunks\n */\n addFileSync(entry: ZipEntry): Uint8Array[] {\n if (this.finalized) {\n throw new Error(\"Cannot add files after finalizing\");\n }\n\n const nameBytes = encodeString(entry.name);\n const commentBytes = encodeString(entry.comment ?? \"\");\n const [dosTime, dosDate] = dateToDos(entry.modTime ?? new Date());\n\n // Compress data\n const isCompressed = this.level > 0 && entry.data.length > 0;\n const compressedData = isCompressed\n ? compressSync(entry.data, { level: this.level })\n : entry.data;\n\n const processedEntry: ProcessedEntry = {\n name: nameBytes,\n data: entry.data,\n compressedData,\n crc: crc32(entry.data),\n compressionMethod: isCompressed ? COMPRESSION_DEFLATE : COMPRESSION_STORE,\n modTime: dosTime,\n modDate: dosDate,\n comment: commentBytes,\n offset: this.currentOffset\n };\n\n this.entries.push(processedEntry);\n this.currentOffset += 30 + nameBytes.length + compressedData.length;\n\n return [buildLocalFileHeader(processedEntry), compressedData];\n }\n\n /**\n * Finalize the ZIP and return central directory + end record\n * @returns Central directory and end of central directory chunks\n */\n finalize(): Uint8Array[] {\n if (this.finalized) {\n throw new Error(\"ZIP already finalized\");\n }\n this.finalized = true;\n\n const chunks: Uint8Array[] = [];\n\n // Central directory\n for (const entry of this.entries) {\n chunks.push(buildCentralDirHeader(entry));\n }\n\n const centralDirSize = chunks.reduce((sum, c) => sum + c.length, 0);\n\n // End of central directory\n chunks.push(\n buildEndOfCentralDir(this.entries.length, centralDirSize, this.currentOffset, this.zipComment)\n );\n\n return chunks;\n }\n\n /**\n * Get current number of entries\n */\n get entryCount(): number {\n return this.entries.length;\n }\n\n /**\n * Get current ZIP data size (without central directory)\n */\n get dataSize(): number {\n return this.currentOffset;\n }\n}\n","interface StringBufOptions {\n size?: number;\n encoding?: BufferEncoding;\n}\n\n// StringBuf - a way to keep string memory operations to a minimum\n// while building the strings for the xml files\nclass StringBuf {\n declare private _buf: Buffer;\n declare private _encoding: BufferEncoding;\n declare private _inPos: number;\n declare private _buffer: Buffer | undefined;\n\n constructor(options?: StringBufOptions) {\n this._buf = Buffer.alloc((options && options.size) || 16384);\n this._encoding = (options && options.encoding) || \"utf8\";\n\n // where in the buffer we are at\n this._inPos = 0;\n\n // for use by toBuffer()\n this._buffer = undefined;\n }\n\n get length(): number {\n return this._inPos;\n }\n\n get capacity(): number {\n return this._buf.length;\n }\n\n get buffer(): Buffer {\n return this._buf;\n }\n\n toBuffer(): Buffer {\n // return the current data as a single enclosing buffer\n if (!this._buffer) {\n this._buffer = Buffer.alloc(this.length);\n this._buf.copy(this._buffer, 0, 0, this.length);\n }\n return this._buffer;\n }\n\n reset(position?: number): void {\n position = position || 0;\n this._buffer = undefined;\n this._inPos = position;\n }\n\n private _grow(min: number): void {\n let size = this._buf.length * 2;\n while (size < min) {\n size *= 2;\n }\n const buf = Buffer.alloc(size);\n this._buf.copy(buf, 0);\n this._buf = buf;\n }\n\n addText(text: string): void {\n this._buffer = undefined;\n\n let inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);\n\n // if we've hit (or nearing capacity), grow the buf\n while (inPos >= this._buf.length - 4) {\n this._grow(this._inPos + text.length);\n\n // keep trying to write until we've completely written the text\n inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);\n }\n\n this._inPos = inPos;\n }\n\n addStringBuf(inBuf: StringBuf): void {\n if (inBuf.length) {\n this._buffer = undefined;\n\n if (this.length + inBuf.length > this.capacity) {\n this._grow(this.length + inBuf.length);\n }\n inBuf._buf.copy(this._buf, this._inPos, 0, inBuf.length);\n this._inPos += inBuf.length;\n }\n }\n}\n\nexport { StringBuf };\n","import { StringBuf } from \"./string-buf\";\n\n// =============================================================================\n// Data chunks - encapsulating incoming data\nclass StringChunk {\n private _data: string;\n private _encoding: BufferEncoding;\n private _buffer?: Uint8Array;\n\n constructor(data: string, encoding: BufferEncoding) {\n this._data = data;\n this._encoding = encoding;\n }\n\n get length(): number {\n return this.toBuffer().length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): number {\n const buf = this.toBuffer();\n const bytesToCopy = Math.min(length, buf.length - offset);\n target.set(buf.subarray(offset, offset + bytesToCopy), targetOffset);\n return bytesToCopy;\n }\n\n toBuffer(): Uint8Array {\n if (!this._buffer) {\n this._buffer = new TextEncoder().encode(this._data);\n }\n return this._buffer;\n }\n}\n\nclass StringBufChunk {\n private _data: StringBuf;\n\n constructor(data: StringBuf) {\n this._data = data;\n }\n\n get length(): number {\n return this._data.length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): number {\n const buf = this.toBuffer();\n const bytesToCopy = Math.min(length, buf.length - offset);\n target.set(buf.subarray(offset, offset + bytesToCopy), targetOffset);\n return bytesToCopy;\n }\n\n toBuffer(): Uint8Array {\n return this._data.toBuffer();\n }\n}\n\nclass BufferChunk {\n private _data: Uint8Array;\n\n constructor(data: Uint8Array) {\n this._data = data;\n }\n\n get length(): number {\n return this._data.length;\n }\n\n copy(target: Uint8Array, targetOffset: number, offset: number, length: number): void {\n const bytesToCopy = Math.min(length, this._data.length - offset);\n target.set(this._data.subarray(offset, offset + bytesToCopy), targetOffset);\n }\n\n toBuffer(): Uint8Array {\n return this._data;\n }\n}\n\ntype Chunk = StringChunk | StringBufChunk | BufferChunk;\n\n// =============================================================================\n// ReadWriteBuf - a single buffer supporting simple read-write\nclass ReadWriteBuf {\n size: number;\n buffer: Uint8Array;\n iRead: number;\n iWrite: number;\n\n constructor(size: number) {\n this.size = size;\n this.buffer = new Uint8Array(size);\n this.iRead = 0;\n this.iWrite = 0;\n }\n\n toBuffer(): Uint8Array {\n if (this.iRead === 0 && this.iWrite === this.size) {\n return this.buffer;\n }\n return this.buffer.slice(this.iRead, this.iWrite);\n }\n\n get length(): number {\n return this.iWrite - this.iRead;\n }\n\n get eod(): boolean {\n return this.iRead === this.iWrite;\n }\n\n get full(): boolean {\n return this.iWrite === this.size;\n }\n\n read(size?: number): Uint8Array | null {\n if (size === 0) {\n return null;\n }\n\n if (size === undefined || size >= this.length) {\n const buf = this.toBuffer();\n this.iRead = this.iWrite;\n return buf;\n }\n\n const buf = this.buffer.slice(this.iRead, this.iRead + size);\n this.iRead += size;\n return buf;\n }\n\n write(chunk: Chunk, offset: number, length: number): number {\n const size = Math.min(length, this.size - this.iWrite);\n chunk.copy(this.buffer, this.iWrite, offset, offset + size);\n this.iWrite += size;\n return size;\n }\n}\n\ninterface StreamBufOptions {\n bufSize?: number;\n batch?: boolean;\n}\n\ntype EventCallback = (...args: any[]) => void;\n\n// =============================================================================\n// StreamBuf - Browser version without Node.js stream dependency\n// A simple buffer manager that mimics stream behavior for xlsx writing\nclass StreamBuf {\n private bufSize: number;\n private buffers: ReadWriteBuf[];\n private batch: boolean;\n private corked: boolean;\n private paused: boolean;\n private encoding: string | null;\n private pipes: any[];\n private events: Map<string, EventCallback[]>;\n\n constructor(options?: StreamBufOptions) {\n options = options || {};\n this.bufSize = options.bufSize || 1024 * 1024;\n this.buffers = [];\n this.batch = options.batch || false;\n this.corked = false;\n this.paused = false;\n this.encoding = null;\n this.pipes = [];\n this.events = new Map();\n }\n\n // Event emitter methods\n on(event: string, callback: EventCallback): this {\n const callbacks = this.events.get(event) || [];\n callbacks.push(callback);\n this.events.set(event, callbacks);\n return this;\n }\n\n once(event: string, callback: EventCallback): this {\n const onceCallback = (...args: any[]) => {\n this.off(event, onceCallback);\n callback(...args);\n };\n return this.on(event, onceCallback);\n }\n\n off(event: string, callback: EventCallback): this {\n const callbacks = this.events.get(event) || [];\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n return this;\n }\n\n emit(event: string, ...args: any[]): boolean {\n const callbacks = this.events.get(event) || [];\n callbacks.forEach(cb => cb(...args));\n return callbacks.length > 0;\n }\n\n removeListener(event: string, callback: EventCallback): this {\n return this.off(event, callback);\n }\n\n toBuffer(): Uint8Array | null {\n switch (this.buffers.length) {\n case 0:\n return null;\n case 1:\n return this.buffers[0].toBuffer();\n default: {\n const totalLength = this.buffers.reduce((acc, buf) => acc + buf.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const rwBuf of this.buffers) {\n const buf = rwBuf.toBuffer();\n result.set(buf, offset);\n offset += buf.length;\n }\n return result;\n }\n }\n }\n\n private _getWritableBuffer(): ReadWriteBuf {\n if (this.buffers.length) {\n const last = this.buffers[this.buffers.length - 1];\n if (!last.full) {\n return last;\n }\n }\n const buf = new ReadWriteBuf(this.bufSize);\n this.buffers.push(buf);\n return buf;\n }\n\n private async _pipe(chunk: Chunk): Promise<void> {\n const write = (pipe: any): Promise<void> => {\n return new Promise(resolve => {\n pipe.write(chunk.toBuffer(), () => {\n resolve();\n });\n });\n };\n await Promise.all(this.pipes.map(write));\n }\n\n private _writeToBuffers(chunk: Chunk): void {\n let inPos = 0;\n const inLen = chunk.length;\n while (inPos < inLen) {\n const buffer = this._getWritableBuffer();\n inPos += buffer.write(chunk, inPos, inLen - inPos);\n }\n }\n\n async write(\n data: any,\n encoding?: BufferEncoding | Function,\n callback?: Function\n ): Promise<boolean> {\n const nop = () => {};\n if (encoding instanceof Function) {\n callback = encoding;\n encoding = \"utf8\";\n }\n callback = callback || nop;\n\n let chunk: Chunk;\n if (data instanceof StringBuf || (data && (data as any).constructor?.name === \"StringBuf\")) {\n chunk = new StringBufChunk(data as StringBuf);\n } else if (data instanceof Uint8Array) {\n chunk = new BufferChunk(data);\n } else if (ArrayBuffer.isView(data)) {\n chunk = new BufferChunk(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\n } else if (data instanceof ArrayBuffer) {\n chunk = new BufferChunk(new Uint8Array(data));\n } else if (typeof data === \"string\" || data instanceof String) {\n chunk = new StringChunk(String(data), encoding as BufferEncoding);\n } else {\n throw new Error(\"Chunk must be one of type String, Uint8Array, ArrayBuffer or StringBuf.\");\n }\n\n if (this.pipes.length) {\n if (this.batch) {\n this._writeToBuffers(chunk);\n while (!this.corked && this.buffers.length > 1) {\n await this._pipe(new BufferChunk(this.buffers.shift()!.toBuffer()));\n }\n } else if (!this.corked) {\n await this._pipe(chunk);\n callback();\n } else {\n this._writeToBuffers(chunk);\n queueMicrotask(() => callback!());\n }\n } else {\n if (!this.paused) {\n this.emit(\"data\", chunk.toBuffer());\n }\n this._writeToBuffers(chunk);\n this.emit(\"readable\");\n }\n\n return true;\n }\n\n cork(): void {\n this.corked = true;\n }\n\n private _flush(): void {\n if (this.pipes.length) {\n while (this.buffers.length) {\n this._pipe(new BufferChunk(this.buffers.shift()!.toBuffer()));\n }\n }\n }\n\n uncork(): void {\n this.corked = false;\n this._flush();\n }\n\n end(chunk?: any, encoding?: BufferEncoding, callback?: Function): void {\n const writeComplete = (error?: Error) => {\n if (error) {\n callback?.(error);\n } else {\n this._flush();\n this.pipes.forEach((pipe: any) => {\n pipe.end();\n });\n this.emit(\"finish\");\n }\n };\n if (chunk) {\n this.write(chunk, encoding, writeComplete);\n } else {\n writeComplete();\n }\n }\n\n read(size?: number): Uint8Array {\n let buffers: Uint8Array[];\n if (size) {\n buffers = [];\n while (size && this.buffers.length && !this.buffers[0].eod) {\n const first = this.buffers[0];\n const buffer = first.read(size);\n if (buffer) {\n size -= buffer.length;\n buffers.push(buffer);\n }\n if (first.eod && first.full) {\n this.buffers.shift();\n }\n }\n return concatUint8Arrays(buffers);\n }\n\n buffers = this.buffers.map(buf => buf.toBuffer()).filter(Boolean) as Uint8Array[];\n this.buffers = [];\n return concatUint8Arrays(buffers);\n }\n\n setEncoding(encoding: string): void {\n this.encoding = encoding;\n }\n\n pause(): void {\n this.paused = true;\n }\n\n resume(): void {\n this.paused = false;\n }\n\n isPaused(): boolean {\n return this.paused;\n }\n\n pipe(destination: any): any {\n this.pipes.push(destination);\n if (!this.paused && this.buffers.length) {\n this.end();\n }\n return destination;\n }\n\n unpipe(destination: any): void {\n this.pipes = this.pipes.filter((pipe: any) => pipe !== destination);\n }\n\n unshift(): void {\n throw new Error(\"Not Implemented\");\n }\n\n wrap(): void {\n throw new Error(\"Not Implemented\");\n }\n\n push(chunk: any): boolean {\n if (chunk !== null) {\n this.write(chunk);\n }\n return true;\n }\n}\n\n// Helper function to concatenate Uint8Arrays\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n if (arrays.length === 0) {\n return new Uint8Array(0);\n }\n if (arrays.length === 1) {\n return arrays[0];\n }\n\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\nexport { StreamBuf };\n","import { ZipBuilder } from \"./zip/zip-builder\";\nimport { StreamBuf } from \"./stream-buf.browser\";\n\ninterface ZipWriterOptions {\n /** Compression method: \"DEFLATE\" (default) or \"STORE\" (no compression) */\n compression?: \"DEFLATE\" | \"STORE\";\n compressionOptions?: {\n /** Compression level 0-9: 0=none, 1=fast (default), 9=best */\n level?: number;\n };\n}\n\ninterface AppendOptions {\n name: string;\n base64?: boolean;\n}\n\ntype CompressionLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\ntype EventCallback = (...args: any[]) => void;\n\n// Helper function for base64 decoding in browser\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// The ZipWriter class - Browser version without Node.js events dependency\n// Packs streamed data into an output zip stream\nclass ZipWriter {\n private stream: StreamBuf;\n private zipBuilder: ZipBuilder;\n private finalized = false;\n private pendingWrites: Promise<void>[] = [];\n private events: Map<string, EventCallback[]> = new Map();\n\n constructor(options?: ZipWriterOptions) {\n const level =\n options?.compression === \"STORE\"\n ? 0\n : (Math.max(0, Math.min(9, options?.compressionOptions?.level ?? 1)) as CompressionLevel);\n\n this.stream = new StreamBuf();\n this.zipBuilder = new ZipBuilder({ level });\n }\n\n // Event emitter methods\n on(event: string, callback: EventCallback): this {\n const callbacks = this.events.get(event) || [];\n callbacks.push(callback);\n this.events.set(event, callbacks);\n return this;\n }\n\n once(event: string, callback: EventCallback): this {\n const onceCallback = (...args: any[]) => {\n this.off(event, onceCallback);\n callback(...args);\n };\n return this.on(event, onceCallback);\n }\n\n off(event: string, callback: EventCallback): this {\n const callbacks = this.events.get(event) || [];\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n return this;\n }\n\n emit(event: string, ...args: any[]): boolean {\n const callbacks = this.events.get(event) || [];\n callbacks.forEach(cb => cb(...args));\n return callbacks.length > 0;\n }\n\n removeListener(event: string, callback: EventCallback): this {\n return this.off(event, callback);\n }\n\n append(data: any, options: AppendOptions): void {\n let buffer: Uint8Array;\n\n if (Object.prototype.hasOwnProperty.call(options, \"base64\") && options.base64) {\n const base64Data = typeof data === \"string\" ? data : String(data);\n buffer = base64ToUint8Array(base64Data);\n } else if (typeof data === \"string\") {\n buffer = new TextEncoder().encode(data);\n } else if (data instanceof Uint8Array) {\n buffer = data;\n } else if (ArrayBuffer.isView(data)) {\n buffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n } else if (data instanceof ArrayBuffer) {\n buffer = new Uint8Array(data);\n } else {\n buffer = data;\n }\n\n const writePromise = this.zipBuilder\n .addFile({ name: options.name, data: buffer })\n .then(chunks => {\n for (const chunk of chunks) {\n this.stream.write(new Uint8Array(chunk));\n }\n });\n this.pendingWrites.push(writePromise);\n }\n\n push(chunk: any): boolean {\n return this.stream.push(chunk);\n }\n\n async finalize(): Promise<void> {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n\n await Promise.all(this.pendingWrites);\n\n const finalChunks = this.zipBuilder.finalize();\n for (const chunk of finalChunks) {\n this.stream.write(new Uint8Array(chunk));\n }\n\n this.stream.end();\n this.emit(\"finish\");\n }\n\n // ==========================================================================\n // Stream.Readable interface\n read(size?: number): any {\n return this.stream.read(size);\n }\n\n setEncoding(encoding: string): any {\n return this.stream.setEncoding(encoding);\n }\n\n pause(): any {\n return this.stream.pause();\n }\n\n resume(): any {\n return this.stream.resume();\n }\n\n isPaused(): boolean {\n return this.stream.isPaused();\n }\n\n pipe(destination: any): any {\n return this.stream.pipe(destination);\n }\n\n unpipe(destination?: any): void {\n return this.stream.unpipe(destination);\n }\n\n unshift(): void {\n return this.stream.unshift();\n }\n\n wrap(): void {\n return this.stream.wrap();\n }\n}\n\nexport { ZipWriter };\n","import { xmlEncode } from \"./utils\";\n\n// constants\nconst OPEN_ANGLE = \"<\";\nconst CLOSE_ANGLE = \">\";\nconst OPEN_ANGLE_SLASH = \"</\";\nconst CLOSE_SLASH_ANGLE = \"/>\";\n\n// Chunk size for periodic consolidation (reduces final join overhead)\nconst CHUNK_SIZE = 10000;\n\ninterface Attributes {\n [key: string]: any;\n}\n\ninterface Rollback {\n xml: number;\n stack: number;\n leaf: boolean;\n open: boolean;\n chunksLength: number;\n}\n\nfunction pushAttribute(xml: string[], name: string, value: any): void {\n xml.push(` ${name}=\"${xmlEncode(value.toString())}\"`);\n}\n\nfunction pushAttributes(xml: string[], attributes?: Attributes): void {\n if (attributes) {\n const tmp: string[] = [];\n Object.entries(attributes).forEach(([name, value]) => {\n if (value !== undefined) {\n pushAttribute(tmp, name as string, value);\n }\n });\n xml.push(tmp.join(\"\"));\n }\n}\n\nclass XmlStream {\n declare private _xml: string[];\n declare private _chunks: string[];\n declare private _stack: string[];\n declare private _rollbacks: Rollback[];\n leaf?: boolean;\n open?: boolean;\n\n constructor() {\n this._xml = [];\n this._chunks = [];\n this._stack = [];\n this._rollbacks = [];\n }\n\n private _consolidate(): void {\n // Periodically join small strings into larger chunks to reduce final join overhead\n if (this._xml.length >= CHUNK_SIZE) {\n this._chunks.push(this._xml.join(\"\"));\n this._xml = [];\n }\n }\n\n get tos(): string | undefined {\n return this._stack.length ? this._stack[this._stack.length - 1] : undefined;\n }\n\n get cursor(): number {\n // handy way to track whether anything has been added\n return this._chunks.length * CHUNK_SIZE + this._xml.length;\n }\n\n openXml(docAttributes?: Attributes): void {\n const xml = this._xml;\n // <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n xml.push(\"<?xml\");\n pushAttributes(xml, docAttributes);\n xml.push(\"?>\\n\");\n }\n\n openNode(name: string, attributes?: Attributes): void {\n const parent = this.tos;\n const xml = this._xml;\n if (parent && this.open) {\n xml.push(CLOSE_ANGLE);\n }\n\n this._stack.push(name);\n\n // start streaming node\n xml.push(OPEN_ANGLE);\n xml.push(name);\n pushAttributes(xml, attributes);\n this.leaf = true;\n this.open = true;\n }\n\n addAttribute(name: string, value: any): void {\n if (!this.open) {\n throw new Error(\"Cannot write attributes to node if it is not open\");\n }\n if (value !== undefined) {\n pushAttribute(this._xml, name, value);\n }\n }\n\n addAttributes(attrs: Attributes): void {\n if (!this.open) {\n throw new Error(\"Cannot write attributes to node if it is not open\");\n }\n pushAttributes(this._xml, attrs);\n }\n\n writeText(text: any): void {\n const xml = this._xml;\n if (this.open) {\n xml.push(CLOSE_ANGLE);\n this.open = false;\n }\n this.leaf = false;\n xml.push(xmlEncode(text.toString()));\n }\n\n writeXml(xml: string): void {\n if (this.open) {\n this._xml.push(CLOSE_ANGLE);\n this.open = false;\n }\n this.leaf = false;\n this._xml.push(xml);\n }\n\n closeNode(): void {\n const node = this._stack.pop();\n const xml = this._xml;\n if (this.leaf) {\n xml.push(CLOSE_SLASH_ANGLE);\n } else {\n xml.push(OPEN_ANGLE_SLASH);\n xml.push(node!);\n xml.push(CLOSE_ANGLE);\n }\n this.open = false;\n this.leaf = false;\n this._consolidate();\n }\n\n leafNode(name: string, attributes?: Attributes, text?: any): void {\n this.openNode(name, attributes);\n if (text !== undefined) {\n // zeros need to be written\n this.writeText(text);\n }\n this.closeNode();\n }\n\n closeAll(): void {\n while (this._stack.length) {\n this.closeNode();\n }\n }\n\n addRollback(): number {\n this._rollbacks.push({\n xml: this._xml.length,\n stack: this._stack.length,\n leaf: this.leaf!,\n open: this.open!,\n chunksLength: this._chunks.length\n });\n return this.cursor;\n }\n\n commit(): void {\n this._rollbacks.pop();\n }\n\n rollback(): void {\n const r = this._rollbacks.pop()!;\n if (this._xml.length > r.xml) {\n this._xml.splice(r.xml, this._xml.length - r.xml);\n }\n if (this._stack.length > r.stack) {\n this._stack.splice(r.stack, this._stack.length - r.stack);\n }\n if (this._chunks.length > r.chunksLength) {\n this._chunks.splice(r.chunksLength, this._chunks.length - r.chunksLength);\n }\n this.leaf = r.leaf;\n this.open = r.open;\n }\n\n get xml(): string {\n this.closeAll();\n // Join chunks first, then remaining xml array\n if (this._chunks.length === 0) {\n return this._xml.join(\"\");\n }\n if (this._xml.length > 0) {\n this._chunks.push(this._xml.join(\"\"));\n }\n return this._chunks.join(\"\");\n }\n\n static StdDocAttributes = {\n version: \"1.0\",\n encoding: \"UTF-8\",\n standalone: \"yes\"\n };\n}\n\nexport { XmlStream };\n","/**\n * High-performance SAX XML parser\n *\n * Minimal implementation optimized for Excel XML parsing.\n * Supports: opentag, text, closetag, error events.\n * Zero external dependencies.\n *\n * Based on XML 1.0 specification with optimizations for common Excel XML patterns.\n */\n\nimport { bufferToString } from \"./utils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SaxEvent {\n eventType: \"opentag\" | \"text\" | \"closetag\";\n value: any;\n}\n\nexport interface SaxesTagPlain {\n name: string;\n attributes: Record<string, string>;\n isSelfClosing: boolean;\n}\n\nexport interface SaxesOptions {\n xmlns?: boolean;\n position?: boolean;\n fileName?: string;\n fragment?: boolean;\n}\n\ntype TextHandler = (text: string) => void;\ntype OpenTagHandler = (tag: SaxesTagPlain) => void;\ntype CloseTagHandler = (tag: SaxesTagPlain) => void;\ntype ErrorHandler = (err: Error) => void;\n\n// ============================================================================\n// Character codes (for fast comparison)\n// ============================================================================\n\nconst TAB = 9;\nconst NL = 0xa;\nconst CR = 0xd;\nconst SPACE = 0x20;\nconst BANG = 0x21; // !\nconst DQUOTE = 0x22; // \"\nconst AMP = 0x26; // &\nconst SQUOTE = 0x27; // '\nconst MINUS = 0x2d; // -\nconst FORWARD_SLASH = 0x2f; // /\nconst SEMICOLON = 0x3b; // ;\nconst LESS = 0x3c; // <\nconst EQUAL = 0x3d; // =\nconst GREATER = 0x3e; // >\nconst QUESTION = 0x3f; // ?\nconst OPEN_BRACKET = 0x5b; // [\nconst CLOSE_BRACKET = 0x5d; // ]\nconst HASH = 0x23; // #\n\n// ============================================================================\n// Pre-computed lookup tables for performance\n// ============================================================================\n\n// ASCII character lookup (0-127) for String.fromCharCode\nconst ASCII_CHARS: string[] = new Array(128);\nfor (let i = 0; i < 128; i++) {\n ASCII_CHARS[i] = String.fromCharCode(i);\n}\n\n// Fast charFromCode - use lookup for ASCII, fallback for others\nfunction charFromCode(c: number): string {\n return c < 128 ? ASCII_CHARS[c] : String.fromCodePoint(c);\n}\n\n// Bitmap for ASCII name start chars (a-zA-Z_:)\nconst NAME_START_CHAR_ASCII = new Uint8Array(128);\nfor (let i = 0x61; i <= 0x7a; i++) {\n NAME_START_CHAR_ASCII[i] = 1;\n} // a-z\nfor (let i = 0x41; i <= 0x5a; i++) {\n NAME_START_CHAR_ASCII[i] = 1;\n} // A-Z\nNAME_START_CHAR_ASCII[0x5f] = 1; // _\nNAME_START_CHAR_ASCII[0x3a] = 1; // :\n\n// Bitmap for ASCII name chars (a-zA-Z0-9_:-.)\nconst NAME_CHAR_ASCII = new Uint8Array(128);\nfor (let i = 0x61; i <= 0x7a; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // a-z\nfor (let i = 0x41; i <= 0x5a; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // A-Z\nfor (let i = 0x30; i <= 0x39; i++) {\n NAME_CHAR_ASCII[i] = 1;\n} // 0-9\nNAME_CHAR_ASCII[0x5f] = 1; // _\nNAME_CHAR_ASCII[0x3a] = 1; // :\nNAME_CHAR_ASCII[0x2d] = 1; // -\nNAME_CHAR_ASCII[0x2e] = 1; // .\n\n// ============================================================================\n// Character classification (inlined for performance)\n// ============================================================================\n\n// isS: space characters (XML whitespace)\nfunction isS(c: number): boolean {\n return c === SPACE || c === NL || c === CR || c === TAB;\n}\n\n// isQuote: quote characters\nfunction isQuote(c: number): boolean {\n return c === DQUOTE || c === SQUOTE;\n}\n\n// isNameStartChar: valid first character of XML name\n// Optimized for common ASCII range first\nfunction isNameStartChar(c: number): boolean {\n // Fast path: ASCII lookup\n if (c < 128) {\n return NAME_START_CHAR_ASCII[c] === 1;\n }\n // Extended ranges (less common in Excel XML)\n return (\n (c >= 0xc0 && c <= 0xd6) ||\n (c >= 0xd8 && c <= 0xf6) ||\n (c >= 0xf8 && c <= 0x2ff) ||\n (c >= 0x370 && c <= 0x37d) ||\n (c >= 0x37f && c <= 0x1fff) ||\n c === 0x200c ||\n c === 0x200d ||\n (c >= 0x2070 && c <= 0x218f) ||\n (c >= 0x2c00 && c <= 0x2fef) ||\n (c >= 0x3001 && c <= 0xd7ff) ||\n (c >= 0xf900 && c <= 0xfdcf) ||\n (c >= 0xfdf0 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0xeffff)\n );\n}\n\n// isNameChar: valid character in XML name (includes digits, hyphen, period)\nfunction isNameChar(c: number): boolean {\n // Fast path: ASCII lookup\n if (c < 128) {\n return NAME_CHAR_ASCII[c] === 1;\n }\n // Extended ranges\n return (\n c === 0xb7 ||\n (c >= 0xc0 && c <= 0xd6) ||\n (c >= 0xd8 && c <= 0xf6) ||\n (c >= 0xf8 && c <= 0x2ff) ||\n (c >= 0x300 && c <= 0x36f) ||\n (c >= 0x370 && c <= 0x37d) ||\n (c >= 0x37f && c <= 0x1fff) ||\n c === 0x200c ||\n c === 0x200d ||\n (c >= 0x203f && c <= 0x2040) ||\n (c >= 0x2070 && c <= 0x218f) ||\n (c >= 0x2c00 && c <= 0x2fef) ||\n (c >= 0x3001 && c <= 0xd7ff) ||\n (c >= 0xf900 && c <= 0xfdcf) ||\n (c >= 0xfdf0 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0xeffff)\n );\n}\n\n// isChar10: valid XML 1.0 character\nfunction isChar10(c: number): boolean {\n return (\n (c >= SPACE && c <= 0xd7ff) ||\n c === NL ||\n c === CR ||\n c === TAB ||\n (c >= 0xe000 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0x10ffff)\n );\n}\n\n// ============================================================================\n// Built-in XML entities\n// ============================================================================\n\nconst XML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n gt: \">\",\n lt: \"<\",\n quot: '\"',\n apos: \"'\"\n};\n\n// ============================================================================\n// Parser States\n// ============================================================================\n\nconst S_TEXT = 0;\nconst S_OPEN_WAKA = 1; // <\nconst S_OPEN_WAKA_BANG = 2; // <!\nconst S_OPEN_TAG = 3; // <tagname\nconst S_OPEN_TAG_SLASH = 4; // <tagname /\nconst S_ATTRIB = 5; // <tagname attr\nconst S_ATTRIB_NAME = 6; // <tagname attr\nconst S_ATTRIB_NAME_SAW_WHITE = 7;\nconst S_ATTRIB_VALUE = 8; // <tagname attr=\nconst S_ATTRIB_VALUE_QUOTED = 9; // <tagname attr=\"\nconst S_ATTRIB_VALUE_CLOSED = 10;\nconst S_CLOSE_TAG = 11; // </tagname\nconst S_CLOSE_TAG_SAW_WHITE = 12;\nconst S_COMMENT = 13; // <!--\nconst S_COMMENT_ENDING = 14; // <!-- text -\nconst S_COMMENT_ENDED = 15; // <!-- text --\nconst S_CDATA = 16; // <![CDATA[\nconst S_CDATA_ENDING = 17; // <![CDATA[ text ]\nconst S_CDATA_ENDING_2 = 18; // <![CDATA[ text ]]\nconst S_PI = 19; // <?\nconst S_PI_ENDING = 20; // <? text ?\nconst S_DOCTYPE = 21; // <!DOCTYPE\nconst S_DOCTYPE_QUOTE = 22;\nconst S_DOCTYPE_DTD = 23;\nconst S_DOCTYPE_DTD_QUOTED = 24;\nconst S_ENTITY = 25; // &entity;\n\n// ============================================================================\n// SaxesParser Class - Minimal implementation for Excel XML\n// ============================================================================\n\nexport class SaxesParser {\n // Configuration\n private trackPosition: boolean;\n private fileName?: string;\n private fragment: boolean;\n\n // Parser state\n private state: number = S_TEXT;\n private chunk: string = \"\";\n private i: number = 0;\n private prevI: number = 0;\n private text: string = \"\";\n private name: string = \"\";\n private q: number | null = null;\n private tags: SaxesTagPlain[] = [];\n private tag: SaxesTagPlain | null = null;\n private attribList: Array<{ name: string; value: string }> = [];\n private entity: string = \"\";\n private entityReturnState: number = S_TEXT;\n private openWakaBang: string = \"\";\n private sawRoot: boolean = false;\n private closedRoot: boolean = false;\n private carriedFromPrevious?: string;\n private _closed: boolean = false;\n private reportedTextBeforeRoot: boolean = false;\n private reportedTextAfterRoot: boolean = false;\n\n // Position tracking\n line: number = 1;\n column: number = 0;\n private positionAtNewLine: number = 0;\n private chunkPosition: number = 0;\n\n // Entity storage\n ENTITIES: Record<string, string> = { ...XML_ENTITIES };\n\n // Event handlers\n private textHandler?: TextHandler;\n private openTagHandler?: OpenTagHandler;\n private closeTagHandler?: CloseTagHandler;\n private errorHandler?: ErrorHandler;\n\n constructor(opt?: SaxesOptions) {\n this.trackPosition = opt?.position !== false;\n this.fileName = opt?.fileName;\n this.fragment = opt?.fragment ?? false;\n this._init();\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n get position(): number {\n return this.chunkPosition + this.i;\n }\n\n private _init(): void {\n this.state = this.fragment ? S_TEXT : S_TEXT;\n this.text = \"\";\n this.name = \"\";\n this.q = null;\n this.tags = [];\n this.tag = null;\n this.attribList = [];\n this.entity = \"\";\n this.openWakaBang = \"\";\n this.sawRoot = this.fragment;\n this.closedRoot = this.fragment;\n this.reportedTextBeforeRoot = this.fragment;\n this.reportedTextAfterRoot = this.fragment;\n this.carriedFromPrevious = undefined;\n this._closed = false;\n this.line = 1;\n this.column = 0;\n this.positionAtNewLine = 0;\n this.chunkPosition = 0;\n this.chunk = \"\";\n this.i = 0;\n this.prevI = 0;\n }\n\n // Event registration\n on(name: \"text\", handler: TextHandler): void;\n on(name: \"opentag\", handler: OpenTagHandler): void;\n on(name: \"closetag\", handler: CloseTagHandler): void;\n on(name: \"error\", handler: ErrorHandler): void;\n on(name: string, handler: any): void {\n switch (name) {\n case \"text\":\n this.textHandler = handler;\n break;\n case \"opentag\":\n this.openTagHandler = handler;\n break;\n case \"closetag\":\n this.closeTagHandler = handler;\n break;\n case \"error\":\n this.errorHandler = handler;\n break;\n }\n }\n\n off(name: string): void {\n switch (name) {\n case \"text\":\n this.textHandler = undefined;\n break;\n case \"opentag\":\n this.openTagHandler = undefined;\n break;\n case \"closetag\":\n this.closeTagHandler = undefined;\n break;\n case \"error\":\n this.errorHandler = undefined;\n break;\n }\n }\n\n // Error handling\n private makeError(message: string): Error {\n let msg = this.fileName ?? \"\";\n if (this.trackPosition) {\n if (msg.length > 0) {\n msg += \":\";\n }\n msg += `${this.line}:${this.column}`;\n }\n if (msg.length > 0) {\n msg += \": \";\n }\n return new Error(msg + message);\n }\n\n fail(message: string): this {\n const err = this.makeError(message);\n if (this.errorHandler) {\n this.errorHandler(err);\n } else {\n throw err;\n }\n return this;\n }\n\n // Main write method\n write(chunk: string | null): this {\n if (this._closed) {\n return this.fail(\"cannot write after close\");\n }\n\n let end = false;\n if (chunk === null) {\n end = true;\n chunk = \"\";\n }\n\n if (this.carriedFromPrevious !== undefined) {\n chunk = this.carriedFromPrevious + chunk;\n this.carriedFromPrevious = undefined;\n }\n\n let limit = chunk.length;\n if (!end && limit > 0) {\n const lastCode = chunk.charCodeAt(limit - 1);\n // Carry CR or surrogate to next chunk\n if (lastCode === CR || (lastCode >= 0xd800 && lastCode <= 0xdbff)) {\n this.carriedFromPrevious = chunk[limit - 1];\n limit--;\n chunk = chunk.slice(0, limit);\n }\n }\n\n this.chunk = chunk;\n this.i = 0;\n\n while (this.i < limit) {\n this.processState();\n }\n\n this.chunkPosition += limit;\n\n return end ? this.end() : this;\n }\n\n close(): this {\n return this.write(null);\n }\n\n // Get next character code, handling newlines\n // Optimized: split into fast path (no position) and slow path\n private getCode(): number {\n const { chunk, i } = this;\n this.prevI = i;\n this.i = i + 1;\n\n if (i >= chunk.length) {\n return -1; // EOC\n }\n\n const code = chunk.charCodeAt(i);\n\n // Fast path: common ASCII chars (no surrogates, no CR/LF)\n // 0x0a = LF, 0x0d = CR - both need special handling\n if (code < 0x0a || (code > 0x0d && code < 0xd800)) {\n if (this.trackPosition) {\n this.column++;\n }\n return code;\n }\n\n // Handle surrogates\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = chunk.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n this.i = i + 2;\n if (this.trackPosition) {\n this.column++;\n }\n return 0x10000 + ((code - 0xd800) * 0x400 + (next - 0xdc00));\n }\n }\n\n // Handle CR\n if (code === CR) {\n if (chunk.charCodeAt(i + 1) === NL) {\n this.i = i + 2;\n }\n if (this.trackPosition) {\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n }\n return NL;\n }\n\n // Handle LF (code === 0x0a) or other codes between 0x0a-0x0d\n if (code === NL && this.trackPosition) {\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n } else if (this.trackPosition) {\n this.column++;\n }\n return code;\n }\n\n private unget(): void {\n this.i = this.prevI;\n if (this.trackPosition) {\n this.column--;\n }\n }\n\n // State machine dispatcher\n private processState(): void {\n switch (this.state) {\n case S_TEXT:\n this.sText();\n break;\n case S_OPEN_WAKA:\n this.sOpenWaka();\n break;\n case S_OPEN_WAKA_BANG:\n this.sOpenWakaBang();\n break;\n case S_OPEN_TAG:\n this.sOpenTag();\n break;\n case S_OPEN_TAG_SLASH:\n this.sOpenTagSlash();\n break;\n case S_ATTRIB:\n this.sAttrib();\n break;\n case S_ATTRIB_NAME:\n this.sAttribName();\n break;\n case S_ATTRIB_NAME_SAW_WHITE:\n this.sAttribNameSawWhite();\n break;\n case S_ATTRIB_VALUE:\n this.sAttribValue();\n break;\n case S_ATTRIB_VALUE_QUOTED:\n this.sAttribValueQuoted();\n break;\n case S_ATTRIB_VALUE_CLOSED:\n this.sAttribValueClosed();\n break;\n case S_CLOSE_TAG:\n this.sCloseTag();\n break;\n case S_CLOSE_TAG_SAW_WHITE:\n this.sCloseTagSawWhite();\n break;\n case S_COMMENT:\n this.sComment();\n break;\n case S_COMMENT_ENDING:\n this.sCommentEnding();\n break;\n case S_COMMENT_ENDED:\n this.sCommentEnded();\n break;\n case S_CDATA:\n this.sCData();\n break;\n case S_CDATA_ENDING:\n this.sCDataEnding();\n break;\n case S_CDATA_ENDING_2:\n this.sCDataEnding2();\n break;\n case S_PI:\n this.sPI();\n break;\n case S_PI_ENDING:\n this.sPIEnding();\n break;\n case S_DOCTYPE:\n this.sDoctype();\n break;\n case S_DOCTYPE_QUOTE:\n this.sDoctypeQuote();\n break;\n case S_DOCTYPE_DTD:\n this.sDoctypeDTD();\n break;\n case S_DOCTYPE_DTD_QUOTED:\n this.sDoctypeDTDQuoted();\n break;\n case S_ENTITY:\n this.sEntity();\n break;\n }\n }\n\n // ============================================================================\n // State handlers\n // ============================================================================\n\n private sText(): void {\n // Check if we're inside or outside the root element\n if (this.tags.length !== 0) {\n this.handleTextInRoot();\n } else {\n this.handleTextOutsideRoot();\n }\n }\n\n private handleTextInRoot(): void {\n const { chunk } = this;\n let { i: start } = this;\n const handler = this.textHandler;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n // End of chunk\n if (handler && start < this.i) {\n this.text += chunk.slice(start, this.i);\n }\n return;\n }\n\n if (c === LESS) {\n // Start of tag\n if (handler) {\n const slice = chunk.slice(start, this.prevI);\n if (this.text.length > 0) {\n handler(this.text + slice);\n this.text = \"\";\n } else if (slice.length > 0) {\n handler(slice);\n }\n }\n this.state = S_OPEN_WAKA;\n return;\n }\n\n if (c === AMP) {\n // Entity reference\n if (handler) {\n this.text += chunk.slice(start, this.prevI);\n }\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n this.entity = \"\";\n return;\n }\n\n if (c === NL) {\n // Handle newline in text\n if (handler) {\n this.text += chunk.slice(start, this.prevI) + \"\\n\";\n }\n start = this.i;\n }\n }\n }\n\n private handleTextOutsideRoot(): void {\n const { chunk } = this;\n let { i: start } = this;\n const handler = this.textHandler;\n let nonSpace = false;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n // End of chunk\n if (handler && start < this.i) {\n this.text += chunk.slice(start, this.i);\n }\n break;\n }\n\n if (c === LESS) {\n // Start of tag\n if (handler) {\n const slice = chunk.slice(start, this.prevI);\n if (this.text.length > 0) {\n handler(this.text + slice);\n this.text = \"\";\n } else if (slice.length > 0) {\n handler(slice);\n }\n }\n this.state = S_OPEN_WAKA;\n break;\n }\n\n if (c === AMP) {\n // Entity reference\n if (handler) {\n this.text += chunk.slice(start, this.prevI);\n }\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n this.entity = \"\";\n nonSpace = true;\n break;\n }\n\n if (c === NL) {\n // Handle newline in text\n if (handler) {\n this.text += chunk.slice(start, this.prevI) + \"\\n\";\n }\n start = this.i;\n } else if (!isS(c)) {\n nonSpace = true;\n }\n }\n\n // Report error for non-whitespace text outside root\n if (nonSpace) {\n if (!this.sawRoot && !this.reportedTextBeforeRoot) {\n this.fail(\"text data outside of root node.\");\n this.reportedTextBeforeRoot = true;\n }\n if (this.closedRoot && !this.reportedTextAfterRoot) {\n this.fail(\"text data outside of root node.\");\n this.reportedTextAfterRoot = true;\n }\n }\n }\n\n private sOpenWaka(): void {\n const c = this.getCode();\n\n if (isNameStartChar(c)) {\n this.state = S_OPEN_TAG;\n this.name = charFromCode(c);\n return;\n }\n\n switch (c) {\n case FORWARD_SLASH:\n this.state = S_CLOSE_TAG;\n this.name = \"\";\n break;\n case BANG:\n this.state = S_OPEN_WAKA_BANG;\n this.openWakaBang = \"\";\n break;\n case QUESTION:\n this.state = S_PI;\n this.text = \"\";\n break;\n default:\n this.fail(\"unexpected character in tag\");\n this.state = S_TEXT;\n }\n }\n\n private sOpenWakaBang(): void {\n const c = this.getCode();\n this.openWakaBang += charFromCode(c);\n\n switch (this.openWakaBang) {\n case \"[CDATA[\":\n this.state = S_CDATA;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n case \"--\":\n this.state = S_COMMENT;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n case \"DOCTYPE\":\n this.state = S_DOCTYPE;\n this.text = \"\";\n this.openWakaBang = \"\";\n break;\n default:\n if (this.openWakaBang.length >= 7) {\n this.fail(\"incorrect syntax\");\n this.state = S_TEXT;\n }\n }\n }\n\n private sOpenTag(): void {\n const c = this.getCode();\n\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n return;\n }\n\n // Tag name complete\n this.tag = {\n name: this.name,\n attributes: Object.create(null) as Record<string, string>,\n isSelfClosing: false\n };\n this.attribList = [];\n this.sawRoot = true;\n\n if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else if (isS(c)) {\n this.state = S_ATTRIB;\n } else {\n this.fail(\"unexpected character in tag\");\n this.state = S_ATTRIB;\n }\n }\n\n private sOpenTagSlash(): void {\n const c = this.getCode();\n if (c === GREATER) {\n this.openSelfClosingTag();\n } else {\n this.fail(\"expected >\");\n this.state = S_ATTRIB;\n }\n }\n\n private sAttrib(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (isNameStartChar(c)) {\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else {\n this.fail(\"unexpected character in attribute\");\n }\n }\n\n private sAttribName(): void {\n const c = this.getCode();\n\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n return;\n }\n\n if (c === EQUAL) {\n this.state = S_ATTRIB_VALUE;\n } else if (isS(c)) {\n this.state = S_ATTRIB_NAME_SAW_WHITE;\n } else if (c === GREATER) {\n this.fail(\"attribute without value\");\n this.attribList.push({ name: this.name, value: this.name });\n this.name = \"\";\n this.openTag();\n } else {\n this.fail(\"unexpected character in attribute name\");\n }\n }\n\n private sAttribNameSawWhite(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (c === EQUAL) {\n this.state = S_ATTRIB_VALUE;\n } else {\n this.fail(\"attribute without value\");\n this.name = \"\";\n this.text = \"\";\n if (c === GREATER) {\n this.openTag();\n } else if (isNameStartChar(c)) {\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else {\n this.fail(\"unexpected character\");\n this.state = S_ATTRIB;\n }\n }\n }\n\n private sAttribValue(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (isQuote(c)) {\n this.q = c;\n this.text = \"\";\n this.state = S_ATTRIB_VALUE_QUOTED;\n } else {\n this.fail(\"unquoted attribute value\");\n this.state = S_TEXT;\n }\n }\n\n private sAttribValueQuoted(): void {\n const { q, chunk } = this;\n let { i: start } = this;\n\n while (true) {\n const c = this.getCode();\n\n if (c === -1) {\n this.text += chunk.slice(start, this.i);\n return;\n }\n\n if (c === q) {\n // End of attribute value\n this.attribList.push({\n name: this.name,\n value: this.text + chunk.slice(start, this.prevI)\n });\n this.name = \"\";\n this.text = \"\";\n this.q = null;\n this.state = S_ATTRIB_VALUE_CLOSED;\n return;\n }\n\n if (c === AMP) {\n this.text += chunk.slice(start, this.prevI);\n this.state = S_ENTITY;\n this.entityReturnState = S_ATTRIB_VALUE_QUOTED;\n this.entity = \"\";\n return;\n }\n\n if (c === NL || c === TAB) {\n // Normalize whitespace in attributes\n this.text += chunk.slice(start, this.prevI) + \" \";\n start = this.i;\n }\n\n if (c === LESS) {\n this.text += chunk.slice(start, this.prevI);\n this.fail(\"< not allowed in attribute value\");\n return;\n }\n }\n }\n\n private sAttribValueClosed(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (isS(c)) {\n this.state = S_ATTRIB;\n } else if (c === GREATER) {\n this.openTag();\n } else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n } else if (isNameStartChar(c)) {\n this.fail(\"no whitespace between attributes\");\n this.name = charFromCode(c);\n this.state = S_ATTRIB_NAME;\n } else {\n this.fail(\"unexpected character after attribute\");\n }\n }\n\n private sCloseTag(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (isNameChar(c)) {\n this.name += charFromCode(c);\n } else if (c === GREATER) {\n this.closeTag();\n } else if (isS(c)) {\n this.state = S_CLOSE_TAG_SAW_WHITE;\n } else {\n this.fail(\"unexpected character in close tag\");\n }\n }\n\n private sCloseTagSawWhite(): void {\n const c = this.skipSpaces();\n if (c === -1) {\n return;\n }\n\n if (c === GREATER) {\n this.closeTag();\n } else {\n this.fail(\"unexpected character in close tag\");\n }\n }\n\n private sComment(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === MINUS) {\n this.state = S_COMMENT_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sCommentEnding(): void {\n const c = this.getCode();\n if (c === MINUS) {\n this.state = S_COMMENT_ENDED;\n } else {\n this.text += \"-\" + charFromCode(c);\n this.state = S_COMMENT;\n }\n }\n\n private sCommentEnded(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // Comment done, emit nothing (we don't have a comment handler)\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === MINUS) {\n this.text += \"-\";\n } else {\n this.fail(\"malformed comment\");\n this.text += \"--\" + charFromCode(c);\n this.state = S_COMMENT;\n }\n }\n\n private sCData(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === CLOSE_BRACKET) {\n this.state = S_CDATA_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sCDataEnding(): void {\n const c = this.getCode();\n if (c === CLOSE_BRACKET) {\n this.state = S_CDATA_ENDING_2;\n } else {\n this.text += \"]\" + charFromCode(c);\n this.state = S_CDATA;\n }\n }\n\n private sCDataEnding2(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // CDATA done - emit as text\n if (this.textHandler && this.text.length > 0) {\n this.textHandler(this.text);\n }\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === CLOSE_BRACKET) {\n this.text += \"]\";\n } else {\n this.text += \"]]\" + charFromCode(c);\n this.state = S_CDATA;\n }\n }\n\n private sPI(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === QUESTION) {\n this.state = S_PI_ENDING;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sPIEnding(): void {\n const c = this.getCode();\n if (c === GREATER) {\n // PI done, we don't emit PI events\n this.text = \"\";\n this.state = S_TEXT;\n } else if (c === QUESTION) {\n this.text += \"?\";\n } else {\n this.text += \"?\" + charFromCode(c);\n this.state = S_PI;\n }\n }\n\n private sDoctype(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === GREATER) {\n // DOCTYPE done\n this.text = \"\";\n this.state = S_TEXT;\n } else if (isQuote(c)) {\n this.q = c;\n this.state = S_DOCTYPE_QUOTE;\n } else if (c === OPEN_BRACKET) {\n this.state = S_DOCTYPE_DTD;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sDoctypeQuote(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === this.q) {\n this.q = null;\n this.state = S_DOCTYPE;\n } else {\n this.text += charFromCode(c);\n }\n }\n\n private sDoctypeDTD(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === CLOSE_BRACKET) {\n this.state = S_DOCTYPE;\n } else if (isQuote(c)) {\n this.q = c;\n this.state = S_DOCTYPE_DTD_QUOTED;\n }\n }\n\n private sDoctypeDTDQuoted(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === this.q) {\n this.q = null;\n this.state = S_DOCTYPE_DTD;\n }\n }\n\n private sEntity(): void {\n const c = this.getCode();\n if (c === -1) {\n return;\n }\n\n if (c === SEMICOLON) {\n // Entity complete\n const entity = this.entity;\n let resolved: string;\n\n if (entity === \"\") {\n this.fail(\"empty entity\");\n resolved = \"&;\";\n } else {\n resolved = this.parseEntity(entity);\n }\n\n this.text += resolved;\n this.state = this.entityReturnState;\n this.entity = \"\";\n } else if (isNameChar(c) || c === HASH) {\n this.entity += charFromCode(c);\n } else {\n this.fail(\"invalid entity character\");\n this.text += \"&\" + this.entity + charFromCode(c);\n this.state = this.entityReturnState;\n this.entity = \"\";\n }\n }\n\n // Entity resolution\n private parseEntity(entity: string): string {\n if (entity[0] !== \"#\") {\n // Named entity\n const resolved = this.ENTITIES[entity];\n if (resolved !== undefined) {\n return resolved;\n }\n this.fail(\"undefined entity: \" + entity);\n return \"&\" + entity + \";\";\n }\n\n // Numeric entity\n let num: number;\n if (entity[1] === \"x\" || entity[1] === \"X\") {\n // Hexadecimal\n num = parseInt(entity.slice(2), 16);\n } else {\n // Decimal\n num = parseInt(entity.slice(1), 10);\n }\n\n if (isNaN(num) || !isChar10(num)) {\n this.fail(\"invalid character entity\");\n return \"&\" + entity + \";\";\n }\n\n return String.fromCodePoint(num);\n }\n\n // Helper to skip whitespace\n private skipSpaces(): number {\n while (true) {\n const c = this.getCode();\n if (c === -1 || !isS(c)) {\n return c;\n }\n }\n }\n\n // Tag handling\n private openTag(): void {\n const tag = this.tag!;\n tag.isSelfClosing = false;\n\n // Copy attributes from list to object\n for (const { name, value } of this.attribList) {\n tag.attributes[name] = value;\n }\n this.attribList = [];\n\n this.openTagHandler?.(tag);\n this.tags.push(tag);\n this.name = \"\";\n this.state = S_TEXT;\n }\n\n private openSelfClosingTag(): void {\n const tag = this.tag!;\n tag.isSelfClosing = true;\n\n // Copy attributes from list to object\n for (const { name, value } of this.attribList) {\n tag.attributes[name] = value;\n }\n this.attribList = [];\n\n this.openTagHandler?.(tag);\n this.closeTagHandler?.(tag);\n\n if (this.tags.length === 0) {\n this.closedRoot = true;\n }\n this.name = \"\";\n this.state = S_TEXT;\n }\n\n private closeTag(): void {\n const { tags, name } = this;\n this.state = S_TEXT;\n this.name = \"\";\n\n if (name === \"\") {\n this.fail(\"empty close tag\");\n this.text += \"</>\";\n return;\n }\n\n // Find matching open tag\n let found = false;\n for (let i = tags.length - 1; i >= 0; i--) {\n const tag = tags[i];\n if (tag.name === name) {\n // Pop all tags including the matching one\n while (tags.length > i) {\n const t = tags.pop()!;\n this.closeTagHandler?.(t);\n if (tags.length > i) {\n this.fail(\"unclosed tag: \" + t.name);\n }\n }\n found = true;\n break;\n }\n }\n\n if (!found) {\n this.fail(\"unmatched close tag: \" + name);\n this.text += \"</\" + name + \">\";\n }\n\n if (tags.length === 0) {\n this.closedRoot = true;\n }\n }\n\n // End parsing\n private end(): this {\n if (!this.sawRoot) {\n this.fail(\"document must contain a root element\");\n }\n\n while (this.tags.length > 0) {\n const tag = this.tags.pop()!;\n this.fail(\"unclosed tag: \" + tag.name);\n }\n\n if (this.text.length > 0 && this.textHandler) {\n this.textHandler(this.text);\n this.text = \"\";\n }\n\n this._closed = true;\n this._init();\n return this;\n }\n}\n\n// ============================================================================\n// parseSax generator function\n// ============================================================================\n\nasync function* parseSax(iterable: any): AsyncGenerator<SaxEvent[]> {\n const parser = new SaxesParser({\n xmlns: false,\n position: true // Keep position for error messages\n });\n\n let error: Error | undefined;\n parser.on(\"error\", (err: Error) => {\n error = err;\n });\n\n let events: SaxEvent[] = [];\n parser.on(\"opentag\", (value: any) => events.push({ eventType: \"opentag\", value }));\n parser.on(\"text\", (value: any) => events.push({ eventType: \"text\", value }));\n parser.on(\"closetag\", (value: any) => events.push({ eventType: \"closetag\", value }));\n\n for await (const chunk of iterable) {\n parser.write(bufferToString(chunk));\n if (error) {\n throw error;\n }\n yield events;\n events = [];\n }\n\n parser.close();\n if (error) {\n throw error;\n }\n if (events.length > 0) {\n yield events;\n }\n}\n\nexport { parseSax };\n","import { parseSax } from \"../../utils/parse-sax\";\nimport { XmlStream } from \"../../utils/xml-stream\";\n\n/* 'virtual' methods used as a form of documentation */\n\ninterface ParseEvent {\n eventType: string;\n value: any;\n}\n\n// Base class for Xforms\nclass BaseXform {\n declare public map?: { [key: string]: any };\n declare public model?: any;\n\n // ============================================================\n // Virtual Interface\n prepare(_model?: any, _options?: any): void {\n // optional preparation (mutation) of model so it is ready for write\n }\n\n render(_xmlStream?: XmlStream, _model?: any): void {\n // convert model to xml\n }\n\n parseOpen(_node: any): void {\n // XML node opened\n }\n\n parseText(_text: string): void {\n // chunk of text encountered for current node\n }\n\n parseClose(_name: string): boolean {\n // XML node closed\n return false;\n }\n\n reconcile(_model: any, _options?: any): void {\n // optional post-parse step (opposite to prepare)\n }\n\n // ============================================================\n reset(): void {\n // to make sure parses don't bleed to next iteration\n (this as any).model = null;\n\n // if we have a map - reset them too\n if (this.map) {\n Object.values(this.map).forEach(xform => {\n if (xform instanceof BaseXform) {\n xform.reset();\n } else if (xform.xform) {\n xform.xform.reset();\n }\n });\n }\n }\n\n mergeModel(obj: any): void {\n // set obj's props to this.model\n (this as any).model = Object.assign((this as any).model || {}, obj);\n }\n\n async parse(saxParser: AsyncIterable<ParseEvent[]>): Promise<any> {\n for await (const events of saxParser) {\n for (const { eventType, value } of events) {\n if (eventType === \"opentag\") {\n this.parseOpen(value);\n } else if (eventType === \"text\") {\n this.parseText(value);\n } else if (eventType === \"closetag\") {\n if (!this.parseClose(value.name)) {\n return (this as any).model;\n }\n }\n }\n }\n return (this as any).model;\n }\n\n async parseStream(stream: any): Promise<any> {\n return this.parse(parseSax(stream));\n }\n\n get xml(): string {\n // convenience function to get the xml of this.model\n // useful for manager types that are built during the prepare phase\n return this.toXml((this as any).model);\n }\n\n toXml(model: any): string {\n const xmlStream = new XmlStream();\n this.render(xmlStream, model);\n return xmlStream.xml;\n }\n\n // ============================================================\n // Useful Utilities\n static toAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n if (value === undefined) {\n if (always) {\n return dflt;\n }\n } else if (always || value !== dflt) {\n return value.toString();\n }\n return undefined;\n }\n\n static toStringAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toStringValue(attr: any, dflt?: any): any {\n return attr === undefined ? dflt : attr;\n }\n\n static toBoolAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n if (value === undefined) {\n if (always) {\n return dflt;\n }\n } else if (always || value !== dflt) {\n return value ? \"1\" : \"0\";\n }\n return undefined;\n }\n\n static toBoolValue(attr: any, dflt?: any): boolean {\n return attr === undefined ? dflt : attr === \"1\";\n }\n\n static toIntAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toIntValue(attr: any, dflt?: any): number {\n return attr === undefined ? dflt : parseInt(attr, 10);\n }\n\n static toFloatAttribute(value: any, dflt?: any, always: boolean = false): string | undefined {\n return BaseXform.toAttribute(value, dflt, always);\n }\n\n static toFloatValue(attr: any, dflt?: any): number {\n return attr === undefined ? dflt : parseFloat(attr);\n }\n}\n\nexport { BaseXform };\n","import { BaseXform } from \"./base-xform\";\nimport { XmlStream } from \"../../utils/xml-stream\";\n\ninterface StaticModel {\n tag: string;\n $?: any;\n c?: StaticModel[];\n t?: string;\n}\n\n// const model = {\n// tag: 'name',\n// $: {attr: 'value'},\n// c: [\n// { tag: 'child' }\n// ],\n// t: 'some text'\n// };\n\nfunction build(xmlStream: any, model: StaticModel): void {\n xmlStream.openNode(model.tag, model.$);\n if (model.c) {\n model.c.forEach(child => {\n build(xmlStream, child);\n });\n }\n if (model.t) {\n xmlStream.writeText(model.t);\n }\n xmlStream.closeNode();\n}\n\nclass StaticXform extends BaseXform {\n declare private _model: StaticModel;\n declare private _xml?: string;\n\n constructor(model: StaticModel) {\n super();\n\n // This class is an optimisation for static (unimportant and unchanging) xml\n // It is stateless - apart from its static model and so can be used as a singleton\n // Being stateless - it will only track entry to and exit from it's root xml tag during parsing and nothing else\n // Known issues:\n // since stateless - parseOpen always returns true. Parent xform must know when to start using this xform\n // if the root tag is recursive, the parsing will behave unpredictably\n this._model = model;\n }\n\n render(xmlStream: any): void {\n if (!this._xml) {\n const stream = new XmlStream();\n build(stream, this._model);\n this._xml = stream.xml;\n }\n xmlStream.writeXml(this._xml);\n }\n\n parseOpen(): boolean {\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this._model.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { StaticXform };\n","import { BaseXform } from \"./base-xform\";\n\ninterface ListXformOptions {\n tag: string;\n always?: boolean;\n count?: boolean;\n empty?: boolean;\n $count?: string;\n $?: any;\n childXform: any;\n maxItems?: number;\n}\n\nclass ListXform extends BaseXform {\n declare protected tag: string;\n declare protected always: boolean;\n declare protected count?: boolean;\n declare protected empty?: boolean;\n declare public $count: string;\n declare public $?: any;\n declare protected childXform: any;\n declare protected maxItems?: number;\n declare public parser: any;\n declare public model: any[];\n\n constructor(options: ListXformOptions) {\n super();\n\n this.tag = options.tag;\n this.always = !!options.always;\n this.count = options.count;\n this.empty = options.empty;\n this.$count = options.$count || \"count\";\n this.$ = options.$;\n this.childXform = options.childXform;\n this.maxItems = options.maxItems;\n }\n\n prepare(model: any[], options: any): void {\n const { childXform } = this;\n if (model) {\n model.forEach((childModel, index) => {\n options.index = index;\n childXform.prepare(childModel, options);\n });\n }\n }\n\n render(xmlStream: any, model?: any[]): void {\n if (this.always || (model && model.length)) {\n xmlStream.openNode(this.tag, this.$);\n if (this.count) {\n xmlStream.addAttribute(this.$count, (model && model.length) || 0);\n }\n\n const { childXform } = this;\n (model || []).forEach((childModel, index) => {\n childXform.render(xmlStream, childModel, index);\n });\n\n xmlStream.closeNode();\n } else if (this.empty) {\n xmlStream.leafNode(this.tag);\n }\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.model = [];\n return true;\n default:\n if (this.childXform.parseOpen(node)) {\n this.parser = this.childXform;\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n\n if (this.maxItems && this.model.length > this.maxItems) {\n throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);\n }\n }\n return true;\n }\n\n return false;\n }\n\n reconcile(model: any[], options: any): void {\n if (model) {\n const { childXform } = this;\n model.forEach((childModel: any) => {\n childXform.reconcile(childModel, options);\n });\n }\n }\n\n reset(): void {\n super.reset();\n if (this.childXform) {\n this.childXform.reset();\n }\n }\n}\n\nexport { ListXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface ColorModel {\n argb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\n// Color encapsulates translation from color model to/from xlsx\nclass ColorXform extends BaseXform {\n declare private name: string;\n\n constructor(name?: string) {\n super();\n\n // this.name controls the xm node name\n this.name = name || \"color\";\n }\n\n get tag(): string {\n return this.name;\n }\n\n render(xmlStream: any, model?: ColorModel): boolean {\n if (model) {\n xmlStream.openNode(this.name);\n if (model.argb) {\n xmlStream.addAttribute(\"rgb\", model.argb);\n } else if (model.theme !== undefined) {\n xmlStream.addAttribute(\"theme\", model.theme);\n if (model.tint !== undefined) {\n xmlStream.addAttribute(\"tint\", model.tint);\n }\n } else if (model.indexed !== undefined) {\n xmlStream.addAttribute(\"indexed\", model.indexed);\n } else {\n xmlStream.addAttribute(\"auto\", \"1\");\n }\n xmlStream.closeNode();\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.name) {\n if (node.attributes.rgb) {\n this.model = { argb: node.attributes.rgb };\n } else if (node.attributes.theme) {\n this.model = { theme: parseInt(node.attributes.theme, 10) };\n if (node.attributes.tint) {\n this.model.tint = parseFloat(node.attributes.tint);\n }\n } else if (node.attributes.indexed) {\n this.model = { indexed: parseInt(node.attributes.indexed, 10) };\n } else {\n this.model = undefined;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { ColorXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface BooleanXformOptions {\n tag: string;\n attr: string;\n}\n\nclass BooleanXform extends BaseXform {\n declare private tag: string;\n declare private attr: string;\n\n constructor(options: BooleanXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n }\n\n render(xmlStream: any, model?: boolean): void {\n if (model) {\n xmlStream.openNode(this.tag);\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n this.model = true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { BooleanXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface IntegerXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n zero?: boolean;\n}\n\nclass IntegerXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private zero?: boolean;\n declare private text: string[];\n\n constructor(options: IntegerXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n\n // option to render zero\n this.zero = options.zero;\n this.text = [];\n }\n\n render(xmlStream: any, model?: number): void {\n // int is different to float in that zero is not rendered\n if (model || this.zero) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, model);\n } else {\n xmlStream.writeText(model);\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = parseInt(node.attributes[this.attr], 10);\n } else {\n this.text = [];\n }\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = parseInt(this.text.join(\"\") || \"0\", 10);\n }\n return false;\n }\n}\n\nexport { IntegerXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface StringXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n}\n\nclass StringXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private text: string[];\n\n constructor(options: StringXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n this.text = [];\n }\n\n render(xmlStream: any, model?: string): void {\n if (model !== undefined) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, model);\n } else {\n xmlStream.writeText(model);\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = node.attributes[this.attr];\n } else {\n this.text = [];\n }\n }\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = this.text.join(\"\");\n }\n return false;\n }\n}\n\nexport { StringXform };\n","import { BaseXform } from \"../base-xform\";\n\ntype UnderlineType = boolean | \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\";\n\nclass UnderlineXform extends BaseXform {\n static Attributes: { [key: string]: any } = {\n single: {},\n double: { val: \"double\" },\n singleAccounting: { val: \"singleAccounting\" },\n doubleAccounting: { val: \"doubleAccounting\" }\n };\n\n constructor(model?: UnderlineType) {\n super();\n this.model = model;\n }\n\n get tag(): string {\n return \"u\";\n }\n\n render(xmlStream: any, model?: UnderlineType): void {\n model = model || this.model;\n\n if (model === true) {\n xmlStream.leafNode(\"u\");\n } else {\n const attr = UnderlineXform.Attributes[model as string];\n if (attr) {\n xmlStream.leafNode(\"u\", attr);\n }\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === \"u\") {\n this.model = node.attributes.val || true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { UnderlineXform };\n","import { ColorXform } from \"./color-xform\";\nimport { BooleanXform } from \"../simple/boolean-xform\";\nimport { IntegerXform } from \"../simple/integer-xform\";\nimport { StringXform } from \"../simple/string-xform\";\nimport { UnderlineXform } from \"./underline-xform\";\nimport { BaseXform } from \"../base-xform\";\n\ninterface FontModel {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean | string;\n charset?: number;\n color?: any;\n condense?: boolean;\n extend?: boolean;\n family?: number;\n outline?: boolean;\n vertAlign?: string;\n scheme?: string;\n shadow?: boolean;\n strike?: boolean;\n size?: number;\n name?: string;\n}\n\ninterface FontOptions {\n tagName: string;\n fontNameTag: string;\n}\n\n// Font encapsulates translation from font model to xlsx\nclass FontXform extends BaseXform {\n declare private options: FontOptions;\n declare public parser: any;\n\n constructor(options?: FontOptions) {\n super();\n\n this.options = options || FontXform.OPTIONS;\n\n this.map = {\n b: { prop: \"bold\", xform: new BooleanXform({ tag: \"b\", attr: \"val\" }) },\n i: { prop: \"italic\", xform: new BooleanXform({ tag: \"i\", attr: \"val\" }) },\n u: { prop: \"underline\", xform: new UnderlineXform() },\n charset: { prop: \"charset\", xform: new IntegerXform({ tag: \"charset\", attr: \"val\" }) },\n color: { prop: \"color\", xform: new ColorXform() },\n condense: { prop: \"condense\", xform: new BooleanXform({ tag: \"condense\", attr: \"val\" }) },\n extend: { prop: \"extend\", xform: new BooleanXform({ tag: \"extend\", attr: \"val\" }) },\n family: { prop: \"family\", xform: new IntegerXform({ tag: \"family\", attr: \"val\" }) },\n outline: { prop: \"outline\", xform: new BooleanXform({ tag: \"outline\", attr: \"val\" }) },\n vertAlign: { prop: \"vertAlign\", xform: new StringXform({ tag: \"vertAlign\", attr: \"val\" }) },\n scheme: { prop: \"scheme\", xform: new StringXform({ tag: \"scheme\", attr: \"val\" }) },\n shadow: { prop: \"shadow\", xform: new BooleanXform({ tag: \"shadow\", attr: \"val\" }) },\n strike: { prop: \"strike\", xform: new BooleanXform({ tag: \"strike\", attr: \"val\" }) },\n sz: { prop: \"size\", xform: new IntegerXform({ tag: \"sz\", attr: \"val\" }) }\n };\n this.map[this.options.fontNameTag] = {\n prop: \"name\",\n xform: new StringXform({ tag: this.options.fontNameTag, attr: \"val\" })\n };\n }\n\n get tag(): string {\n return this.options.tagName;\n }\n\n render(xmlStream: any, model: FontModel): void {\n const { map } = this;\n\n xmlStream.openNode(this.options.tagName);\n Object.entries(this.map).forEach(([tag, defn]: [string, { prop: string; xform: any }]) => {\n map[tag].xform.render(xmlStream, model[defn.prop as keyof FontModel]);\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (this.map[node.name]) {\n this.parser = this.map[node.name].xform;\n return this.parser.parseOpen(node);\n }\n switch (node.name) {\n case this.options.tagName:\n this.model = {};\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser && !this.parser.parseClose(name)) {\n const item = this.map[name];\n if (this.parser.model) {\n this.model[item.prop] = this.parser.model;\n }\n this.parser = undefined;\n return true;\n }\n switch (name) {\n case this.options.tagName:\n return false;\n default:\n return true;\n }\n }\n\n static OPTIONS: FontOptions = {\n tagName: \"font\",\n fontNameTag: \"name\"\n };\n}\n\nexport { FontXform };\n","import { BaseXform } from \"../base-xform\";\nimport { ColorXform } from \"./color-xform\";\n\ninterface StopModel {\n position: number;\n color: any;\n}\n\ninterface PatternFillModel {\n type: \"pattern\";\n pattern: string;\n fgColor?: any;\n bgColor?: any;\n}\n\ninterface GradientFillModel {\n type: \"gradient\";\n gradient: \"angle\" | \"path\";\n degree?: number;\n center?: {\n left: number;\n top: number;\n right?: number;\n bottom?: number;\n };\n stops: StopModel[];\n}\n\ntype FillModel = PatternFillModel | GradientFillModel;\n\nclass StopXform extends BaseXform {\n declare public map: { color: ColorXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n color: new ColorXform()\n };\n }\n\n get tag(): string {\n return \"stop\";\n }\n\n render(xmlStream: any, model: StopModel): void {\n xmlStream.openNode(\"stop\");\n xmlStream.addAttribute(\"position\", model.position);\n this.map.color.render(xmlStream, model.color);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"stop\":\n this.model = {\n position: parseFloat(node.attributes.position)\n };\n return true;\n case \"color\":\n this.parser = this.map.color;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.color = this.parser.model;\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\nclass PatternFillXform extends BaseXform {\n declare public map: { fgColor: ColorXform; bgColor: ColorXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n fgColor: new ColorXform(\"fgColor\"),\n bgColor: new ColorXform(\"bgColor\")\n };\n }\n\n get name(): string {\n return \"pattern\";\n }\n\n get tag(): string {\n return \"patternFill\";\n }\n\n render(xmlStream: any, model: PatternFillModel): void {\n xmlStream.openNode(\"patternFill\");\n xmlStream.addAttribute(\"patternType\", model.pattern);\n if (model.fgColor) {\n this.map.fgColor.render(xmlStream, model.fgColor);\n }\n if (model.bgColor) {\n this.map.bgColor.render(xmlStream, model.bgColor);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"patternFill\":\n this.model = {\n type: \"pattern\",\n pattern: node.attributes.patternType\n };\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n if (this.parser.model) {\n this.model[name] = this.parser.model;\n }\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\nclass GradientFillXform extends BaseXform {\n declare public map: { stop: StopXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n stop: new StopXform()\n };\n }\n\n get name(): string {\n return \"gradient\";\n }\n\n get tag(): string {\n return \"gradientFill\";\n }\n\n render(xmlStream: any, model: GradientFillModel): void {\n xmlStream.openNode(\"gradientFill\");\n switch (model.gradient) {\n case \"angle\":\n xmlStream.addAttribute(\"degree\", model.degree);\n break;\n case \"path\":\n xmlStream.addAttribute(\"type\", \"path\");\n if (model.center!.left) {\n xmlStream.addAttribute(\"left\", model.center!.left);\n if (model.center!.right === undefined) {\n xmlStream.addAttribute(\"right\", model.center!.left);\n }\n }\n if (model.center!.right) {\n xmlStream.addAttribute(\"right\", model.center!.right);\n }\n if (model.center!.top) {\n xmlStream.addAttribute(\"top\", model.center!.top);\n if (model.center!.bottom === undefined) {\n xmlStream.addAttribute(\"bottom\", model.center!.top);\n }\n }\n if (model.center!.bottom) {\n xmlStream.addAttribute(\"bottom\", model.center!.bottom);\n }\n break;\n\n default:\n break;\n }\n\n const stopXform = this.map.stop;\n model.stops.forEach(stopModel => {\n stopXform.render(xmlStream, stopModel);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"gradientFill\": {\n const model: any = (this.model = {\n stops: []\n });\n if (node.attributes.degree) {\n model.gradient = \"angle\";\n model.degree = parseInt(node.attributes.degree, 10);\n } else if (node.attributes.type === \"path\") {\n model.gradient = \"path\";\n model.center = {\n left: node.attributes.left ? parseFloat(node.attributes.left) : 0,\n top: node.attributes.top ? parseFloat(node.attributes.top) : 0\n };\n if (node.attributes.right !== node.attributes.left) {\n model.center.right = node.attributes.right ? parseFloat(node.attributes.right) : 0;\n }\n if (node.attributes.bottom !== node.attributes.top) {\n model.center.bottom = node.attributes.bottom ? parseFloat(node.attributes.bottom) : 0;\n }\n }\n return true;\n }\n\n case \"stop\":\n this.parser = this.map.stop;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.stops.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n}\n\n// Fill encapsulates translation from fill model to/from xlsx\nclass FillXform extends BaseXform {\n declare public map: { patternFill: PatternFillXform; gradientFill: GradientFillXform };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n patternFill: new PatternFillXform(),\n gradientFill: new GradientFillXform()\n };\n }\n\n get tag(): string {\n return \"fill\";\n }\n\n render(xmlStream: any, model: FillModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"fill\");\n switch (model.type) {\n case \"pattern\":\n this.map.patternFill.render(xmlStream, model);\n break;\n case \"gradient\":\n this.map.gradientFill.render(xmlStream, model);\n break;\n default:\n xmlStream.rollback();\n return;\n }\n xmlStream.closeNode();\n xmlStream.commit();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"fill\":\n this.model = {};\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model = this.parser.model;\n this.model.type = this.parser.name;\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n\n validStyle(value: string): boolean {\n return FillXform.validPatternValues[value];\n }\n\n static validPatternValues: { [key: string]: boolean } = [\n \"none\",\n \"solid\",\n \"darkVertical\",\n \"darkGray\",\n \"mediumGray\",\n \"lightGray\",\n \"gray125\",\n \"gray0625\",\n \"darkHorizontal\",\n \"darkVertical\",\n \"darkDown\",\n \"darkUp\",\n \"darkGrid\",\n \"darkTrellis\",\n \"lightHorizontal\",\n \"lightVertical\",\n \"lightDown\",\n \"lightUp\",\n \"lightGrid\",\n \"lightTrellis\",\n \"lightGrid\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {});\n\n static StopXform = StopXform;\n static PatternFillXform = PatternFillXform;\n static GradientFillXform = GradientFillXform;\n}\n\nexport { FillXform };\n","import { BaseXform } from \"../base-xform\";\nimport { parseBoolean } from \"../../../utils/utils\";\nimport { ColorXform } from \"./color-xform\";\n\ninterface EdgeModel {\n style?: string;\n color?: any;\n}\n\ninterface BorderModel {\n top?: EdgeModel;\n left?: EdgeModel;\n bottom?: EdgeModel;\n right?: EdgeModel;\n diagonal?: EdgeModel & { up?: boolean; down?: boolean };\n color?: any;\n}\n\nclass EdgeXform extends BaseXform {\n declare private name: string;\n declare public map: { color: ColorXform };\n declare private defaultColor: any;\n declare public parser: any;\n\n constructor(name: string) {\n super();\n\n this.name = name;\n this.map = {\n color: new ColorXform()\n };\n }\n\n get tag(): string {\n return this.name;\n }\n\n render(xmlStream: any, model?: EdgeModel, defaultColor?: any): void {\n const color = (model && model.color) || defaultColor || this.defaultColor;\n xmlStream.openNode(this.name);\n if (model && model.style) {\n xmlStream.addAttribute(\"style\", model.style);\n if (color) {\n this.map.color.render(xmlStream, color);\n }\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.name: {\n const { style } = node.attributes;\n if (style) {\n this.model = {\n style\n };\n } else {\n this.model = undefined;\n }\n return true;\n }\n case \"color\":\n this.parser = this.map.color;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n\n if (name === this.name) {\n if (this.map.color.model) {\n if (!this.model) {\n this.model = {};\n }\n this.model.color = this.map.color.model;\n }\n }\n\n return false;\n }\n\n validStyle(value: string): boolean {\n return EdgeXform.validStyleValues[value];\n }\n\n static validStyleValues: { [key: string]: boolean } = [\n \"thin\",\n \"dashed\",\n \"dotted\",\n \"dashDot\",\n \"hair\",\n \"dashDotDot\",\n \"slantDashDot\",\n \"mediumDashed\",\n \"mediumDashDotDot\",\n \"mediumDashDot\",\n \"medium\",\n \"double\",\n \"thick\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {});\n}\n\n// Border encapsulates translation from border model to/from xlsx\nclass BorderXform extends BaseXform {\n declare public map: { [key: string]: EdgeXform };\n declare public parser: any;\n declare private diagonalUp: boolean | undefined;\n declare private diagonalDown: boolean | undefined;\n\n constructor() {\n super();\n\n this.map = {\n top: new EdgeXform(\"top\"),\n left: new EdgeXform(\"left\"),\n bottom: new EdgeXform(\"bottom\"),\n right: new EdgeXform(\"right\"),\n diagonal: new EdgeXform(\"diagonal\")\n };\n }\n\n render(xmlStream: any, model: BorderModel): void {\n const { color } = model;\n xmlStream.openNode(\"border\");\n if (model.diagonal && model.diagonal.style) {\n if (model.diagonal.up) {\n xmlStream.addAttribute(\"diagonalUp\", \"1\");\n }\n if (model.diagonal.down) {\n xmlStream.addAttribute(\"diagonalDown\", \"1\");\n }\n }\n const add = (edgeModel: EdgeModel | undefined, edgeXform: EdgeXform): void => {\n let edge = edgeModel;\n if (edge && !edge.color && model.color) {\n // don't mess with incoming models\n edge = {\n ...edge,\n color: model.color\n };\n }\n edgeXform.render(xmlStream, edge, color);\n };\n add(model.left, this.map.left);\n add(model.right, this.map.right);\n add(model.top, this.map.top);\n add(model.bottom, this.map.bottom);\n add(model.diagonal, this.map.diagonal);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"border\":\n this.reset();\n this.diagonalUp = parseBoolean(node.attributes.diagonalUp);\n this.diagonalDown = parseBoolean(node.attributes.diagonalDown);\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (name === \"border\") {\n const model: any = (this.model = {});\n const add = (key: string, edgeModel: any, extensions?: any): void => {\n if (edgeModel) {\n if (extensions) {\n Object.assign(edgeModel, extensions);\n }\n model[key] = edgeModel;\n }\n };\n add(\"left\", this.map.left.model);\n add(\"right\", this.map.right.model);\n add(\"top\", this.map.top.model);\n add(\"bottom\", this.map.bottom.model);\n add(\"diagonal\", this.map.diagonal.model, { up: this.diagonalUp, down: this.diagonalDown });\n }\n return false;\n }\n}\n\nexport { BorderXform };\n","interface NumFormat {\n f?: string;\n \"zh-tw\"?: string;\n \"zh-cn\"?: string;\n \"ja-jp\"?: string;\n \"ko-kr\"?: string;\n \"th-th\"?: string;\n}\n\nconst defaultNumFormats: { [key: number]: NumFormat } = {\n 0: { f: \"General\" },\n 1: { f: \"0\" },\n 2: { f: \"0.00\" },\n 3: { f: \"#,##0\" },\n 4: { f: \"#,##0.00\" },\n 9: { f: \"0%\" },\n 10: { f: \"0.00%\" },\n 11: { f: \"0.00E+00\" },\n 12: { f: \"# ?/?\" },\n 13: { f: \"# ??/??\" },\n 14: { f: \"mm-dd-yy\" },\n 15: { f: \"d-mmm-yy\" },\n 16: { f: \"d-mmm\" },\n 17: { f: \"mmm-yy\" },\n 18: { f: \"h:mm AM/PM\" },\n 19: { f: \"h:mm:ss AM/PM\" },\n 20: { f: \"h:mm\" },\n 21: { f: \"h:mm:ss\" },\n 22: { f: 'm/d/yy \"h\":mm' },\n\n 27: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 28: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 29: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 30: { \"zh-tw\": \"m/d/yy \", \"zh-cn\": \"m-d-yy\", \"ja-jp\": \"m/d/yy\", \"ko-kr\": \"mm-dd-yy\" },\n 31: {\n \"zh-tw\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"d\"日\"',\n \"ko-kr\": 'yyyy\"년\" mm\"월\" dd\"일\"'\n },\n 32: {\n \"zh-tw\": 'hh\"時\"mm\"分\"',\n \"zh-cn\": 'h\"时\"mm\"分\"',\n \"ja-jp\": 'h\"時\"mm\"分\"',\n \"ko-kr\": 'h\"시\" mm\"분\"'\n },\n 33: {\n \"zh-tw\": 'hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": 'h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'h\"時\"mm\"分\"ss\"秒\"',\n \"ko-kr\": 'h\"시\" mm\"분\" ss\"초\"'\n },\n 34: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 35: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 36: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n\n 37: { f: \"#,##0 ;(#,##0)\" },\n 38: { f: \"#,##0 ;[Red](#,##0)\" },\n 39: { f: \"#,##0.00 ;(#,##0.00)\" },\n 40: { f: \"#,##0.00 ;[Red](#,##0.00)\" },\n 45: { f: \"mm:ss\" },\n 46: { f: \"[h]:mm:ss\" },\n 47: { f: \"mmss.0\" },\n 48: { f: \"##0.0E+0\" },\n 49: { f: \"@\" },\n\n 50: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 51: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 52: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 53: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 54: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n 55: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"',\n \"ja-jp\": 'yyyy\"年\"m\"月\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 56: {\n \"zh-tw\": '上午/下午 hh\"時\"mm\"分\"ss\"秒\"',\n \"zh-cn\": '上午/下午 h\"时\"mm\"分\"ss\"秒\"',\n \"ja-jp\": 'm\"月\"d\"日\"',\n \"ko-kr\": \"yyyy-mm-dd\"\n },\n 57: {\n \"zh-tw\": \"[$-404]e/m/d\",\n \"zh-cn\": 'yyyy\"年\"m\"月\"',\n \"ja-jp\": \"[$-411]ge.m.d\",\n \"ko-kr\": 'yyyy\"年\" mm\"月\" dd\"日\"'\n },\n 58: {\n \"zh-tw\": '[$-404]e\"年\"m\"月\"d\"日\"',\n \"zh-cn\": 'm\"月\"d\"日\"',\n \"ja-jp\": '[$-411]ggge\"年\"m\"月\"d\"日\"',\n \"ko-kr\": \"mm-dd\"\n },\n\n 59: { \"th-th\": \"t0\" },\n 60: { \"th-th\": \"t0.00\" },\n 61: { \"th-th\": \"t#,##0\" },\n 62: { \"th-th\": \"t#,##0.00\" },\n 67: { \"th-th\": \"t0%\" },\n 68: { \"th-th\": \"t0.00%\" },\n 69: { \"th-th\": \"t# ?/?\" },\n 70: { \"th-th\": \"t# ??/??\" },\n\n 81: { \"th-th\": \"d/m/bb\" }\n};\n\nexport { defaultNumFormats };\n","import { defaultNumFormats } from \"../../defaultnumformats\";\nimport { BaseXform } from \"../base-xform\";\n\ninterface NumFmtModel {\n id: number;\n formatCode: string;\n}\n\nfunction hashDefaultFormats(): { [key: string]: number } {\n const hash: { [key: string]: number } = {};\n Object.entries(defaultNumFormats).forEach(([id, dnf]) => {\n if (dnf.f) {\n hash[dnf.f] = parseInt(id, 10);\n }\n // at some point, add the other cultures here...\n });\n return hash;\n}\nconst defaultFmtHash = hashDefaultFormats();\n\n// NumFmt encapsulates translation between number format and xlsx\nclass NumFmtXform extends BaseXform {\n declare private id?: number;\n declare private formatCode?: string;\n\n constructor(id?: number, formatCode?: string) {\n super();\n\n this.id = id;\n this.formatCode = formatCode;\n }\n\n get tag(): string {\n return \"numFmt\";\n }\n\n render(xmlStream: any, model: NumFmtModel): void {\n xmlStream.leafNode(\"numFmt\", { numFmtId: model.id, formatCode: model.formatCode });\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"numFmt\":\n this.model = {\n id: parseInt(node.attributes.numFmtId, 10),\n formatCode: node.attributes.formatCode.replace(/[\\\\](.)/g, \"$1\")\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n static getDefaultFmtId(formatCode: string): number | undefined {\n return defaultFmtHash[formatCode];\n }\n\n static getDefaultFmtCode(numFmtId: number): string | undefined {\n return defaultNumFormats[numFmtId] && defaultNumFormats[numFmtId].f;\n }\n}\n\nexport { NumFmtXform };\n","import { BaseXform } from \"../base-xform\";\nimport { validInt, parseBoolean } from \"../../../utils/utils\";\n\nconst Enums = {\n ReadingOrder: {\n LeftToRight: 1,\n RightToLeft: 2\n }\n};\n\ninterface AlignmentModel {\n horizontal?: string;\n vertical?: string;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n indent?: number;\n textRotation?: number | \"vertical\";\n readingOrder?: \"ltr\" | \"rtl\";\n}\n\nconst validation = {\n horizontalValues: [\n \"left\",\n \"center\",\n \"right\",\n \"fill\",\n \"centerContinuous\",\n \"distributed\",\n \"justify\"\n ].reduce((p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n }, {}),\n horizontal(value: string): string | undefined {\n return this.horizontalValues[value] ? value : undefined;\n },\n\n verticalValues: [\"top\", \"middle\", \"bottom\", \"distributed\", \"justify\"].reduce(\n (p: { [key: string]: boolean }, v: string) => {\n p[v] = true;\n return p;\n },\n {}\n ),\n vertical(value: string): string | undefined {\n if (value === \"middle\") {\n return \"center\";\n }\n return this.verticalValues[value] ? value : undefined;\n },\n wrapText(value: boolean): boolean | undefined {\n return value ? true : undefined;\n },\n shrinkToFit(value: boolean): boolean | undefined {\n return value ? true : undefined;\n },\n textRotation(value: number | \"vertical\"): number | \"vertical\" | undefined {\n switch (value) {\n case \"vertical\":\n return value;\n default: {\n const numValue = validInt(value as number);\n return numValue !== undefined && numValue >= -90 && numValue <= 90 ? numValue : undefined;\n }\n }\n },\n indent(value: number): number {\n const numValue = validInt(value);\n return Math.max(0, numValue!);\n },\n readingOrder(value: \"ltr\" | \"rtl\"): number | undefined {\n switch (value) {\n case \"ltr\":\n return Enums.ReadingOrder.LeftToRight;\n case \"rtl\":\n return Enums.ReadingOrder.RightToLeft;\n default:\n return undefined;\n }\n }\n};\n\nconst textRotationXform = {\n toXml(textRotation: number | \"vertical\"): number | undefined {\n const validated = validation.textRotation(textRotation);\n if (validated) {\n if (validated === \"vertical\") {\n return 255;\n }\n\n const tr = Math.round(validated);\n if (tr >= 0 && tr <= 90) {\n return tr;\n }\n\n if (tr < 0 && tr >= -90) {\n return 90 - tr;\n }\n }\n return undefined;\n },\n toModel(textRotation: string): number | \"vertical\" | undefined {\n const tr = validInt(textRotation);\n if (tr !== undefined) {\n if (tr === 255) {\n return \"vertical\";\n }\n if (tr >= 0 && tr <= 90) {\n return tr;\n }\n if (tr > 90 && tr <= 180) {\n return 90 - tr;\n }\n }\n return undefined;\n }\n};\n\n// Alignment encapsulates translation from style.alignment model to/from xlsx\nclass AlignmentXform extends BaseXform {\n get tag(): string {\n return \"alignment\";\n }\n\n render(xmlStream: any, model: AlignmentModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"alignment\");\n\n let isValid = false;\n function add(name: string, value: string | number | boolean | undefined): void {\n if (value) {\n xmlStream.addAttribute(name, value);\n isValid = true;\n }\n }\n add(\"horizontal\", validation.horizontal(model.horizontal!));\n add(\"vertical\", validation.vertical(model.vertical!));\n add(\"wrapText\", validation.wrapText(model.wrapText!) ? \"1\" : false);\n add(\"shrinkToFit\", validation.shrinkToFit(model.shrinkToFit!) ? \"1\" : false);\n add(\"indent\", validation.indent(model.indent!));\n add(\"textRotation\", textRotationXform.toXml(model.textRotation!));\n add(\"readingOrder\", validation.readingOrder(model.readingOrder!));\n\n xmlStream.closeNode();\n\n if (isValid) {\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n\n parseOpen(node: any): void {\n const model: any = {};\n\n let valid = false;\n function add(truthy: any, name: string, value: any): void {\n if (truthy) {\n model[name] = value;\n valid = true;\n }\n }\n add(node.attributes.horizontal, \"horizontal\", node.attributes.horizontal);\n add(\n node.attributes.vertical,\n \"vertical\",\n node.attributes.vertical === \"center\" ? \"middle\" : node.attributes.vertical\n );\n add(node.attributes.wrapText, \"wrapText\", parseBoolean(node.attributes.wrapText));\n add(node.attributes.shrinkToFit, \"shrinkToFit\", parseBoolean(node.attributes.shrinkToFit));\n add(node.attributes.indent, \"indent\", parseInt(node.attributes.indent, 10));\n add(\n node.attributes.textRotation,\n \"textRotation\",\n textRotationXform.toModel(node.attributes.textRotation)\n );\n add(\n node.attributes.readingOrder,\n \"readingOrder\",\n node.attributes.readingOrder === \"2\" ? \"rtl\" : \"ltr\"\n );\n\n this.model = valid ? model : null;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { AlignmentXform };\n","import { BaseXform } from \"../base-xform\";\n\nconst validation = {\n boolean(value: boolean | undefined, dflt: boolean): boolean {\n if (value === undefined) {\n return dflt;\n }\n return value;\n }\n};\n\ninterface ProtectionModel {\n locked?: boolean;\n hidden?: boolean;\n}\n\n// Protection encapsulates translation from style.protection model to/from xlsx\nclass ProtectionXform extends BaseXform {\n get tag(): string {\n return \"protection\";\n }\n\n render(xmlStream: any, model: ProtectionModel): void {\n xmlStream.addRollback();\n xmlStream.openNode(\"protection\");\n\n let isValid = false;\n function add(name: string, value: string | undefined): void {\n if (value !== undefined) {\n xmlStream.addAttribute(name, value);\n isValid = true;\n }\n }\n add(\"locked\", validation.boolean(model.locked, true) ? undefined : \"0\");\n add(\"hidden\", validation.boolean(model.hidden, false) ? \"1\" : undefined);\n\n xmlStream.closeNode();\n\n if (isValid) {\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n\n parseOpen(node: any): void {\n const model: ProtectionModel = {\n locked: !(node.attributes.locked === \"0\"),\n hidden: node.attributes.hidden === \"1\"\n };\n\n // only want to record models that differ from defaults\n const isSignificant = !model.locked || model.hidden;\n\n this.model = isSignificant ? model : null;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { ProtectionXform };\n","import { BaseXform } from \"../base-xform\";\nimport { AlignmentXform } from \"./alignment-xform\";\nimport { ProtectionXform } from \"./protection-xform\";\n\n// <xf numFmtId=\"[numFmtId]\" fontId=\"[fontId]\" fillId=\"[fillId]\" borderId=\"[xf.borderId]\" xfId=\"[xfId]\">\n// Optional <alignment>\n// Optional <protection>\n// </xf>\n\ninterface StyleModel {\n numFmtId?: number;\n fontId?: number;\n fillId?: number;\n borderId?: number;\n xfId?: number;\n alignment?: any;\n protection?: any;\n}\n\ninterface StyleOptions {\n xfId?: boolean;\n}\n\n// Style assists translation from style model to/from xlsx\nclass StyleXform extends BaseXform {\n declare private xfId: boolean;\n declare public map: { alignment: AlignmentXform; protection: ProtectionXform };\n declare public parser: any;\n\n constructor(options?: StyleOptions) {\n super();\n\n this.xfId = !!(options && options.xfId);\n this.map = {\n alignment: new AlignmentXform(),\n protection: new ProtectionXform()\n };\n }\n\n get tag(): string {\n return \"xf\";\n }\n\n render(xmlStream: any, model: StyleModel): void {\n xmlStream.openNode(\"xf\", {\n numFmtId: model.numFmtId || 0,\n fontId: model.fontId || 0,\n fillId: model.fillId || 0,\n borderId: model.borderId || 0\n });\n if (this.xfId) {\n xmlStream.addAttribute(\"xfId\", model.xfId || 0);\n }\n\n if (model.numFmtId) {\n xmlStream.addAttribute(\"applyNumberFormat\", \"1\");\n }\n if (model.fontId) {\n xmlStream.addAttribute(\"applyFont\", \"1\");\n }\n if (model.fillId) {\n xmlStream.addAttribute(\"applyFill\", \"1\");\n }\n if (model.borderId) {\n xmlStream.addAttribute(\"applyBorder\", \"1\");\n }\n if (model.alignment) {\n xmlStream.addAttribute(\"applyAlignment\", \"1\");\n }\n if (model.protection) {\n xmlStream.addAttribute(\"applyProtection\", \"1\");\n }\n\n /**\n * Rendering tags causes close of XML stream.\n * Therefore adding attributes must be done before rendering tags.\n */\n\n if (model.alignment) {\n this.map.alignment.render(xmlStream, model.alignment);\n }\n if (model.protection) {\n this.map.protection.render(xmlStream, model.protection);\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n // used during sax parsing of xml to build font object\n switch (node.name) {\n case \"xf\":\n this.model = {\n numFmtId: parseInt(node.attributes.numFmtId, 10),\n fontId: parseInt(node.attributes.fontId, 10),\n fillId: parseInt(node.attributes.fillId, 10),\n borderId: parseInt(node.attributes.borderId, 10)\n };\n if (this.xfId) {\n this.model.xfId = parseInt(node.attributes.xfId, 10);\n }\n return true;\n case \"alignment\":\n this.parser = this.map.alignment;\n this.parser.parseOpen(node);\n return true;\n case \"protection\":\n this.parser = this.map.protection;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n if (this.map.protection === this.parser) {\n this.model.protection = this.parser.model;\n } else {\n this.model.alignment = this.parser.model;\n }\n this.parser = undefined;\n }\n return true;\n }\n return name !== \"xf\";\n }\n}\n\nexport { StyleXform };\n","import { BaseXform } from \"../base-xform\";\nimport { AlignmentXform } from \"./alignment-xform\";\nimport { BorderXform } from \"./border-xform\";\nimport { FillXform } from \"./fill-xform\";\nimport { FontXform } from \"./font-xform\";\nimport { NumFmtXform } from \"./numfmt-xform\";\nimport { ProtectionXform } from \"./protection-xform\";\n\n// <xf numFmtId=\"[numFmtId]\" fontId=\"[fontId]\" fillId=\"[fillId]\" borderId=\"[xf.borderId]\" xfId=\"[xfId]\">\n// Optional <alignment>\n// Optional <protection>\n// </xf>\n\ninterface DxfModel {\n alignment?: any;\n border?: any;\n fill?: any;\n font?: any;\n numFmt?: string;\n numFmtId?: number;\n protection?: any;\n}\n\n// Style assists translation from style model to/from xlsx\nclass DxfXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n alignment: new AlignmentXform(),\n border: new BorderXform(),\n fill: new FillXform(),\n font: new FontXform(),\n numFmt: new NumFmtXform(),\n protection: new ProtectionXform()\n };\n }\n\n get tag(): string {\n return \"dxf\";\n }\n\n // how do we generate dxfid?\n\n render(xmlStream: any, model: DxfModel): void {\n xmlStream.openNode(this.tag);\n\n if (model.font) {\n this.map.font.render(xmlStream, model.font);\n }\n if (model.numFmt && model.numFmtId) {\n const numFmtModel = { id: model.numFmtId, formatCode: model.numFmt };\n this.map.numFmt.render(xmlStream, numFmtModel);\n }\n if (model.fill) {\n this.map.fill.render(xmlStream, model.fill);\n }\n if (model.alignment) {\n this.map.alignment.render(xmlStream, model.alignment);\n }\n if (model.border) {\n this.map.border.render(xmlStream, model.border);\n }\n if (model.protection) {\n this.map.protection.render(xmlStream, model.protection);\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n // this node is often repeated. Need to reset children\n this.reset();\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (name === this.tag) {\n this.model = {\n alignment: this.map.alignment.model,\n border: this.map.border.model,\n fill: this.map.fill.model,\n font: this.map.font.model,\n numFmt: this.map.numFmt.model,\n protection: this.map.protection.model\n };\n return false;\n }\n\n return true;\n }\n}\n\nexport { DxfXform };\n","import { Enums } from \"../../../doc/enums\";\nimport { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { StaticXform } from \"../static-xform\";\nimport { ListXform } from \"../list-xform\";\nimport { FontXform } from \"./font-xform\";\nimport { FillXform } from \"./fill-xform\";\nimport { BorderXform } from \"./border-xform\";\nimport { NumFmtXform } from \"./numfmt-xform\";\nimport { StyleXform } from \"./style-xform\";\nimport { DxfXform } from \"./dxf-xform\";\n\n// custom numfmt ids start here\nconst NUMFMT_BASE = 164;\n\ninterface StylesModel {\n styles?: any[];\n numFmts?: any[];\n fonts?: any[];\n borders?: any[];\n fills?: any[];\n dxfs?: any[];\n}\n\ninterface StyleIndex {\n style?: { [key: string]: number };\n numFmt?: { [key: string]: number };\n numFmtNextId?: number;\n font?: { [key: string]: number };\n border?: { [key: string]: number };\n fill?: { [key: string]: number };\n model?: any[];\n}\n\n// =============================================================================\n// StylesXform is used to generate and parse the styles.xml file\n// it manages the collections of fonts, number formats, alignments, etc\nclass StylesXform extends BaseXform {\n declare private index?: StyleIndex;\n declare private weakMap?: WeakMap<any, number>;\n declare public parser: any;\n static Mock: typeof StylesXform;\n\n constructor(initialise?: boolean) {\n super();\n\n this.map = {\n numFmts: new ListXform({ tag: \"numFmts\", count: true, childXform: new NumFmtXform() }),\n fonts: new ListXform({\n tag: \"fonts\",\n count: true,\n childXform: new FontXform(),\n $: { \"x14ac:knownFonts\": 1 }\n }),\n fills: new ListXform({ tag: \"fills\", count: true, childXform: new FillXform() }),\n borders: new ListXform({ tag: \"borders\", count: true, childXform: new BorderXform() }),\n cellStyleXfs: new ListXform({\n tag: \"cellStyleXfs\",\n count: true,\n childXform: new StyleXform()\n }),\n cellXfs: new ListXform({\n tag: \"cellXfs\",\n count: true,\n childXform: new StyleXform({ xfId: true })\n }),\n dxfs: new ListXform({ tag: \"dxfs\", always: true, count: true, childXform: new DxfXform() }),\n\n // for style manager\n numFmt: new NumFmtXform(),\n font: new FontXform(),\n fill: new FillXform(),\n border: new BorderXform(),\n style: new StyleXform({ xfId: true }),\n\n cellStyles: StylesXform.STATIC_XFORMS.cellStyles,\n tableStyles: StylesXform.STATIC_XFORMS.tableStyles,\n extLst: StylesXform.STATIC_XFORMS.extLst\n };\n\n if (initialise) {\n // StylesXform also acts as style manager and is used to build up styles-model during worksheet processing\n this.init();\n }\n }\n\n initIndex(): void {\n this.index = {\n style: {},\n numFmt: {},\n numFmtNextId: 164, // start custom format ids here\n font: {},\n border: {},\n fill: {}\n };\n }\n\n init(): void {\n // Prepare for Style Manager role\n this.model = {\n styles: [],\n numFmts: [],\n fonts: [],\n borders: [],\n fills: [],\n dxfs: []\n };\n\n this.initIndex();\n\n // default (zero) border\n this._addBorder({});\n\n // add default (all zero) style\n this._addStyle({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 });\n\n // add default fills\n this._addFill({ type: \"pattern\", pattern: \"none\" });\n this._addFill({ type: \"pattern\", pattern: \"gray125\" });\n\n this.weakMap = new WeakMap();\n }\n\n render(xmlStream: any, model?: StylesModel): void {\n const renderModel = model || this.model;\n //\n // <fonts count=\"2\" x14ac:knownFonts=\"1\">\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"styleSheet\", StylesXform.STYLESHEET_ATTRIBUTES);\n\n if (this.index) {\n // model has been built by style manager role (contains xml)\n if (renderModel.numFmts && renderModel.numFmts.length) {\n xmlStream.openNode(\"numFmts\", { count: renderModel.numFmts.length });\n renderModel.numFmts.forEach((numFmtXml: string) => {\n xmlStream.writeXml(numFmtXml);\n });\n xmlStream.closeNode();\n }\n\n if (!renderModel.fonts!.length) {\n // default (zero) font\n this._addFont({\n size: 11,\n color: { theme: 1 },\n name: \"Calibri\",\n family: 2,\n scheme: \"minor\"\n });\n }\n xmlStream.openNode(\"fonts\", { count: renderModel.fonts!.length, \"x14ac:knownFonts\": 1 });\n renderModel.fonts!.forEach((fontXml: string) => {\n xmlStream.writeXml(fontXml);\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"fills\", { count: renderModel.fills!.length });\n renderModel.fills!.forEach((fillXml: string) => {\n xmlStream.writeXml(fillXml);\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"borders\", { count: renderModel.borders!.length });\n renderModel.borders!.forEach((borderXml: string) => {\n xmlStream.writeXml(borderXml);\n });\n xmlStream.closeNode();\n\n this.map.cellStyleXfs.render(xmlStream, [\n { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }\n ]);\n\n xmlStream.openNode(\"cellXfs\", { count: renderModel.styles!.length });\n renderModel.styles!.forEach((styleXml: string) => {\n xmlStream.writeXml(styleXml);\n });\n xmlStream.closeNode();\n } else {\n // model is plain JSON and needs to be xformed\n this.map.numFmts.render(xmlStream, renderModel.numFmts);\n this.map.fonts.render(xmlStream, renderModel.fonts);\n this.map.fills.render(xmlStream, renderModel.fills);\n this.map.borders.render(xmlStream, renderModel.borders);\n this.map.cellStyleXfs.render(xmlStream, [\n { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }\n ]);\n this.map.cellXfs.render(xmlStream, renderModel.styles);\n }\n\n StylesXform.STATIC_XFORMS.cellStyles.render(xmlStream);\n\n this.map.dxfs.render(xmlStream, renderModel.dxfs);\n\n StylesXform.STATIC_XFORMS.tableStyles.render(xmlStream);\n StylesXform.STATIC_XFORMS.extLst.render(xmlStream);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"styleSheet\":\n this.initIndex();\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"styleSheet\": {\n this.model = {};\n const add = (propName: string, xform: any): void => {\n if (xform.model && xform.model.length) {\n this.model[propName] = xform.model;\n }\n };\n add(\"numFmts\", this.map.numFmts);\n add(\"fonts\", this.map.fonts);\n add(\"fills\", this.map.fills);\n add(\"borders\", this.map.borders);\n add(\"styles\", this.map.cellXfs);\n add(\"dxfs\", this.map.dxfs);\n\n // index numFmts\n this.index = {\n model: [],\n numFmt: {}\n };\n if (this.model.numFmts) {\n const numFmtIndex: any = this.index.numFmt;\n this.model.numFmts.forEach((numFmt: any) => {\n numFmtIndex[numFmt.id] = numFmt.formatCode;\n });\n }\n\n return false;\n }\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n // add a cell's style model to the collection\n // each style property is processed and cross-referenced, etc.\n // the styleId is returned. Note: cellType is used when numFmt not defined\n addStyleModel(model: any, cellType?: number): number {\n if (!model) {\n return 0;\n }\n\n // if we have no default font, add it here now\n if (!this.model.fonts.length) {\n // default (zero) font\n this._addFont({ size: 11, color: { theme: 1 }, name: \"Calibri\", family: 2, scheme: \"minor\" });\n }\n\n // if we have seen this style object before, assume it has the same styleId\n if (this.weakMap && this.weakMap.has(model)) {\n return this.weakMap.get(model)!;\n }\n\n const style: any = {};\n const type = cellType || Enums.ValueType.Number;\n\n if (model.numFmt) {\n style.numFmtId = this._addNumFmtStr(model.numFmt);\n } else {\n switch (type) {\n case Enums.ValueType.Number:\n style.numFmtId = this._addNumFmtStr(\"General\");\n break;\n case Enums.ValueType.Date:\n style.numFmtId = this._addNumFmtStr(\"mm-dd-yy\");\n break;\n default:\n break;\n }\n }\n\n if (model.font) {\n style.fontId = this._addFont(model.font);\n }\n\n if (model.border) {\n style.borderId = this._addBorder(model.border);\n }\n\n if (model.fill) {\n style.fillId = this._addFill(model.fill);\n }\n\n if (model.alignment) {\n style.alignment = model.alignment;\n }\n\n if (model.protection) {\n style.protection = model.protection;\n }\n\n const styleId = this._addStyle(style);\n if (this.weakMap) {\n this.weakMap.set(model, styleId);\n }\n return styleId;\n }\n\n // given a styleId (i.e. s=\"n\"), get the cell's style model\n // objects are shared where possible.\n getStyleModel(id: number): any {\n // if the style doesn't exist return null\n const style = this.model.styles[id];\n if (!style) {\n return null;\n }\n\n // have we built this model before?\n let model = this.index!.model![id];\n if (model) {\n return model;\n }\n\n // build a new model\n model = this.index!.model![id] = {};\n\n // -------------------------------------------------------\n // number format\n if (style.numFmtId) {\n const numFmt =\n (this.index!.numFmt as any)[style.numFmtId] ||\n NumFmtXform.getDefaultFmtCode(style.numFmtId);\n if (numFmt) {\n model.numFmt = numFmt;\n }\n }\n\n function addStyle(name: string, group: any[], styleId: number): void {\n if (styleId || styleId === 0) {\n const part = group[styleId];\n if (part) {\n model[name] = part;\n }\n }\n }\n\n addStyle(\"font\", this.model.fonts, style.fontId);\n addStyle(\"border\", this.model.borders, style.borderId);\n addStyle(\"fill\", this.model.fills, style.fillId);\n\n // -------------------------------------------------------\n // alignment\n if (style.alignment) {\n model.alignment = style.alignment;\n }\n\n // -------------------------------------------------------\n // protection\n if (style.protection) {\n model.protection = style.protection;\n }\n\n return model;\n }\n\n addDxfStyle(style: any): number {\n if (style.numFmt) {\n // register numFmtId to use it during dxf-xform rendering\n style.numFmtId = this._addNumFmtStr(style.numFmt);\n }\n\n this.model.dxfs.push(style);\n return this.model.dxfs.length - 1;\n }\n\n getDxfStyle(id: number): any {\n return this.model.dxfs[id];\n }\n\n // =========================================================================\n // Private Interface\n _addStyle(style: any): number {\n const xml = this.map.style.toXml(style);\n let index = this.index!.style![xml];\n if (index === undefined) {\n index = this.index!.style![xml] = this.model.styles.length;\n this.model.styles.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Number Formats\n _addNumFmtStr(formatCode: string): number {\n // check if default format\n let index = NumFmtXform.getDefaultFmtId(formatCode);\n if (index !== undefined) {\n return index;\n }\n\n // check if already in\n index = (this.index!.numFmt as any)[formatCode];\n if (index !== undefined) {\n return index;\n }\n\n index = (this.index!.numFmt as any)[formatCode] = NUMFMT_BASE + this.model.numFmts.length;\n const xml = this.map.numFmt.toXml({ id: index, formatCode });\n this.model.numFmts.push(xml);\n return index;\n }\n\n // =========================================================================\n // Fonts\n _addFont(font: any): number {\n const xml = this.map.font.toXml(font);\n let index = this.index!.font![xml];\n if (index === undefined) {\n index = this.index!.font![xml] = this.model.fonts.length;\n this.model.fonts.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Borders\n _addBorder(border: any): number {\n const xml = this.map.border.toXml(border);\n let index = this.index!.border![xml];\n if (index === undefined) {\n index = this.index!.border![xml] = this.model.borders.length;\n this.model.borders.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n // Fills\n _addFill(fill: any): number {\n const xml = this.map.fill.toXml(fill);\n let index = this.index!.fill![xml];\n if (index === undefined) {\n index = this.index!.fill![xml] = this.model.fills.length;\n this.model.fills.push(xml);\n }\n return index;\n }\n\n // =========================================================================\n static STYLESHEET_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"x14ac x16r2\",\n \"xmlns:x14ac\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\",\n \"xmlns:x16r2\": \"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\"\n };\n\n static STATIC_XFORMS = {\n cellStyles: new StaticXform({\n tag: \"cellStyles\",\n $: { count: 1 },\n c: [{ tag: \"cellStyle\", $: { name: \"Normal\", xfId: 0, builtinId: 0 } }]\n }),\n dxfs: new StaticXform({ tag: \"dxfs\", $: { count: 0 } }),\n tableStyles: new StaticXform({\n tag: \"tableStyles\",\n $: {\n count: 0,\n defaultTableStyle: \"TableStyleMedium2\",\n defaultPivotStyle: \"PivotStyleLight16\"\n }\n }),\n extLst: new StaticXform({\n tag: \"extLst\",\n c: [\n {\n tag: \"ext\",\n $: {\n uri: \"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n },\n c: [{ tag: \"x14:slicerStyles\", $: { defaultSlicerStyle: \"SlicerStyleLight1\" } }]\n },\n {\n tag: \"ext\",\n $: {\n uri: \"{9260A510-F301-46a8-8635-F512D64BE5F5}\",\n \"xmlns:x15\": \"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"\n },\n c: [{ tag: \"x15:timelineStyles\", $: { defaultTimelineStyle: \"TimeSlicerStyleLight1\" } }]\n }\n ]\n })\n };\n}\n\n// the stylemanager mock acts like StyleManager except that it always returns 0 or {}\nclass StylesXformMock extends StylesXform {\n declare private _dateStyleId?: number;\n\n constructor() {\n super();\n\n this.model = {\n styles: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }],\n numFmts: [],\n fonts: [{ size: 11, color: { theme: 1 }, name: \"Calibri\", family: 2, scheme: \"minor\" }],\n borders: [{}],\n fills: [\n { type: \"pattern\", pattern: \"none\" },\n { type: \"pattern\", pattern: \"gray125\" }\n ]\n };\n }\n\n // =========================================================================\n // Style Manager Interface\n\n // override normal behaviour - consume and dispose\n parseStream(stream: any): Promise<void> {\n stream.autodrain();\n return Promise.resolve();\n }\n\n // add a cell's style model to the collection\n // each style property is processed and cross-referenced, etc.\n // the styleId is returned. Note: cellType is used when numFmt not defined\n addStyleModel(model: any, cellType?: number): number {\n switch (cellType) {\n case Enums.ValueType.Date:\n return this.dateStyleId;\n default:\n return 0;\n }\n }\n\n get dateStyleId(): number {\n if (!this._dateStyleId) {\n const dateStyle = {\n numFmtId: NumFmtXform.getDefaultFmtId(\"mm-dd-yy\")\n };\n this._dateStyleId = this.model.styles.length;\n this.model.styles.push(dateStyle);\n }\n return this._dateStyleId;\n }\n\n // given a styleId (i.e. s=\"n\"), get the cell's style model\n // objects are shared where possible.\n getStyleModel(/* id */): any {\n return {};\n }\n}\n\n// Assign Mock after class declaration to avoid \"used before declaration\" error\nStylesXform.Mock = StylesXformMock;\n\nexport { StylesXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface DateXformOptions {\n tag: string;\n attr?: string;\n attrs?: any;\n format?: (dt: Date) => string;\n parse?: (str: string) => Date;\n}\n\nclass DateXform extends BaseXform {\n declare private tag: string;\n declare private attr?: string;\n declare private attrs?: any;\n declare private text: string[];\n declare private _format: (dt: Date) => string;\n declare private _parse: (str: string) => Date;\n\n constructor(options: DateXformOptions) {\n super();\n\n this.tag = options.tag;\n this.attr = options.attr;\n this.attrs = options.attrs;\n this.text = [];\n this._format =\n options.format ||\n function (dt: Date): string {\n try {\n if (Number.isNaN(dt.getTime())) {\n return \"\";\n }\n return dt.toISOString();\n } catch {\n return \"\";\n }\n };\n this._parse =\n options.parse ||\n function (str: string): Date {\n return new Date(str);\n };\n }\n\n render(xmlStream: any, model?: Date): void {\n if (model) {\n xmlStream.openNode(this.tag);\n if (this.attrs) {\n xmlStream.addAttributes(this.attrs);\n }\n if (this.attr) {\n xmlStream.addAttribute(this.attr, this._format(model));\n } else {\n xmlStream.writeText(this._format(model));\n }\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === this.tag) {\n if (this.attr) {\n this.model = this._parse(node.attributes[this.attr]);\n } else {\n this.text = [];\n }\n }\n }\n\n parseText(text: string): void {\n if (!this.attr) {\n this.text.push(text);\n }\n }\n\n parseClose(): boolean {\n if (!this.attr) {\n this.model = this._parse(this.text.join(\"\"));\n }\n return false;\n }\n}\n\nexport { DateXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { DateXform } from \"../simple/date-xform\";\nimport { StringXform } from \"../simple/string-xform\";\nimport { IntegerXform } from \"../simple/integer-xform\";\n\ninterface CoreModel {\n creator?: string;\n title?: string;\n subject?: string;\n description?: string;\n identifier?: string;\n language?: string;\n keywords?: string;\n category?: string;\n lastModifiedBy?: string;\n lastPrinted?: Date;\n revision?: number;\n version?: string;\n contentStatus?: string;\n contentType?: string;\n created?: Date;\n modified?: Date;\n}\n\nclass CoreXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n \"dc:creator\": new StringXform({ tag: \"dc:creator\" }),\n \"dc:title\": new StringXform({ tag: \"dc:title\" }),\n \"dc:subject\": new StringXform({ tag: \"dc:subject\" }),\n \"dc:description\": new StringXform({ tag: \"dc:description\" }),\n \"dc:identifier\": new StringXform({ tag: \"dc:identifier\" }),\n \"dc:language\": new StringXform({ tag: \"dc:language\" }),\n \"cp:keywords\": new StringXform({ tag: \"cp:keywords\" }),\n \"cp:category\": new StringXform({ tag: \"cp:category\" }),\n \"cp:lastModifiedBy\": new StringXform({ tag: \"cp:lastModifiedBy\" }),\n \"cp:lastPrinted\": new DateXform({ tag: \"cp:lastPrinted\", format: CoreXform.DateFormat }),\n \"cp:revision\": new IntegerXform({ tag: \"cp:revision\" }),\n \"cp:version\": new StringXform({ tag: \"cp:version\" }),\n \"cp:contentStatus\": new StringXform({ tag: \"cp:contentStatus\" }),\n \"cp:contentType\": new StringXform({ tag: \"cp:contentType\" }),\n \"dcterms:created\": new DateXform({\n tag: \"dcterms:created\",\n attrs: CoreXform.DateAttrs,\n format: CoreXform.DateFormat\n }),\n \"dcterms:modified\": new DateXform({\n tag: \"dcterms:modified\",\n attrs: CoreXform.DateAttrs,\n format: CoreXform.DateFormat\n })\n };\n }\n\n render(xmlStream: any, model: CoreModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"cp:coreProperties\", CoreXform.CORE_PROPERTY_ATTRIBUTES);\n\n this.map[\"dc:creator\"].render(xmlStream, model.creator);\n this.map[\"dc:title\"].render(xmlStream, model.title);\n this.map[\"dc:subject\"].render(xmlStream, model.subject);\n this.map[\"dc:description\"].render(xmlStream, model.description);\n this.map[\"dc:identifier\"].render(xmlStream, model.identifier);\n this.map[\"dc:language\"].render(xmlStream, model.language);\n this.map[\"cp:keywords\"].render(xmlStream, model.keywords);\n this.map[\"cp:category\"].render(xmlStream, model.category);\n this.map[\"cp:lastModifiedBy\"].render(xmlStream, model.lastModifiedBy);\n this.map[\"cp:lastPrinted\"].render(xmlStream, model.lastPrinted);\n this.map[\"cp:revision\"].render(xmlStream, model.revision);\n this.map[\"cp:version\"].render(xmlStream, model.version);\n this.map[\"cp:contentStatus\"].render(xmlStream, model.contentStatus);\n this.map[\"cp:contentType\"].render(xmlStream, model.contentType);\n this.map[\"dcterms:created\"].render(xmlStream, model.created);\n this.map[\"dcterms:modified\"].render(xmlStream, model.modified);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"cp:coreProperties\":\n case \"coreProperties\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"cp:coreProperties\":\n case \"coreProperties\":\n this.model = {\n creator: this.map[\"dc:creator\"].model,\n title: this.map[\"dc:title\"].model,\n subject: this.map[\"dc:subject\"].model,\n description: this.map[\"dc:description\"].model,\n identifier: this.map[\"dc:identifier\"].model,\n language: this.map[\"dc:language\"].model,\n keywords: this.map[\"cp:keywords\"].model,\n category: this.map[\"cp:category\"].model,\n lastModifiedBy: this.map[\"cp:lastModifiedBy\"].model,\n lastPrinted: this.map[\"cp:lastPrinted\"].model,\n revision: this.map[\"cp:revision\"].model,\n contentStatus: this.map[\"cp:contentStatus\"].model,\n contentType: this.map[\"cp:contentType\"].model,\n created: this.map[\"dcterms:created\"].model,\n modified: this.map[\"dcterms:modified\"].model\n };\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n\n static DateFormat = function (dt: Date): string {\n return dt.toISOString().replace(/[.]\\d{3}/, \"\");\n };\n\n static DateAttrs = { \"xsi:type\": \"dcterms:W3CDTF\" };\n\n static CORE_PROPERTY_ATTRIBUTES = {\n \"xmlns:cp\": \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\n \"xmlns:dc\": \"http://purl.org/dc/elements/1.1/\",\n \"xmlns:dcterms\": \"http://purl.org/dc/terms/\",\n \"xmlns:dcmitype\": \"http://purl.org/dc/dcmitype/\",\n \"xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\"\n };\n}\n\nexport { CoreXform };\n","import { BaseXform } from \"../base-xform\";\n\n// <t xml:space=\"preserve\"> is </t>\n\nclass TextXform extends BaseXform {\n declare private _text: string[];\n\n get tag(): string {\n return \"t\";\n }\n\n render(xmlStream: any, model: string): void {\n xmlStream.openNode(\"t\");\n if (/^\\s|\\n|\\s$/.test(model)) {\n xmlStream.addAttribute(\"xml:space\", \"preserve\");\n }\n xmlStream.writeText(model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"t\":\n this._text = [];\n this.model = \"\"; // Initialize model to empty string\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this._text.push(text);\n // Update model immediately after receiving text\n this.model = this._text\n .join(\"\")\n .replace(/_x([0-9A-F]{4})_/g, ($0, $1) => String.fromCharCode(parseInt($1, 16)));\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TextXform };\n","import { TextXform } from \"./text-xform\";\nimport { FontXform } from \"../style/font-xform\";\nimport { BaseXform } from \"../base-xform\";\n\n// <r>\n// <rPr>\n// <sz val=\"11\"/>\n// <color theme=\"1\" tint=\"5\"/>\n// <rFont val=\"Calibri\"/>\n// <family val=\"2\"/>\n// <scheme val=\"minor\"/>\n// </rPr>\n// <t xml:space=\"preserve\"> is </t>\n// </r>\n\ninterface RichTextModel {\n font?: any;\n text: string;\n}\n\nclass RichTextXform extends BaseXform {\n declare private _textXform?: TextXform;\n declare private _fontXform?: FontXform;\n declare public parser: any;\n\n constructor(model?: RichTextModel) {\n super();\n\n this.model = model;\n }\n\n get tag(): string {\n return \"r\";\n }\n\n get textXform(): TextXform {\n return this._textXform || (this._textXform = new TextXform());\n }\n\n get fontXform(): FontXform {\n return this._fontXform || (this._fontXform = new FontXform(RichTextXform.FONT_OPTIONS));\n }\n\n render(xmlStream: any, model?: RichTextModel): void {\n const renderModel = model || this.model;\n\n xmlStream.openNode(\"r\");\n if (renderModel!.font) {\n this.fontXform.render(xmlStream, renderModel!.font);\n }\n this.textXform.render(xmlStream, renderModel!.text);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"r\":\n this.model = {};\n return true;\n case \"t\":\n this.parser = this.textXform;\n this.parser.parseOpen(node);\n return true;\n case \"rPr\":\n this.parser = this.fontXform;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"r\":\n return false;\n case \"t\":\n this.model.text = this.parser.model;\n this.parser = undefined;\n return true;\n case \"rPr\":\n this.model.font = this.parser.model;\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n\n static FONT_OPTIONS = {\n tagName: \"rPr\",\n fontNameTag: \"rFont\"\n };\n}\n\nexport { RichTextXform };\n","import { TextXform } from \"./text-xform\";\nimport { RichTextXform } from \"./rich-text-xform\";\nimport { BaseXform } from \"../base-xform\";\n\n// <rPh sb=\"0\" eb=\"1\">\n// <t>(its pronounciation in KATAKANA)</t>\n// </rPh>\n\ninterface PhoneticTextModel {\n sb: number;\n eb: number;\n text?: string;\n richText?: any[];\n}\n\nclass PhoneticTextXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n r: new RichTextXform(),\n t: new TextXform()\n };\n }\n\n get tag(): string {\n return \"rPh\";\n }\n\n render(xmlStream: any, model: PhoneticTextModel): void {\n xmlStream.openNode(this.tag, {\n sb: model.sb || 0,\n eb: model.eb || 0\n });\n if (model && Object.prototype.hasOwnProperty.call(model, \"richText\") && model.richText) {\n const { r } = this.map;\n model.richText.forEach(text => {\n r.render(xmlStream, text);\n });\n } else if (model) {\n this.map.t.render(xmlStream, model.text);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name } = node;\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (name === this.tag) {\n this.model = {\n sb: parseInt(node.attributes.sb, 10),\n eb: parseInt(node.attributes.eb, 10)\n };\n return true;\n }\n this.parser = this.map[name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n switch (name) {\n case \"r\": {\n let rt = this.model.richText;\n if (!rt) {\n rt = this.model.richText = [];\n }\n rt.push(this.parser.model);\n break;\n }\n case \"t\":\n this.model.text = this.parser.model;\n break;\n default:\n break;\n }\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { PhoneticTextXform };\n","import { TextXform } from \"./text-xform\";\nimport { RichTextXform } from \"./rich-text-xform\";\nimport { PhoneticTextXform } from \"./phonetic-text-xform\";\nimport { BaseXform } from \"../base-xform\";\n\n// <si>\n// <r></r><r></r>...\n// </si>\n// <si>\n// <t></t>\n// </si>\n\ntype SharedStringModel = string | { richText: any[] };\n\nclass SharedStringXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor(model?: SharedStringModel) {\n super();\n\n this.model = model;\n\n this.map = {\n r: new RichTextXform(),\n t: new TextXform(),\n rPh: new PhoneticTextXform()\n };\n }\n\n get tag(): string {\n return \"si\";\n }\n\n render(xmlStream: any, model?: SharedStringModel): void {\n xmlStream.openNode(this.tag);\n if (\n model &&\n typeof model === \"object\" &&\n Object.prototype.hasOwnProperty.call(model, \"richText\") &&\n model.richText\n ) {\n if (model.richText.length) {\n model.richText.forEach(text => {\n this.map.r.render(xmlStream, text);\n });\n } else {\n this.map.t.render(xmlStream, \"\");\n }\n } else if (model !== undefined && model !== null) {\n this.map.t.render(xmlStream, model as string);\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name } = node;\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (name === this.tag) {\n this.model = {};\n return true;\n }\n this.parser = this.map[name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n switch (name) {\n case \"r\": {\n let rt = (this.model as any).richText;\n if (!rt) {\n rt = (this.model as any).richText = [];\n }\n rt.push(this.parser.model);\n break;\n }\n case \"t\":\n this.model = this.parser.model;\n break;\n default:\n break;\n }\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { SharedStringXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { SharedStringXform } from \"./shared-string-xform\";\n\ninterface SharedStringsModel {\n values: any[];\n count: number;\n}\n\nclass SharedStringsXform extends BaseXform {\n declare private hash: { [key: string]: number };\n declare private rich: { [key: string]: number };\n declare public parser: any;\n declare private _sharedStringXform?: SharedStringXform;\n declare private _values?: SharedStringsModel;\n\n constructor(model?: SharedStringsModel) {\n super();\n\n this.model = model || {\n values: [],\n count: 0\n };\n this.hash = Object.create(null);\n this.rich = Object.create(null);\n }\n\n get sharedStringXform(): SharedStringXform {\n return this._sharedStringXform || (this._sharedStringXform = new SharedStringXform());\n }\n\n get values(): any[] {\n return this.model.values;\n }\n\n get uniqueCount(): number {\n return this.model.values.length;\n }\n\n get count(): number {\n return this.model.count;\n }\n\n getString(index: number): any {\n return this.model.values[index];\n }\n\n add(value: any): number {\n return value.richText ? this.addRichText(value) : this.addText(value);\n }\n\n addText(value: string): number {\n let index = this.hash[value];\n if (index === undefined) {\n index = this.hash[value] = this.model.values.length;\n this.model.values.push(value);\n }\n this.model.count++;\n return index;\n }\n\n addRichText(value: any): number {\n // TODO: add WeakMap here\n const xml = this.sharedStringXform.toXml(value);\n let index = this.rich[xml];\n if (index === undefined) {\n index = this.rich[xml] = this.model.values.length;\n this.model.values.push(value);\n }\n this.model.count++;\n return index;\n }\n\n // <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n // <sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"<%=totalRefs%>\" uniqueCount=\"<%=count%>\">\n // <si><t><%=text%></t></si>\n // <si><r><rPr></rPr><t></t></r></si>\n // </sst>\n\n render(xmlStream: any, model?: SharedStringsModel): void {\n const renderModel = model || this._values;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"sst\", {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n count: renderModel!.count,\n uniqueCount: renderModel!.values.length\n });\n\n const sx = this.sharedStringXform;\n renderModel!.values.forEach(sharedString => {\n sx.render(xmlStream, sharedString);\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"sst\":\n return true;\n case \"si\":\n this.parser = this.sharedStringXform;\n this.parser.parseOpen(node);\n return true;\n default:\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.values.push(this.parser.model);\n this.model.count++;\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"sst\":\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n}\n\nexport { SharedStringsXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface RelationshipModel {\n Id?: string;\n Type?: string;\n Target?: string;\n TargetMode?: string;\n}\n\nclass RelationshipXform extends BaseXform {\n render(xmlStream: any, model: RelationshipModel): void {\n xmlStream.leafNode(\"Relationship\", model);\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"Relationship\":\n this.model = node.attributes;\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { RelationshipXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { RelationshipXform } from \"./relationship-xform\";\n\nclass RelationshipsXform extends BaseXform {\n declare public parser: any;\n declare private _values?: any[];\n\n constructor() {\n super();\n\n this.map = {\n Relationship: new RelationshipXform()\n };\n }\n\n render(xmlStream: any, model?: any[]): void {\n const renderModel = model || this._values;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"Relationships\", RelationshipsXform.RELATIONSHIPS_ATTRIBUTES);\n\n renderModel!.forEach(relationship => {\n this.map.Relationship.render(xmlStream, relationship);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"Relationships\":\n this.model = [];\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"Relationships\":\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n\n static RELATIONSHIPS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\"\n };\n}\n\nexport { RelationshipsXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\n\n// used for rendering the [Content_Types].xml file\n// not used for parsing\nclass ContentTypesXform extends BaseXform {\n render(xmlStream: any, model: any): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"Types\", ContentTypesXform.PROPERTY_ATTRIBUTES);\n\n const mediaHash: { [key: string]: boolean } = {};\n (model.media || []).forEach((medium: any) => {\n if (medium.type === \"image\") {\n const imageType = medium.extension;\n if (!mediaHash[imageType]) {\n mediaHash[imageType] = true;\n xmlStream.leafNode(\"Default\", {\n Extension: imageType,\n ContentType: `image/${imageType}`\n });\n }\n }\n });\n\n xmlStream.leafNode(\"Default\", {\n Extension: \"rels\",\n ContentType: \"application/vnd.openxmlformats-package.relationships+xml\"\n });\n xmlStream.leafNode(\"Default\", { Extension: \"xml\", ContentType: \"application/xml\" });\n\n xmlStream.leafNode(\"Override\", {\n PartName: \"/xl/workbook.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"\n });\n\n model.worksheets.forEach((worksheet: any, index: number) => {\n // Use fileIndex if set, otherwise use sequential index (1-based)\n const fileIndex = worksheet.fileIndex || index + 1;\n const name = `/xl/worksheets/sheet${fileIndex}.xml`;\n xmlStream.leafNode(\"Override\", {\n PartName: name,\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"\n });\n });\n\n if ((model.pivotTables || []).length) {\n // Add content types for each pivot table\n (model.pivotTables || []).forEach((pivotTable: any) => {\n const n = pivotTable.tableNumber;\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/pivotCache/pivotCacheDefinition${n}.xml`,\n ContentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/pivotCache/pivotCacheRecords${n}.xml`,\n ContentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/pivotTables/pivotTable${n}.xml`,\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\"\n });\n });\n }\n\n xmlStream.leafNode(\"Override\", {\n PartName: \"/xl/theme/theme1.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.theme+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: \"/xl/styles.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"\n });\n\n const hasSharedStrings = model.sharedStrings && model.sharedStrings.count;\n if (hasSharedStrings) {\n xmlStream.leafNode(\"Override\", {\n PartName: \"/xl/sharedStrings.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"\n });\n }\n\n if (model.tables) {\n model.tables.forEach((table: any) => {\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/tables/${table.target}`,\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\"\n });\n });\n }\n\n if (model.drawings) {\n model.drawings.forEach((drawing: any) => {\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/drawings/${drawing.name}.xml`,\n ContentType: \"application/vnd.openxmlformats-officedocument.drawing+xml\"\n });\n });\n }\n\n if (model.commentRefs) {\n xmlStream.leafNode(\"Default\", {\n Extension: \"vml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.vmlDrawing\"\n });\n\n model.commentRefs.forEach(({ commentName }: { commentName: string }) => {\n xmlStream.leafNode(\"Override\", {\n PartName: `/xl/${commentName}.xml`,\n ContentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"\n });\n });\n }\n\n xmlStream.leafNode(\"Override\", {\n PartName: \"/docProps/core.xml\",\n ContentType: \"application/vnd.openxmlformats-package.core-properties+xml\"\n });\n xmlStream.leafNode(\"Override\", {\n PartName: \"/docProps/app.xml\",\n ContentType: \"application/vnd.openxmlformats-officedocument.extended-properties+xml\"\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(): boolean {\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n static PROPERTY_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\"\n };\n}\n\nexport { ContentTypesXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass AppHeadingPairsXform extends BaseXform {\n render(xmlStream: any, model: any[]): void {\n xmlStream.openNode(\"HeadingPairs\");\n xmlStream.openNode(\"vt:vector\", { size: 2, baseType: \"variant\" });\n\n xmlStream.openNode(\"vt:variant\");\n xmlStream.leafNode(\"vt:lpstr\", undefined, \"Worksheets\");\n xmlStream.closeNode();\n\n xmlStream.openNode(\"vt:variant\");\n xmlStream.leafNode(\"vt:i4\", undefined, model.length);\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n // no parsing\n return node.name === \"HeadingPairs\";\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n return name !== \"HeadingPairs\";\n }\n}\n\nexport { AppHeadingPairsXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass AppTitlesOfPartsXform extends BaseXform {\n render(xmlStream: any, model: any[]): void {\n xmlStream.openNode(\"TitlesOfParts\");\n xmlStream.openNode(\"vt:vector\", { size: model.length, baseType: \"lpstr\" });\n\n model.forEach(sheet => {\n xmlStream.leafNode(\"vt:lpstr\", undefined, sheet.name);\n });\n\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n // no parsing\n return node.name === \"TitlesOfParts\";\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n return name !== \"TitlesOfParts\";\n }\n}\n\nexport { AppTitlesOfPartsXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { StringXform } from \"../simple/string-xform\";\nimport { AppHeadingPairsXform } from \"./app-heading-pairs-xform\";\nimport { AppTitlesOfPartsXform } from \"./app-titles-of-parts-xform\";\n\ninterface AppModel {\n worksheets: any[];\n company?: string;\n manager?: string;\n}\n\nclass AppXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n Company: new StringXform({ tag: \"Company\" }),\n Manager: new StringXform({ tag: \"Manager\" }),\n HeadingPairs: new AppHeadingPairsXform(),\n TitleOfParts: new AppTitlesOfPartsXform()\n };\n }\n\n render(xmlStream: any, model: AppModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n\n xmlStream.openNode(\"Properties\", AppXform.PROPERTY_ATTRIBUTES);\n\n xmlStream.leafNode(\"Application\", undefined, \"Microsoft Excel\");\n xmlStream.leafNode(\"DocSecurity\", undefined, \"0\");\n xmlStream.leafNode(\"ScaleCrop\", undefined, \"false\");\n\n this.map.HeadingPairs.render(xmlStream, model.worksheets);\n this.map.TitleOfParts.render(xmlStream, model.worksheets);\n this.map.Company.render(xmlStream, model.company || \"\");\n this.map.Manager.render(xmlStream, model.manager);\n\n xmlStream.leafNode(\"LinksUpToDate\", undefined, \"false\");\n xmlStream.leafNode(\"SharedDoc\", undefined, \"false\");\n xmlStream.leafNode(\"HyperlinksChanged\", undefined, \"false\");\n xmlStream.leafNode(\"AppVersion\", undefined, \"16.0300\");\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"Properties\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n // there's a lot we don't bother to parse\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"Properties\":\n this.model = {\n worksheets: this.map.TitleOfParts.model,\n company: this.map.Company.model,\n manager: this.map.Manager.model\n };\n return false;\n default:\n return true;\n }\n }\n\n static DateFormat = function (dt: Date): string {\n return dt.toISOString().replace(/[.]\\d{3,6}/, \"\");\n };\n\n static DateAttrs = { \"xsi:type\": \"dcterms:W3CDTF\" };\n\n static PROPERTY_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\",\n \"xmlns:vt\": \"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"\n };\n}\n\nexport { AppXform };\n","import { BaseXform } from \"../base-xform\";\nimport { colCache } from \"../../../utils/col-cache\";\n\ninterface DefinedNameModel {\n name: string;\n ranges: string[];\n localSheetId?: number;\n}\n\nclass DefinedNamesXform extends BaseXform {\n declare private _parsedName?: string;\n declare private _parsedLocalSheetId?: string;\n declare private _parsedText: string[];\n\n constructor() {\n super();\n this._parsedText = [];\n }\n\n render(xmlStream: any, model: DefinedNameModel): void {\n // <definedNames>\n // <definedName name=\"name\">name.ranges.join(',')</definedName>\n // <definedName name=\"_xlnm.Print_Area\" localSheetId=\"0\">name.ranges.join(',')</definedName>\n // </definedNames>\n xmlStream.openNode(\"definedName\", {\n name: model.name,\n localSheetId: model.localSheetId\n });\n xmlStream.writeText(model.ranges.join(\",\"));\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"definedName\":\n this._parsedName = node.attributes.name;\n this._parsedLocalSheetId = node.attributes.localSheetId;\n this._parsedText = [];\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this._parsedText.push(text);\n }\n\n parseClose(): boolean {\n this.model = {\n name: this._parsedName!,\n ranges: extractRanges(this._parsedText.join(\"\"))\n };\n if (this._parsedLocalSheetId !== undefined) {\n this.model.localSheetId = parseInt(this._parsedLocalSheetId, 10);\n }\n return false;\n }\n}\n\n// Regex to validate cell range format:\n// - Cell: $A$1 or A1\n// - Range: $A$1:$B$10 or A1:B10\n// - Row range: $1:$2 (for print titles)\n// - Column range: $A:$B (for print titles)\nconst cellRangeRegexp = /^[$]?[A-Za-z]{1,3}[$]?\\d+(:[$]?[A-Za-z]{1,3}[$]?\\d+)?$/;\nconst rowRangeRegexp = /^[$]?\\d+:[$]?\\d+$/;\nconst colRangeRegexp = /^[$]?[A-Za-z]{1,3}:[$]?[A-Za-z]{1,3}$/;\n\nfunction isValidRange(range: string): boolean {\n // Skip array constants wrapped in {} - these are not valid cell ranges\n // e.g., {\"'Sheet1'!$A$1:$B$10\"} or {#N/A,#N/A,FALSE,\"text\"}\n if (range.startsWith(\"{\") || range.endsWith(\"}\")) {\n return false;\n }\n\n // Extract the cell reference part (after the sheet name if present)\n const cellRef = range.split(\"!\").pop() || \"\";\n\n // Must match one of the valid patterns\n if (\n !cellRangeRegexp.test(cellRef) &&\n !rowRangeRegexp.test(cellRef) &&\n !colRangeRegexp.test(cellRef)\n ) {\n return false;\n }\n\n try {\n const decoded = colCache.decodeEx(range);\n // For cell ranges: row/col or top/bottom/left/right should be valid numbers\n // For row ranges ($1:$2): top/bottom are numbers, left/right are null\n // For column ranges ($A:$B): left/right are numbers, top/bottom are null\n if (\n (\"row\" in decoded && typeof decoded.row === \"number\") ||\n (\"top\" in decoded && typeof decoded.top === \"number\") ||\n (\"left\" in decoded && typeof decoded.left === \"number\")\n ) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction extractRanges(parsedText: string): string[] {\n // Skip if the entire text is wrapped in {} (array constant)\n const trimmed = parsedText.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return [];\n }\n\n const ranges: string[] = [];\n let quotesOpened = false;\n let last = \"\";\n parsedText.split(\",\").forEach(item => {\n if (!item) {\n return;\n }\n const quotes = (item.match(/'/g) || []).length;\n\n if (!quotes) {\n if (quotesOpened) {\n last += `${item},`;\n } else if (isValidRange(item)) {\n ranges.push(item);\n }\n return;\n }\n const quotesEven = quotes % 2 === 0;\n\n if (!quotesOpened && quotesEven && isValidRange(item)) {\n ranges.push(item);\n } else if (quotesOpened && !quotesEven) {\n quotesOpened = false;\n if (isValidRange(last + item)) {\n ranges.push(last + item);\n }\n last = \"\";\n } else {\n quotesOpened = true;\n last += `${item},`;\n }\n });\n return ranges;\n}\n\nexport { DefinedNamesXform };\n","import { xmlDecode } from \"../../../utils/utils\";\nimport { BaseXform } from \"../base-xform\";\n\ninterface SheetModel {\n id: number;\n name: string;\n state?: string;\n rId: string;\n}\n\nclass WorksheetXform extends BaseXform {\n render(xmlStream: any, model: SheetModel): void {\n xmlStream.leafNode(\"sheet\", {\n sheetId: model.id,\n name: model.name,\n state: model.state,\n \"r:id\": model.rId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"sheet\") {\n this.model = {\n name: xmlDecode(node.attributes.name),\n id: parseInt(node.attributes.sheetId, 10),\n state: node.attributes.state,\n rId: node.attributes[\"r:id\"]\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorksheetXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface WorkbookViewModel {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n firstSheet?: number;\n activeTab?: number;\n visibility?: string;\n}\n\nclass WorkbookViewXform extends BaseXform {\n render(xmlStream: any, model: WorkbookViewModel): void {\n const attributes: any = {\n xWindow: model.x || 0,\n yWindow: model.y || 0,\n windowWidth: model.width || 12000,\n windowHeight: model.height || 24000,\n firstSheet: model.firstSheet,\n activeTab: model.activeTab\n };\n if (model.visibility && model.visibility !== \"visible\") {\n attributes.visibility = model.visibility;\n }\n xmlStream.leafNode(\"workbookView\", attributes);\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"workbookView\") {\n const model: any = (this.model = {});\n const addS = function (\n name: string,\n value: string | undefined,\n dflt: string | undefined\n ): void {\n const s = value !== undefined ? value : dflt;\n model[name] = s;\n };\n const addN = function (\n name: string,\n value: string | undefined,\n dflt: number | undefined\n ): void {\n const n = value !== undefined ? parseInt(value, 10) : dflt;\n if (n !== undefined) {\n model[name] = n;\n }\n };\n addN(\"x\", node.attributes.xWindow, 0);\n addN(\"y\", node.attributes.yWindow, 0);\n addN(\"width\", node.attributes.windowWidth, 25000);\n addN(\"height\", node.attributes.windowHeight, 10000);\n addS(\"visibility\", node.attributes.visibility, \"visible\");\n addN(\"activeTab\", node.attributes.activeTab, undefined);\n addN(\"firstSheet\", node.attributes.firstSheet, undefined);\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookViewXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface WorkbookPropertiesModel {\n date1904?: boolean;\n}\n\nclass WorkbookPropertiesXform extends BaseXform {\n render(xmlStream: any, model: WorkbookPropertiesModel): void {\n xmlStream.leafNode(\"workbookPr\", {\n date1904: model.date1904 ? 1 : undefined,\n defaultThemeVersion: 164011,\n filterPrivacy: 1\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"workbookPr\") {\n this.model = {\n date1904: node.attributes.date1904 === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookPropertiesXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface CalcPropertiesModel {\n fullCalcOnLoad?: boolean;\n}\n\nclass WorkbookCalcPropertiesXform extends BaseXform {\n render(xmlStream: any, model: CalcPropertiesModel): void {\n xmlStream.leafNode(\"calcPr\", {\n calcId: 171027,\n fullCalcOnLoad: model.fullCalcOnLoad ? 1 : undefined\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"calcPr\") {\n this.model = {};\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookCalcPropertiesXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface PivotCacheModel {\n cacheId: string;\n rId: string;\n}\n\nclass WorkbookPivotCacheXform extends BaseXform {\n render(xmlStream: any, model: PivotCacheModel): void {\n xmlStream.leafNode(\"pivotCache\", {\n cacheId: model.cacheId,\n \"r:id\": model.rId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"pivotCache\") {\n this.model = {\n cacheId: node.attributes.cacheId,\n rId: node.attributes[\"r:id\"]\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { WorkbookPivotCacheXform };\n","import { colCache } from \"../../../utils/col-cache\";\nimport { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { StaticXform } from \"../static-xform\";\nimport { ListXform } from \"../list-xform\";\nimport { DefinedNamesXform } from \"./defined-name-xform\";\nimport { WorksheetXform } from \"./sheet-xform\";\nimport { WorkbookViewXform } from \"./workbook-view-xform\";\nimport { WorkbookPropertiesXform } from \"./workbook-properties-xform\";\nimport { WorkbookCalcPropertiesXform } from \"./workbook-calc-properties-xform\";\nimport { WorkbookPivotCacheXform } from \"./workbook-pivot-cache-xform\";\n\nclass WorkbookXform extends BaseXform {\n declare public parser: any;\n\n constructor() {\n super();\n\n this.map = {\n fileVersion: WorkbookXform.STATIC_XFORMS.fileVersion,\n workbookPr: new WorkbookPropertiesXform(),\n bookViews: new ListXform({\n tag: \"bookViews\",\n count: false,\n childXform: new WorkbookViewXform()\n }),\n sheets: new ListXform({ tag: \"sheets\", count: false, childXform: new WorksheetXform() }),\n definedNames: new ListXform({\n tag: \"definedNames\",\n count: false,\n childXform: new DefinedNamesXform()\n }),\n calcPr: new WorkbookCalcPropertiesXform(),\n pivotCaches: new ListXform({\n tag: \"pivotCaches\",\n count: false,\n childXform: new WorkbookPivotCacheXform()\n })\n };\n }\n\n prepare(model: any): void {\n model.sheets = model.worksheets;\n\n // collate all the print areas from all of the sheets and add them to the defined names\n const printAreas: any[] = [];\n let index = 0; // sheets is sparse array - calc index manually\n model.sheets.forEach((sheet: any) => {\n if (sheet.pageSetup && sheet.pageSetup.printArea) {\n sheet.pageSetup.printArea.split(\"&&\").forEach((printArea: string) => {\n const printAreaComponents = printArea.split(\":\");\n const definedName = {\n name: \"_xlnm.Print_Area\",\n ranges: [`'${sheet.name}'!$${printAreaComponents[0]}:$${printAreaComponents[1]}`],\n localSheetId: index\n };\n printAreas.push(definedName);\n });\n }\n\n if (\n sheet.pageSetup &&\n (sheet.pageSetup.printTitlesRow || sheet.pageSetup.printTitlesColumn)\n ) {\n const ranges: string[] = [];\n\n if (sheet.pageSetup.printTitlesColumn) {\n const titlesColumns = sheet.pageSetup.printTitlesColumn.split(\":\");\n ranges.push(`'${sheet.name}'!$${titlesColumns[0]}:$${titlesColumns[1]}`);\n }\n\n if (sheet.pageSetup.printTitlesRow) {\n const titlesRows = sheet.pageSetup.printTitlesRow.split(\":\");\n ranges.push(`'${sheet.name}'!$${titlesRows[0]}:$${titlesRows[1]}`);\n }\n\n const definedName = {\n name: \"_xlnm.Print_Titles\",\n ranges,\n localSheetId: index\n };\n\n printAreas.push(definedName);\n }\n index++;\n });\n if (printAreas.length) {\n model.definedNames = model.definedNames.concat(printAreas);\n }\n\n (model.media || []).forEach((medium: any, i: number) => {\n // assign name\n medium.name = medium.type + (i + 1);\n });\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"workbook\", WorkbookXform.WORKBOOK_ATTRIBUTES);\n\n this.map.fileVersion.render(xmlStream);\n this.map.workbookPr.render(xmlStream, model.properties);\n this.map.bookViews.render(xmlStream, model.views);\n this.map.sheets.render(xmlStream, model.sheets);\n this.map.definedNames.render(xmlStream, model.definedNames);\n this.map.calcPr.render(xmlStream, model.calcProperties);\n this.map.pivotCaches.render(xmlStream, model.pivotTables);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"workbook\":\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n return true;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"workbook\":\n this.model = {\n sheets: this.map.sheets.model,\n properties: this.map.workbookPr.model || {},\n views: this.map.bookViews.model,\n calcProperties: {}\n };\n if (this.map.definedNames.model) {\n this.model.definedNames = this.map.definedNames.model;\n }\n if (this.map.pivotCaches.model && this.map.pivotCaches.model.length > 0) {\n this.model.pivotCaches = this.map.pivotCaches.model;\n }\n\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n reconcile(model: any): void {\n const rels = (model.workbookRels || []).reduce((map: any, rel: any) => {\n map[rel.Id] = rel;\n return map;\n }, {});\n\n // reconcile sheet ids, rIds and names\n const worksheets: any[] = [];\n let worksheet: any;\n let index = 0;\n\n (model.sheets || []).forEach((sheet: any) => {\n const rel = rels[sheet.rId];\n if (!rel) {\n return;\n }\n // if rel.Target start with `[space]/xl/` or `/xl/` , then it will be replaced with `''` and spliced behind `xl/`,\n // otherwise it will be spliced directly behind `xl/`. i.g.\n worksheet = model.worksheetHash[`xl/${rel.Target.replace(/^(\\s|\\/xl\\/)+/, \"\")}`];\n // If there are \"chartsheets\" in the file, rel.Target will\n // come out as chartsheets/sheet1.xml or similar here, and\n // that won't be in model.worksheetHash.\n // As we don't have the infrastructure to support chartsheets,\n // we will ignore them for now:\n if (worksheet) {\n worksheet.name = sheet.name;\n worksheet.id = sheet.id;\n worksheet.state = sheet.state;\n worksheets[index++] = worksheet;\n }\n });\n\n // reconcile print areas\n const definedNames: any[] = [];\n if (model.definedNames) {\n model.definedNames.forEach((definedName: any) => {\n if (definedName.name === \"_xlnm.Print_Area\") {\n worksheet = worksheets[definedName.localSheetId];\n if (worksheet) {\n if (!worksheet.pageSetup) {\n worksheet.pageSetup = {};\n }\n const range: any = colCache.decodeEx(definedName.ranges[0]);\n worksheet.pageSetup.printArea = worksheet.pageSetup.printArea\n ? `${worksheet.pageSetup.printArea}&&${range.dimensions}`\n : range.dimensions;\n }\n } else if (definedName.name === \"_xlnm.Print_Titles\") {\n worksheet = worksheets[definedName.localSheetId];\n if (worksheet) {\n if (!worksheet.pageSetup) {\n worksheet.pageSetup = {};\n }\n\n const rangeString = definedName.ranges.join(\",\");\n\n const dollarRegex = /\\$/g;\n\n const rowRangeRegex = /\\$\\d+:\\$\\d+/;\n const rowRangeMatches = rangeString.match(rowRangeRegex);\n\n if (rowRangeMatches && rowRangeMatches.length) {\n const range = rowRangeMatches[0];\n worksheet.pageSetup.printTitlesRow = range.replace(dollarRegex, \"\");\n }\n\n const columnRangeRegex = /\\$[A-Z]+:\\$[A-Z]+/;\n const columnRangeMatches = rangeString.match(columnRangeRegex);\n\n if (columnRangeMatches && columnRangeMatches.length) {\n const range = columnRangeMatches[0];\n worksheet.pageSetup.printTitlesColumn = range.replace(dollarRegex, \"\");\n }\n }\n } else {\n definedNames.push(definedName);\n }\n });\n }\n model.definedNames = definedNames;\n\n // used by sheets to build their image models\n model.media.forEach((media: any, i: number) => {\n media.index = i;\n });\n }\n\n static WORKBOOK_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"x15\",\n \"xmlns:x15\": \"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"\n };\n\n static STATIC_XFORMS = {\n fileVersion: new StaticXform({\n tag: \"fileVersion\",\n $: { appName: \"xl\", lastEdited: 5, lowestEdited: 5, rupBuild: 9303 }\n })\n };\n}\n\nexport { WorkbookXform };\n","const RelType = {\n OfficeDocument:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n Worksheet: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n CalcChain: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n SharedStrings:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n Styles: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n Theme: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n Hyperlink: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n Image: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n CoreProperties:\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n ExtenderProperties:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n Comments: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n VmlDrawing: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n Table: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n PivotCacheDefinition:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n PivotCacheRecords:\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords\",\n PivotTable: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\"\n};\n\nexport { RelType };\n","import { Range } from \"../../../doc/range\";\nimport { colCache } from \"../../../utils/col-cache\";\nimport { Enums } from \"../../../doc/enums\";\n\ninterface MergeData {\n address: string;\n master: string;\n}\n\nclass Merges {\n declare private merges: { [key: string]: Range };\n declare private hash?: { [key: string]: Range };\n\n constructor() {\n // optional mergeCells is array of ranges (like the xml)\n this.merges = {};\n }\n\n add(merge: MergeData): void {\n // merge is {address, master}\n if (this.merges[merge.master]) {\n this.merges[merge.master].expandToAddress(merge.address);\n } else {\n const range = `${merge.master}:${merge.address}`;\n this.merges[merge.master] = new Range(range);\n }\n }\n\n get mergeCells(): string[] {\n return Object.values(this.merges).map((merge: Range) => merge.range);\n }\n\n reconcile(mergeCells: string[], rows: any[]): void {\n // reconcile merge list with merge cells\n mergeCells.forEach((merge: string) => {\n const dimensions: any = colCache.decode(merge);\n for (let i = dimensions.top; i <= dimensions.bottom; i++) {\n const row = rows[i - 1];\n for (let j = dimensions.left; j <= dimensions.right; j++) {\n const cell = row.cells[j - 1];\n if (!cell) {\n // nulls are not included in document - so if master cell has no value - add a null one here\n row.cells[j] = {\n type: Enums.ValueType.Null,\n address: colCache.encodeAddress(i, j)\n };\n } else if (cell.type === Enums.ValueType.Merge) {\n cell.master = dimensions.tl;\n }\n }\n }\n });\n }\n\n getMasterAddress(address: string): string | undefined {\n // if address has been merged, return its master's address. Assumes reconcile has been called\n const range = this.hash![address];\n return range && range.tl;\n }\n}\n\nexport { Merges };\n","import { dateToExcel, xmlDecode, isDateFmt, excelToDate } from \"../../../utils/utils\";\nimport { BaseXform } from \"../base-xform\";\nimport { Range } from \"../../../doc/range\";\nimport { Enums } from \"../../../doc/enums\";\nimport { RichTextXform } from \"../strings/rich-text-xform\";\n\nfunction getValueType(v) {\n if (v === null || v === undefined) {\n return Enums.ValueType.Null;\n }\n if (v instanceof String || typeof v === \"string\") {\n return Enums.ValueType.String;\n }\n if (typeof v === \"number\") {\n return Enums.ValueType.Number;\n }\n if (typeof v === \"boolean\") {\n return Enums.ValueType.Boolean;\n }\n if (v instanceof Date) {\n return Enums.ValueType.Date;\n }\n if (v.text && v.hyperlink) {\n return Enums.ValueType.Hyperlink;\n }\n if (v.formula) {\n return Enums.ValueType.Formula;\n }\n if (v.error) {\n return Enums.ValueType.Error;\n }\n throw new Error(\"I could not understand type of value\");\n}\n\nfunction getEffectiveCellType(cell) {\n switch (cell.type) {\n case Enums.ValueType.Formula:\n return getValueType(cell.result);\n default:\n return cell.type;\n }\n}\n\nclass CellXform extends BaseXform {\n declare private richTextXform: any;\n declare public parser: any;\n declare private t: any;\n declare private currentNode: any;\n\n constructor() {\n super();\n\n this.richTextXform = new RichTextXform();\n }\n\n get tag() {\n return \"c\";\n }\n\n prepare(model, options) {\n const styleId = options.styles.addStyleModel(model.style || {}, getEffectiveCellType(model));\n if (styleId) {\n model.styleId = styleId;\n }\n\n if (model.comment) {\n options.comments.push({ ...model.comment, ref: model.address });\n }\n\n switch (model.type) {\n case Enums.ValueType.String:\n case Enums.ValueType.RichText:\n if (options.sharedStrings) {\n model.ssId = options.sharedStrings.add(model.value);\n }\n break;\n\n case Enums.ValueType.Date:\n if (options.date1904) {\n model.date1904 = true;\n }\n break;\n\n case Enums.ValueType.Hyperlink:\n if (options.sharedStrings && model.text !== undefined && model.text !== null) {\n model.ssId = options.sharedStrings.add(model.text);\n }\n options.hyperlinks.push({\n address: model.address,\n target: model.hyperlink,\n tooltip: model.tooltip\n });\n break;\n\n case Enums.ValueType.Merge:\n options.merges.add(model);\n break;\n\n case Enums.ValueType.Formula:\n if (options.date1904) {\n // in case valueType is date\n model.date1904 = true;\n }\n\n if (model.shareType === \"shared\") {\n model.si = options.siFormulae++;\n }\n\n if (model.formula) {\n options.formulae[model.address] = model;\n } else if (model.sharedFormula) {\n const master = options.formulae[model.sharedFormula];\n if (!master) {\n throw new Error(\n `Shared Formula master must exist above and or left of clone for cell ${model.address}`\n );\n }\n if (master.si === undefined) {\n master.shareType = \"shared\";\n master.si = options.siFormulae++;\n master.range = new Range(master.address, model.address);\n } else if (master.range) {\n master.range.expandToAddress(model.address);\n }\n model.si = master.si;\n }\n break;\n\n default:\n break;\n }\n }\n\n renderFormula(xmlStream, model) {\n let attrs = null;\n switch (model.shareType) {\n case \"shared\":\n attrs = {\n t: \"shared\",\n ref: model.ref || model.range.range,\n si: model.si\n };\n break;\n\n case \"array\":\n attrs = {\n t: \"array\",\n ref: model.ref\n };\n break;\n\n default:\n if (model.si !== undefined) {\n attrs = {\n t: \"shared\",\n si: model.si\n };\n }\n break;\n }\n\n switch (getValueType(model.result)) {\n case Enums.ValueType.Null: // ?\n xmlStream.leafNode(\"f\", attrs, model.formula);\n break;\n\n case Enums.ValueType.String:\n // oddly, formula results don't ever use shared strings\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result);\n break;\n\n case Enums.ValueType.Number:\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result);\n break;\n\n case Enums.ValueType.Boolean:\n xmlStream.addAttribute(\"t\", \"b\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result ? 1 : 0);\n break;\n\n case Enums.ValueType.Error:\n xmlStream.addAttribute(\"t\", \"e\");\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, model.result.error);\n break;\n\n case Enums.ValueType.Date:\n xmlStream.leafNode(\"f\", attrs, model.formula);\n xmlStream.leafNode(\"v\", null, dateToExcel(model.result, model.date1904));\n break;\n\n // case Enums.ValueType.Hyperlink: // ??\n // case Enums.ValueType.Formula:\n default:\n throw new Error(\"I could not understand type of value\");\n }\n }\n\n render(xmlStream, model) {\n if (model.type === Enums.ValueType.Null && !model.styleId) {\n // if null and no style, exit\n return;\n }\n\n xmlStream.openNode(\"c\");\n xmlStream.addAttribute(\"r\", model.address);\n\n if (model.styleId) {\n xmlStream.addAttribute(\"s\", model.styleId);\n }\n\n switch (model.type) {\n case Enums.ValueType.Null:\n break;\n\n case Enums.ValueType.Number:\n xmlStream.leafNode(\"v\", null, model.value);\n break;\n\n case Enums.ValueType.Boolean:\n xmlStream.addAttribute(\"t\", \"b\");\n xmlStream.leafNode(\"v\", null, model.value ? \"1\" : \"0\");\n break;\n\n case Enums.ValueType.Error:\n xmlStream.addAttribute(\"t\", \"e\");\n xmlStream.leafNode(\"v\", null, model.value.error);\n break;\n\n case Enums.ValueType.String:\n case Enums.ValueType.RichText:\n if (model.ssId !== undefined) {\n xmlStream.addAttribute(\"t\", \"s\");\n xmlStream.leafNode(\"v\", null, model.ssId);\n } else if (model.value && model.value.richText) {\n xmlStream.addAttribute(\"t\", \"inlineStr\");\n xmlStream.openNode(\"is\");\n model.value.richText.forEach(text => {\n this.richTextXform.render(xmlStream, text);\n });\n xmlStream.closeNode(\"is\");\n } else {\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"v\", null, model.value);\n }\n break;\n\n case Enums.ValueType.Date:\n xmlStream.leafNode(\"v\", null, dateToExcel(model.value, model.date1904));\n break;\n\n case Enums.ValueType.Hyperlink:\n if (model.ssId !== undefined) {\n xmlStream.addAttribute(\"t\", \"s\");\n xmlStream.leafNode(\"v\", null, model.ssId);\n } else {\n xmlStream.addAttribute(\"t\", \"str\");\n xmlStream.leafNode(\"v\", null, model.text);\n }\n break;\n\n case Enums.ValueType.Formula:\n this.renderFormula(xmlStream, model);\n break;\n\n case Enums.ValueType.Merge:\n // nothing to add\n break;\n\n default:\n break;\n }\n\n xmlStream.closeNode(); // </c>\n }\n\n parseOpen(node) {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"c\":\n // const address = colCache.decodeAddress(node.attributes.r);\n this.model = {\n address: node.attributes.r\n };\n this.t = node.attributes.t;\n if (node.attributes.s) {\n this.model.styleId = parseInt(node.attributes.s, 10);\n }\n return true;\n\n case \"f\":\n this.currentNode = \"f\";\n this.model.si = node.attributes.si;\n this.model.shareType = node.attributes.t;\n this.model.ref = node.attributes.ref;\n return true;\n\n case \"v\":\n this.currentNode = \"v\";\n return true;\n\n case \"t\":\n this.currentNode = \"t\";\n return true;\n\n case \"r\":\n this.parser = this.richTextXform;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text) {\n if (this.parser) {\n this.parser.parseText(text);\n return;\n }\n switch (this.currentNode) {\n case \"f\":\n this.model.formula = this.model.formula ? this.model.formula + text : text;\n break;\n case \"v\":\n case \"t\":\n if (this.model.value && this.model.value.richText) {\n this.model.value.richText.text = this.model.value.richText.text\n ? this.model.value.richText.text + text\n : text;\n } else {\n this.model.value = this.model.value ? this.model.value + text : text;\n }\n break;\n default:\n break;\n }\n }\n\n parseClose(name) {\n switch (name) {\n case \"c\": {\n const { model } = this;\n\n // first guess on cell type\n if (model.formula || model.shareType) {\n model.type = Enums.ValueType.Formula;\n if (model.value) {\n if (this.t === \"str\") {\n model.result = xmlDecode(model.value);\n } else if (this.t === \"b\") {\n model.result = parseInt(model.value, 10) !== 0;\n } else if (this.t === \"e\") {\n model.result = { error: model.value };\n } else {\n model.result = parseFloat(model.value);\n }\n model.value = undefined;\n }\n } else if (model.value !== undefined) {\n switch (this.t) {\n case \"s\":\n model.type = Enums.ValueType.String;\n model.value = parseInt(model.value, 10);\n break;\n case \"str\":\n model.type = Enums.ValueType.String;\n model.value = xmlDecode(model.value);\n break;\n case \"inlineStr\":\n model.type = Enums.ValueType.String;\n break;\n case \"b\":\n model.type = Enums.ValueType.Boolean;\n model.value = parseInt(model.value, 10) !== 0;\n break;\n case \"e\":\n model.type = Enums.ValueType.Error;\n model.value = { error: model.value };\n break;\n case \"d\":\n // Strict OpenXML format stores dates as ISO strings with t=\"d\"\n // See: https://www.loc.gov/preservation/digital/formats/fdd/fdd000401.shtml\n model.type = Enums.ValueType.Date;\n model.value = new Date(model.value);\n break;\n default:\n model.type = Enums.ValueType.Number;\n model.value = parseFloat(model.value);\n break;\n }\n } else if (model.styleId) {\n model.type = Enums.ValueType.Null;\n } else {\n model.type = Enums.ValueType.Merge;\n }\n return false;\n }\n\n case \"f\":\n case \"v\":\n case \"is\":\n this.currentNode = undefined;\n return true;\n\n case \"t\":\n if (this.parser) {\n this.parser.parseClose(name);\n return true;\n }\n this.currentNode = undefined;\n return true;\n\n case \"r\":\n this.model.value = this.model.value || {};\n this.model.value.richText = this.model.value.richText || [];\n this.model.value.richText.push(this.parser.model);\n this.parser = undefined;\n this.currentNode = undefined;\n return true;\n\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n return true;\n }\n return false;\n }\n }\n\n reconcile(model, options) {\n const style = model.styleId && options.styles && options.styles.getStyleModel(model.styleId);\n if (style) {\n model.style = style;\n }\n if (model.styleId !== undefined) {\n model.styleId = undefined;\n }\n\n switch (model.type) {\n case Enums.ValueType.String:\n if (typeof model.value === \"number\") {\n if (options.sharedStrings) {\n model.value = options.sharedStrings.getString(model.value);\n }\n }\n if (model.value.richText) {\n model.type = Enums.ValueType.RichText;\n }\n break;\n\n case Enums.ValueType.Number:\n if (style && isDateFmt(style.numFmt)) {\n model.type = Enums.ValueType.Date;\n model.value = excelToDate(model.value, options.date1904);\n }\n break;\n\n case Enums.ValueType.Formula:\n // Only convert formula result to date if the result is a number\n // String results (t=\"str\") should not be converted even if the cell has a date format\n if (\n model.result !== undefined &&\n typeof model.result === \"number\" &&\n style &&\n isDateFmt(style.numFmt)\n ) {\n model.result = excelToDate(model.result, options.date1904);\n }\n if (model.shareType === \"shared\") {\n if (model.ref) {\n // master\n options.formulae[model.si] = model.address;\n } else {\n // slave\n model.sharedFormula = options.formulae[model.si];\n delete model.shareType;\n }\n delete model.si;\n }\n break;\n\n default:\n break;\n }\n\n // look for hyperlink\n const hyperlink = options.hyperlinkMap[model.address];\n if (hyperlink) {\n if (model.type === Enums.ValueType.Formula) {\n model.text = model.result;\n model.result = undefined;\n } else {\n model.text = model.value;\n model.value = undefined;\n }\n model.type = Enums.ValueType.Hyperlink;\n model.hyperlink = hyperlink;\n }\n\n const comment = options.commentsMap && options.commentsMap[model.address];\n if (comment) {\n model.comment = comment;\n }\n }\n}\n\nexport { CellXform };\n","import { BaseXform } from \"../base-xform\";\nimport { CellXform } from \"./cell-xform\";\nimport { parseBoolean } from \"../../../utils/utils\";\nimport { colCache } from \"../../../utils/col-cache\";\n\ninterface RowXformOptions {\n maxItems?: number;\n}\n\ninterface RowModel {\n number: number;\n min?: number;\n max?: number;\n cells: any[];\n styleId?: number;\n hidden?: boolean;\n bestFit?: boolean;\n height?: number;\n outlineLevel?: number;\n collapsed?: boolean;\n style?: any;\n}\n\nclass RowXform extends BaseXform {\n declare private maxItems?: number;\n declare public map: { [key: string]: any };\n declare public model: RowModel;\n declare public parser: any;\n declare private numRowsSeen: number;\n declare private lastCellCol: number;\n\n constructor(options?: RowXformOptions) {\n super();\n\n this.maxItems = options && options.maxItems;\n this.map = {\n c: new CellXform()\n };\n }\n\n get tag(): string {\n return \"row\";\n }\n\n reset(): void {\n super.reset();\n this.numRowsSeen = 0;\n this.lastCellCol = 0;\n }\n\n prepare(model: RowModel, options: any): void {\n const styleId = options.styles.addStyleModel(model.style);\n if (styleId) {\n model.styleId = styleId;\n }\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.prepare(cellModel, options);\n });\n }\n\n render(xmlStream: any, model?: RowModel, options?: any): void {\n if (!model) {\n return;\n }\n xmlStream.openNode(\"row\");\n xmlStream.addAttribute(\"r\", model.number);\n if (model.height) {\n xmlStream.addAttribute(\"ht\", model.height);\n xmlStream.addAttribute(\"customHeight\", \"1\");\n }\n if (model.hidden) {\n xmlStream.addAttribute(\"hidden\", \"1\");\n }\n if (model.min! > 0 && model.max! > 0 && model.min! <= model.max!) {\n xmlStream.addAttribute(\"spans\", `${model.min}:${model.max}`);\n }\n if (model.styleId) {\n xmlStream.addAttribute(\"s\", model.styleId);\n xmlStream.addAttribute(\"customFormat\", \"1\");\n }\n xmlStream.addAttribute(\"x14ac:dyDescent\", \"0.25\");\n if (model.outlineLevel) {\n xmlStream.addAttribute(\"outlineLevel\", model.outlineLevel);\n }\n if (model.collapsed) {\n xmlStream.addAttribute(\"collapsed\", \"1\");\n }\n\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.render(xmlStream, cellModel, options);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (node.name === \"row\") {\n this.numRowsSeen += 1;\n // Reset lastCellCol for each new row\n this.lastCellCol = 0;\n const spans = node.attributes.spans\n ? node.attributes.spans.split(\":\").map((span: string) => parseInt(span, 10))\n : [undefined, undefined];\n // If r attribute is missing, use numRowsSeen as the row number\n const rowNumber = node.attributes.r ? parseInt(node.attributes.r, 10) : this.numRowsSeen;\n const model: RowModel = (this.model = {\n number: rowNumber,\n min: spans[0],\n max: spans[1],\n cells: []\n });\n if (node.attributes.s) {\n model.styleId = parseInt(node.attributes.s, 10);\n }\n if (parseBoolean(node.attributes.hidden)) {\n model.hidden = true;\n }\n if (parseBoolean(node.attributes.bestFit)) {\n model.bestFit = true;\n }\n if (node.attributes.ht) {\n model.height = parseFloat(node.attributes.ht);\n }\n if (node.attributes.outlineLevel) {\n model.outlineLevel = parseInt(node.attributes.outlineLevel, 10);\n }\n if (parseBoolean(node.attributes.collapsed)) {\n model.collapsed = true;\n }\n return true;\n }\n\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n const cellModel = this.parser.model;\n // If cell has address, extract column number from it\n // Otherwise, calculate address based on position\n if (cellModel.address) {\n const decoded = colCache.decodeAddress(cellModel.address);\n this.lastCellCol = decoded.col;\n } else {\n // No r attribute, calculate address from position\n this.lastCellCol += 1;\n cellModel.address = colCache.encodeAddress(this.model.number, this.lastCellCol);\n }\n this.model.cells.push(cellModel);\n if (this.maxItems && this.model.cells.length > this.maxItems) {\n throw new Error(`Max column count (${this.maxItems}) exceeded`);\n }\n this.parser = undefined;\n }\n return true;\n }\n return false;\n }\n\n reconcile(model: RowModel, options: any): void {\n model.style = model.styleId ? options.styles.getStyleModel(model.styleId) : {};\n if (model.styleId !== undefined) {\n model.styleId = undefined;\n }\n\n const cellXform = this.map.c;\n model.cells.forEach((cellModel: any) => {\n cellXform.reconcile(cellModel, options);\n });\n }\n}\n\nexport { RowXform };\n","import { BaseXform } from \"../base-xform\";\nimport { parseBoolean } from \"../../../utils/utils\";\n\ninterface ColModel {\n min: number;\n max: number;\n width?: number;\n styleId?: number;\n hidden?: boolean;\n bestFit?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n style?: any;\n}\n\nclass ColXform extends BaseXform {\n get tag(): string {\n return \"col\";\n }\n\n prepare(model: ColModel, options: any): void {\n const styleId = options.styles.addStyleModel(model.style || {});\n if (styleId) {\n model.styleId = styleId;\n }\n }\n\n render(xmlStream: any, model: ColModel): void {\n xmlStream.openNode(\"col\");\n xmlStream.addAttribute(\"min\", model.min);\n xmlStream.addAttribute(\"max\", model.max);\n if (model.width) {\n xmlStream.addAttribute(\"width\", model.width);\n }\n if (model.styleId) {\n xmlStream.addAttribute(\"style\", model.styleId);\n }\n if (model.hidden) {\n xmlStream.addAttribute(\"hidden\", \"1\");\n }\n if (model.bestFit) {\n xmlStream.addAttribute(\"bestFit\", \"1\");\n }\n if (model.outlineLevel) {\n xmlStream.addAttribute(\"outlineLevel\", model.outlineLevel);\n }\n if (model.collapsed) {\n xmlStream.addAttribute(\"collapsed\", \"1\");\n }\n xmlStream.addAttribute(\"customWidth\", \"1\");\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"col\") {\n const model: ColModel = (this.model = {\n min: parseInt(node.attributes.min || \"0\", 10),\n max: parseInt(node.attributes.max || \"0\", 10),\n width:\n node.attributes.width === undefined ? undefined : parseFloat(node.attributes.width || \"0\")\n });\n if (node.attributes.style) {\n model.styleId = parseInt(node.attributes.style, 10);\n }\n if (parseBoolean(node.attributes.hidden)) {\n model.hidden = true;\n }\n if (parseBoolean(node.attributes.bestFit)) {\n model.bestFit = true;\n }\n if (node.attributes.outlineLevel) {\n model.outlineLevel = parseInt(node.attributes.outlineLevel, 10);\n }\n if (parseBoolean(node.attributes.collapsed)) {\n model.collapsed = true;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n reconcile(model: ColModel, options: any): void {\n // reconcile column styles\n if (model.styleId) {\n model.style = options.styles.getStyleModel(model.styleId);\n }\n }\n}\n\nexport { ColXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass DimensionXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"dimension\";\n }\n\n render(xmlStream: any, model: any): void {\n if (model) {\n xmlStream.leafNode(\"dimension\", { ref: model });\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"dimension\") {\n this.model = node.attributes.ref;\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { DimensionXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface HyperlinkModel {\n address: string;\n rId: string;\n tooltip?: string;\n target?: string;\n}\n\nclass HyperlinkXform extends BaseXform {\n get tag(): string {\n return \"hyperlink\";\n }\n\n render(xmlStream: any, model: HyperlinkModel): void {\n if (this.isInternalLink(model)) {\n xmlStream.leafNode(\"hyperlink\", {\n ref: model.address,\n \"r:id\": model.rId,\n tooltip: model.tooltip,\n location: model.target\n });\n } else {\n xmlStream.leafNode(\"hyperlink\", {\n ref: model.address,\n \"r:id\": model.rId,\n tooltip: model.tooltip\n });\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"hyperlink\") {\n this.model = {\n address: node.attributes.ref,\n rId: node.attributes[\"r:id\"],\n tooltip: node.attributes.tooltip\n };\n\n // This is an internal link\n if (node.attributes.location) {\n this.model.target = node.attributes.location;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n\n isInternalLink(model: HyperlinkModel): boolean {\n // @example: Sheet2!D3, return true\n return !!(model.target && /^[^!]+![a-zA-Z]+[\\d]+$/.test(model.target));\n }\n}\n\nexport { HyperlinkXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass MergeCellXform extends BaseXform {\n get tag(): string {\n return \"mergeCell\";\n }\n\n render(xmlStream: any, model: string): void {\n xmlStream.leafNode(\"mergeCell\", { ref: model });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"mergeCell\") {\n this.model = node.attributes.ref;\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { MergeCellXform };\n","import { BaseXform } from \"../base-xform\";\nimport { Range } from \"../../../doc/range\";\nimport { parseBoolean, dateToExcel, excelToDate } from \"../../../utils/utils\";\nimport { colCache } from \"../../../utils/col-cache\";\nimport { isEqual } from \"../../../utils/under-dash\";\n\nfunction assign(definedName: any, attributes: any, name: string, defaultValue?: any): void {\n const value = attributes[name];\n if (value !== undefined) {\n definedName[name] = value;\n } else if (defaultValue !== undefined) {\n definedName[name] = defaultValue;\n }\n}\n\nfunction assignBool(definedName: any, attributes: any, name: string, defaultValue?: any): void {\n const value = attributes[name];\n if (value !== undefined) {\n definedName[name] = parseBoolean(value);\n } else if (defaultValue !== undefined) {\n definedName[name] = defaultValue;\n }\n}\n\nfunction optimiseDataValidations(model: any): any[] {\n // Squeeze alike data validations together into rectangular ranges\n // to reduce file size and speed up Excel load time\n if (!model) {\n return [];\n }\n\n // First, handle range: prefixed keys directly (large ranges stored during parsing)\n const rangeValidations: any[] = [];\n const regularModel: any = {};\n\n for (const [key, value] of Object.entries(model)) {\n // Skip undefined/null values (removed validations)\n if (value === undefined || value === null) {\n continue;\n }\n if (key.startsWith(\"range:\")) {\n // Large range stored during parsing - output directly\n const rangeStr = key.slice(6); // Remove \"range:\" prefix\n const { sqref: _sqref, ...rest } = value as any;\n rangeValidations.push({\n ...rest,\n sqref: rangeStr\n });\n } else {\n regularModel[key] = value;\n }\n }\n\n // If no regular entries, just return range validations\n if (Object.keys(regularModel).length === 0) {\n return rangeValidations;\n }\n\n const dvList = Object.entries(regularModel)\n .map(([address, dataValidation]: [string, any]) => ({\n address,\n dataValidation,\n marked: false\n }))\n .sort((a: any, b: any) => a.address.localeCompare(b.address));\n const dvMap = Object.fromEntries(dvList.map(dv => [dv.address, dv]));\n const matchCol = (addr: any, height: number, col: number): boolean => {\n for (let i = 0; i < height; i++) {\n const otherAddress = colCache.encodeAddress(addr.row + i, col);\n if (\n !regularModel[otherAddress] ||\n !isEqual(regularModel[addr.address], regularModel[otherAddress])\n ) {\n return false;\n }\n }\n return true;\n };\n const optimized = dvList\n .map(dv => {\n if (!dv.marked) {\n const addr: any = colCache.decodeEx(dv.address);\n if (addr.dimensions) {\n dvMap[addr.dimensions].marked = true;\n return {\n ...dv.dataValidation,\n sqref: dv.address\n };\n }\n\n // iterate downwards - finding matching cells\n let height = 1;\n let otherAddress = colCache.encodeAddress(addr.row + height, addr.col);\n while (\n regularModel[otherAddress] &&\n isEqual(dv.dataValidation, regularModel[otherAddress])\n ) {\n height++;\n otherAddress = colCache.encodeAddress(addr.row + height, addr.col);\n }\n\n // iterate rightwards...\n\n let width = 1;\n while (matchCol(addr, height, addr.col + width)) {\n width++;\n }\n\n // mark all included addresses\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n otherAddress = colCache.encodeAddress(addr.row + i, addr.col + j);\n dvMap[otherAddress].marked = true;\n }\n }\n\n if (height > 1 || width > 1) {\n const bottom = addr.row + (height - 1);\n const right = addr.col + (width - 1);\n return {\n ...dv.dataValidation,\n sqref: `${dv.address}:${colCache.encodeAddress(bottom, right)}`\n };\n }\n return {\n ...dv.dataValidation,\n sqref: dv.address\n };\n }\n return null;\n })\n .filter(Boolean);\n\n return [...rangeValidations, ...optimized];\n}\n\nclass DataValidationsXform extends BaseXform {\n declare private _address: string;\n declare private _dataValidation: any;\n declare private _formula: string[];\n\n get tag(): string {\n return \"dataValidations\";\n }\n\n render(xmlStream: any, model: any): void {\n const optimizedModel = optimiseDataValidations(model);\n if (optimizedModel.length) {\n xmlStream.openNode(\"dataValidations\", { count: optimizedModel.length });\n\n optimizedModel.forEach((value: any) => {\n xmlStream.openNode(\"dataValidation\");\n\n if (value.type !== \"any\") {\n xmlStream.addAttribute(\"type\", value.type);\n\n if (value.operator && value.type !== \"list\" && value.operator !== \"between\") {\n xmlStream.addAttribute(\"operator\", value.operator);\n }\n if (value.allowBlank) {\n xmlStream.addAttribute(\"allowBlank\", \"1\");\n }\n }\n if (value.showInputMessage) {\n xmlStream.addAttribute(\"showInputMessage\", \"1\");\n }\n if (value.promptTitle) {\n xmlStream.addAttribute(\"promptTitle\", value.promptTitle);\n }\n if (value.prompt) {\n xmlStream.addAttribute(\"prompt\", value.prompt);\n }\n if (value.showErrorMessage) {\n xmlStream.addAttribute(\"showErrorMessage\", \"1\");\n }\n if (value.errorStyle) {\n xmlStream.addAttribute(\"errorStyle\", value.errorStyle);\n }\n if (value.errorTitle) {\n xmlStream.addAttribute(\"errorTitle\", value.errorTitle);\n }\n if (value.error) {\n xmlStream.addAttribute(\"error\", value.error);\n }\n xmlStream.addAttribute(\"sqref\", value.sqref);\n (value.formulae || []).forEach((formula: any, index: number) => {\n xmlStream.openNode(`formula${index + 1}`);\n if (value.type === \"date\") {\n xmlStream.writeText(dateToExcel(new Date(formula)));\n } else {\n xmlStream.writeText(formula);\n }\n xmlStream.closeNode();\n });\n xmlStream.closeNode();\n });\n xmlStream.closeNode();\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"dataValidations\":\n this.model = {};\n return true;\n\n case \"dataValidation\": {\n this._address = node.attributes.sqref;\n const dataValidation: any = { type: node.attributes.type || \"any\", formulae: [] };\n\n if (node.attributes.type) {\n assignBool(dataValidation, node.attributes, \"allowBlank\");\n }\n assignBool(dataValidation, node.attributes, \"showInputMessage\");\n assignBool(dataValidation, node.attributes, \"showErrorMessage\");\n\n switch (dataValidation.type) {\n case \"any\":\n case \"list\":\n case \"custom\":\n break;\n default:\n assign(dataValidation, node.attributes, \"operator\", \"between\");\n break;\n }\n assign(dataValidation, node.attributes, \"promptTitle\");\n assign(dataValidation, node.attributes, \"prompt\");\n assign(dataValidation, node.attributes, \"errorStyle\");\n assign(dataValidation, node.attributes, \"errorTitle\");\n assign(dataValidation, node.attributes, \"error\");\n\n this._dataValidation = dataValidation;\n return true;\n }\n\n case \"formula1\":\n case \"formula2\":\n this._formula = [];\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this._formula) {\n this._formula.push(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"dataValidations\":\n return false;\n case \"dataValidation\": {\n if (!this._dataValidation.formulae || !this._dataValidation.formulae.length) {\n delete this._dataValidation.formulae;\n delete this._dataValidation.operator;\n }\n // The four known cases: 1. E4:L9 N4:U9 2.E4 L9 3. N4:U9 4. E4\n const list = this._address.split(/\\s+/g) || [];\n list.forEach((addr: string) => {\n if (addr.includes(\":\")) {\n const range = new Range(addr);\n // Only expand small ranges to avoid performance issues with large ranges\n // like B2:B1048576 (entire column validations)\n const rangeSize = (range.bottom - range.top + 1) * (range.right - range.left + 1);\n if (rangeSize <= 1000) {\n // Small range: expand to individual cells for backward compatibility\n range.forEachAddress((address: string) => {\n this.model[address] = this._dataValidation;\n });\n } else {\n // Large range: store as range string with special marker\n // The key format \"range:A1:Z100\" allows DataValidations.find() to detect it\n this.model[`range:${addr}`] = this._dataValidation;\n }\n } else {\n this.model[addr] = this._dataValidation;\n }\n });\n return true;\n }\n case \"formula1\":\n case \"formula2\": {\n let formula: any = this._formula.join(\"\");\n switch (this._dataValidation.type) {\n case \"whole\":\n case \"textLength\":\n formula = parseInt(formula, 10);\n break;\n case \"decimal\":\n formula = parseFloat(formula);\n break;\n case \"date\":\n formula = excelToDate(parseFloat(formula));\n break;\n default:\n break;\n }\n this._dataValidation.formulae.push(formula);\n this._formula = undefined as any;\n return true;\n }\n default:\n return true;\n }\n }\n}\n\nexport { DataValidationsXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface PageSetupPropertiesModel {\n fitToPage: boolean;\n}\n\nclass PageSetupPropertiesXform extends BaseXform {\n get tag(): string {\n return \"pageSetUpPr\";\n }\n\n render(xmlStream: any, model?: PageSetupPropertiesModel): boolean {\n if (model && model.fitToPage) {\n xmlStream.leafNode(this.tag, {\n fitToPage: model.fitToPage ? \"1\" : undefined\n });\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n fitToPage: node.attributes.fitToPage === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageSetupPropertiesXform };\n","import { BaseXform } from \"../base-xform\";\n\nconst isDefined = (attr: any): boolean => typeof attr !== \"undefined\";\n\ninterface OutlinePropertiesModel {\n summaryBelow?: boolean;\n summaryRight?: boolean;\n}\n\nclass OutlinePropertiesXform extends BaseXform {\n get tag(): string {\n return \"outlinePr\";\n }\n\n render(xmlStream: any, model?: OutlinePropertiesModel): boolean {\n if (model && (isDefined(model.summaryBelow) || isDefined(model.summaryRight))) {\n xmlStream.leafNode(this.tag, {\n summaryBelow: isDefined(model.summaryBelow) ? Number(model.summaryBelow) : undefined,\n summaryRight: isDefined(model.summaryRight) ? Number(model.summaryRight) : undefined\n });\n return true;\n }\n return false;\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n summaryBelow: isDefined(node.attributes.summaryBelow)\n ? Boolean(Number(node.attributes.summaryBelow))\n : undefined,\n summaryRight: isDefined(node.attributes.summaryRight)\n ? Boolean(Number(node.attributes.summaryRight))\n : undefined\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { OutlinePropertiesXform };\n","import { BaseXform } from \"../base-xform\";\nimport { ColorXform } from \"../style/color-xform\";\nimport { PageSetupPropertiesXform } from \"./page-setup-properties-xform\";\nimport { OutlinePropertiesXform } from \"./outline-properties-xform\";\n\ninterface SheetPropertiesModel {\n tabColor?: any;\n pageSetup?: any;\n outlineProperties?: any;\n}\n\nclass SheetPropertiesXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser?: any;\n\n constructor() {\n super();\n\n this.map = {\n tabColor: new ColorXform(\"tabColor\"),\n pageSetUpPr: new PageSetupPropertiesXform(),\n outlinePr: new OutlinePropertiesXform()\n };\n }\n\n get tag(): string {\n return \"sheetPr\";\n }\n\n render(xmlStream: any, model?: SheetPropertiesModel): void {\n if (model) {\n xmlStream.addRollback();\n xmlStream.openNode(\"sheetPr\");\n\n let inner = false;\n inner = this.map.tabColor.render(xmlStream, model.tabColor) || inner;\n inner = this.map.pageSetUpPr.render(xmlStream, model.pageSetup) || inner;\n inner = this.map.outlinePr.render(xmlStream, model.outlineProperties) || inner;\n\n if (inner) {\n xmlStream.closeNode();\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n if (node.name === this.tag) {\n this.reset();\n return true;\n }\n if (this.map[node.name]) {\n this.parser = this.map[node.name];\n this.parser.parseOpen(node);\n return true;\n }\n return false;\n }\n\n parseText(text: string): boolean {\n if (this.parser) {\n this.parser.parseText(text);\n return true;\n }\n return false;\n }\n\n parseClose(_name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(_name)) {\n this.parser = undefined;\n }\n return true;\n }\n if (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model) {\n this.model = {};\n if (this.map.tabColor.model) {\n this.model.tabColor = this.map.tabColor.model;\n }\n if (this.map.pageSetUpPr.model) {\n this.model.pageSetup = this.map.pageSetUpPr.model;\n }\n if (this.map.outlinePr.model) {\n this.model.outlineProperties = this.map.outlinePr.model;\n }\n } else {\n this.model = null;\n }\n return false;\n }\n}\n\nexport { SheetPropertiesXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface SheetFormatPropertiesModel {\n defaultRowHeight: number;\n dyDescent: number;\n outlineLevelRow: number;\n outlineLevelCol: number;\n defaultColWidth?: number;\n}\n\nclass SheetFormatPropertiesXform extends BaseXform {\n get tag(): string {\n return \"sheetFormatPr\";\n }\n\n render(xmlStream: any, model?: SheetFormatPropertiesModel): void {\n if (model) {\n const attributes: any = {\n defaultRowHeight: model.defaultRowHeight,\n outlineLevelRow: model.outlineLevelRow,\n outlineLevelCol: model.outlineLevelCol,\n \"x14ac:dyDescent\": model.dyDescent\n };\n if (model.defaultColWidth) {\n attributes.defaultColWidth = model.defaultColWidth;\n }\n\n // default value for 'defaultRowHeight' is 15, this should not be 'custom'\n if (!model.defaultRowHeight || model.defaultRowHeight !== 15) {\n attributes.customHeight = \"1\";\n }\n\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(\"sheetFormatPr\", attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"sheetFormatPr\") {\n this.model = {\n defaultRowHeight: parseFloat(node.attributes.defaultRowHeight || \"0\"),\n dyDescent: parseFloat(node.attributes[\"x14ac:dyDescent\"] || \"0\"),\n outlineLevelRow: parseInt(node.attributes.outlineLevelRow || \"0\", 10),\n outlineLevelCol: parseInt(node.attributes.outlineLevelCol || \"0\", 10)\n };\n if (node.attributes.defaultColWidth) {\n this.model.defaultColWidth = parseFloat(node.attributes.defaultColWidth);\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { SheetFormatPropertiesXform };\n","import { colCache } from \"../../../utils/col-cache\";\nimport { BaseXform } from \"../base-xform\";\n\nconst VIEW_STATES: { [key: string]: string } = {\n frozen: \"frozen\",\n frozenSplit: \"frozen\",\n split: \"split\"\n};\n\ninterface SheetViewModel {\n workbookViewId?: number;\n rightToLeft?: boolean;\n tabSelected?: boolean;\n showRuler?: boolean;\n showRowColHeaders?: boolean;\n showGridLines?: boolean;\n zoomScale?: number;\n zoomScaleNormal?: number;\n style?: string;\n state?: string;\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n activePane?: string;\n activeCell?: string;\n}\n\nclass SheetViewXform extends BaseXform {\n declare public model: SheetViewModel;\n declare private sheetView: any;\n declare private pane: any;\n declare private selections: any;\n\n get tag(): string {\n return \"sheetView\";\n }\n\n prepare(model: SheetViewModel): void {\n switch (model.state) {\n case \"frozen\":\n case \"split\":\n break;\n default:\n model.state = \"normal\";\n break;\n }\n }\n\n render(xmlStream: any, model: SheetViewModel): void {\n xmlStream.openNode(\"sheetView\", {\n workbookViewId: model.workbookViewId || 0\n });\n const add = function (name: string, value: any, included: any): void {\n if (included) {\n xmlStream.addAttribute(name, value);\n }\n };\n add(\"rightToLeft\", \"1\", model.rightToLeft === true);\n add(\"tabSelected\", \"1\", model.tabSelected);\n add(\"showRuler\", \"0\", model.showRuler === false);\n add(\"showRowColHeaders\", \"0\", model.showRowColHeaders === false);\n add(\"showGridLines\", \"0\", model.showGridLines === false);\n add(\"zoomScale\", model.zoomScale, model.zoomScale);\n add(\"zoomScaleNormal\", model.zoomScaleNormal, model.zoomScaleNormal);\n add(\"view\", model.style, model.style);\n\n let topLeftCell;\n let xSplit;\n let ySplit;\n let activePane;\n switch (model.state) {\n case \"frozen\":\n xSplit = model.xSplit || 0;\n ySplit = model.ySplit || 0;\n topLeftCell = model.topLeftCell || colCache.getAddress(ySplit + 1, xSplit + 1).address;\n activePane =\n (model.xSplit && model.ySplit && \"bottomRight\") ||\n (model.xSplit && \"topRight\") ||\n \"bottomLeft\";\n\n xmlStream.leafNode(\"pane\", {\n xSplit: model.xSplit || undefined,\n ySplit: model.ySplit || undefined,\n topLeftCell,\n activePane,\n state: \"frozen\"\n });\n xmlStream.leafNode(\"selection\", {\n pane: activePane,\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n break;\n case \"split\":\n if (model.activePane === \"topLeft\") {\n model.activePane = undefined;\n }\n xmlStream.leafNode(\"pane\", {\n xSplit: model.xSplit || undefined,\n ySplit: model.ySplit || undefined,\n topLeftCell: model.topLeftCell,\n activePane: model.activePane\n });\n xmlStream.leafNode(\"selection\", {\n pane: model.activePane,\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n break;\n case \"normal\":\n if (model.activeCell) {\n xmlStream.leafNode(\"selection\", {\n activeCell: model.activeCell,\n sqref: model.activeCell\n });\n }\n break;\n default:\n break;\n }\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"sheetView\":\n this.sheetView = {\n workbookViewId: parseInt(node.attributes.workbookViewId, 10),\n rightToLeft: node.attributes.rightToLeft === \"1\",\n tabSelected: node.attributes.tabSelected === \"1\",\n showRuler: !(node.attributes.showRuler === \"0\"),\n showRowColHeaders: !(node.attributes.showRowColHeaders === \"0\"),\n showGridLines: !(node.attributes.showGridLines === \"0\"),\n zoomScale: parseInt(node.attributes.zoomScale || \"100\", 10),\n zoomScaleNormal: parseInt(node.attributes.zoomScaleNormal || \"100\", 10),\n style: node.attributes.view\n };\n this.pane = undefined;\n this.selections = {};\n return true;\n\n case \"pane\":\n this.pane = {\n xSplit: parseInt(node.attributes.xSplit || \"0\", 10),\n ySplit: parseInt(node.attributes.ySplit || \"0\", 10),\n topLeftCell: node.attributes.topLeftCell,\n activePane: node.attributes.activePane || \"topLeft\",\n state: node.attributes.state\n };\n return true;\n\n case \"selection\": {\n const name = node.attributes.pane || \"topLeft\";\n this.selections[name] = {\n pane: name,\n activeCell: node.attributes.activeCell\n };\n return true;\n }\n\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n let model;\n let selection;\n switch (name) {\n case \"sheetView\":\n if (this.sheetView && this.pane) {\n model = this.model = {\n workbookViewId: this.sheetView.workbookViewId,\n rightToLeft: this.sheetView.rightToLeft,\n state: VIEW_STATES[this.pane.state] || \"split\", // split is default\n xSplit: this.pane.xSplit,\n ySplit: this.pane.ySplit,\n topLeftCell: this.pane.topLeftCell,\n showRuler: this.sheetView.showRuler,\n showRowColHeaders: this.sheetView.showRowColHeaders,\n showGridLines: this.sheetView.showGridLines,\n zoomScale: this.sheetView.zoomScale,\n zoomScaleNormal: this.sheetView.zoomScaleNormal\n };\n if (this.model.state === \"split\") {\n model.activePane = this.pane.activePane;\n }\n selection = this.selections[this.pane.activePane];\n if (selection && selection.activeCell) {\n model.activeCell = selection.activeCell;\n }\n if (this.sheetView.style) {\n model.style = this.sheetView.style;\n }\n } else {\n model = this.model = {\n workbookViewId: this.sheetView.workbookViewId,\n rightToLeft: this.sheetView.rightToLeft,\n state: \"normal\",\n showRuler: this.sheetView.showRuler,\n showRowColHeaders: this.sheetView.showRowColHeaders,\n showGridLines: this.sheetView.showGridLines,\n zoomScale: this.sheetView.zoomScale,\n zoomScaleNormal: this.sheetView.zoomScaleNormal\n };\n selection = this.selections.topLeft;\n if (selection && selection.activeCell) {\n model.activeCell = selection.activeCell;\n }\n if (this.sheetView.style) {\n model.style = this.sheetView.style;\n }\n }\n return false;\n default:\n return true;\n }\n }\n\n reconcile(): void {}\n}\n\nexport { SheetViewXform };\n","import { BaseXform } from \"../base-xform\";\n\nfunction booleanToXml(model: boolean, value: string): string | undefined {\n return model ? value : undefined;\n}\n\nfunction xmlToBoolean(value: string, equals: string): boolean | undefined {\n return value === equals ? true : undefined;\n}\n\ninterface SheetProtectionModel {\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n selectLockedCells?: boolean;\n selectUnlockedCells?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\nclass SheetProtectionXform extends BaseXform {\n get tag(): string {\n return \"sheetProtection\";\n }\n\n render(xmlStream: any, model?: SheetProtectionModel): void {\n if (model) {\n const attributes: any = {\n sheet: booleanToXml(model.sheet!, \"1\"),\n selectLockedCells: model.selectLockedCells === false ? \"1\" : undefined,\n selectUnlockedCells: model.selectUnlockedCells === false ? \"1\" : undefined,\n formatCells: booleanToXml(model.formatCells!, \"0\"),\n formatColumns: booleanToXml(model.formatColumns!, \"0\"),\n formatRows: booleanToXml(model.formatRows!, \"0\"),\n insertColumns: booleanToXml(model.insertColumns!, \"0\"),\n insertRows: booleanToXml(model.insertRows!, \"0\"),\n insertHyperlinks: booleanToXml(model.insertHyperlinks!, \"0\"),\n deleteColumns: booleanToXml(model.deleteColumns!, \"0\"),\n deleteRows: booleanToXml(model.deleteRows!, \"0\"),\n sort: booleanToXml(model.sort!, \"0\"),\n autoFilter: booleanToXml(model.autoFilter!, \"0\"),\n pivotTables: booleanToXml(model.pivotTables!, \"0\")\n };\n if (model.sheet) {\n attributes.algorithmName = model.algorithmName;\n attributes.hashValue = model.hashValue;\n attributes.saltValue = model.saltValue;\n attributes.spinCount = model.spinCount;\n attributes.objects = booleanToXml(model.objects === false, \"1\");\n attributes.scenarios = booleanToXml(model.scenarios === false, \"1\");\n }\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n sheet: xmlToBoolean(node.attributes.sheet, \"1\"),\n objects: node.attributes.objects === \"1\" ? false : undefined,\n scenarios: node.attributes.scenarios === \"1\" ? false : undefined,\n selectLockedCells: node.attributes.selectLockedCells === \"1\" ? false : undefined,\n selectUnlockedCells: node.attributes.selectUnlockedCells === \"1\" ? false : undefined,\n formatCells: xmlToBoolean(node.attributes.formatCells, \"0\"),\n formatColumns: xmlToBoolean(node.attributes.formatColumns, \"0\"),\n formatRows: xmlToBoolean(node.attributes.formatRows, \"0\"),\n insertColumns: xmlToBoolean(node.attributes.insertColumns, \"0\"),\n insertRows: xmlToBoolean(node.attributes.insertRows, \"0\"),\n insertHyperlinks: xmlToBoolean(node.attributes.insertHyperlinks, \"0\"),\n deleteColumns: xmlToBoolean(node.attributes.deleteColumns, \"0\"),\n deleteRows: xmlToBoolean(node.attributes.deleteRows, \"0\"),\n sort: xmlToBoolean(node.attributes.sort, \"0\"),\n autoFilter: xmlToBoolean(node.attributes.autoFilter, \"0\"),\n pivotTables: xmlToBoolean(node.attributes.pivotTables, \"0\")\n };\n if (node.attributes.algorithmName) {\n this.model.algorithmName = node.attributes.algorithmName;\n this.model.hashValue = node.attributes.hashValue;\n this.model.saltValue = node.attributes.saltValue;\n this.model.spinCount = parseInt(node.attributes.spinCount, 10);\n }\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { SheetProtectionXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface PageMarginsModel {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n header?: number;\n footer?: number;\n}\n\nclass PageMarginsXform extends BaseXform {\n get tag(): string {\n return \"pageMargins\";\n }\n\n render(xmlStream: any, model: PageMarginsModel): void {\n if (model) {\n const attributes = {\n left: model.left,\n right: model.right,\n top: model.top,\n bottom: model.bottom,\n header: model.header,\n footer: model.footer\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n left: parseFloat(node.attributes.left || 0.7),\n right: parseFloat(node.attributes.right || 0.7),\n top: parseFloat(node.attributes.top || 0.75),\n bottom: parseFloat(node.attributes.bottom || 0.75),\n header: parseFloat(node.attributes.header || 0.3),\n footer: parseFloat(node.attributes.footer || 0.3)\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageMarginsXform };\n","import { BaseXform } from \"../base-xform\";\n\nfunction booleanToXml(model: boolean): string | undefined {\n return model ? \"1\" : undefined;\n}\nfunction pageOrderToXml(model: string): string | undefined {\n switch (model) {\n case \"overThenDown\":\n return model;\n default:\n return undefined;\n }\n}\nfunction cellCommentsToXml(model: string): string | undefined {\n switch (model) {\n case \"atEnd\":\n case \"asDisplyed\":\n return model;\n default:\n return undefined;\n }\n}\nfunction errorsToXml(model: string): string | undefined {\n switch (model) {\n case \"dash\":\n case \"blank\":\n case \"NA\":\n return model;\n default:\n return undefined;\n }\n}\nfunction pageSizeToModel(value: string): number | undefined {\n return value !== undefined ? parseInt(value, 10) : undefined;\n}\n\ninterface PageSetupModel {\n paperSize?: number;\n orientation?: string;\n horizontalDpi?: number;\n verticalDpi?: number;\n pageOrder?: string;\n blackAndWhite?: boolean;\n draft?: boolean;\n cellComments?: string;\n errors?: string;\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n firstPageNumber?: number;\n useFirstPageNumber?: boolean;\n usePrinterDefaults?: boolean;\n copies?: number;\n}\n\nclass PageSetupXform extends BaseXform {\n get tag(): string {\n return \"pageSetup\";\n }\n\n render(xmlStream: any, model: PageSetupModel): void {\n if (model) {\n const attributes = {\n paperSize: model.paperSize,\n orientation: model.orientation,\n horizontalDpi: model.horizontalDpi,\n verticalDpi: model.verticalDpi,\n pageOrder: pageOrderToXml(model.pageOrder!),\n blackAndWhite: booleanToXml(model.blackAndWhite!),\n draft: booleanToXml(model.draft!),\n cellComments: cellCommentsToXml(model.cellComments!),\n errors: errorsToXml(model.errors!),\n scale: model.scale,\n fitToWidth: model.fitToWidth,\n fitToHeight: model.fitToHeight,\n firstPageNumber: model.firstPageNumber,\n useFirstPageNumber: booleanToXml(!!model.firstPageNumber),\n usePrinterDefaults: booleanToXml(model.usePrinterDefaults!),\n copies: model.copies\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n paperSize: pageSizeToModel(node.attributes.paperSize),\n orientation: node.attributes.orientation || \"portrait\",\n horizontalDpi: parseInt(node.attributes.horizontalDpi || \"4294967295\", 10),\n verticalDpi: parseInt(node.attributes.verticalDpi || \"4294967295\", 10),\n pageOrder: node.attributes.pageOrder || \"downThenOver\",\n blackAndWhite: node.attributes.blackAndWhite === \"1\",\n draft: node.attributes.draft === \"1\",\n cellComments: node.attributes.cellComments || \"None\",\n errors: node.attributes.errors || \"displayed\",\n scale: parseInt(node.attributes.scale || \"100\", 10),\n fitToWidth: parseInt(node.attributes.fitToWidth || \"1\", 10),\n fitToHeight: parseInt(node.attributes.fitToHeight || \"1\", 10),\n firstPageNumber: parseInt(node.attributes.firstPageNumber || \"1\", 10),\n useFirstPageNumber: node.attributes.useFirstPageNumber === \"1\",\n usePrinterDefaults: node.attributes.usePrinterDefaults === \"1\",\n copies: parseInt(node.attributes.copies || \"1\", 10)\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageSetupXform };\n","import { BaseXform } from \"../base-xform\";\n\nfunction booleanToXml(model: boolean): string | undefined {\n return model ? \"1\" : undefined;\n}\n\ninterface PrintOptionsModel {\n showRowColHeaders: boolean;\n showGridLines: boolean;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n}\n\nclass PrintOptionsXform extends BaseXform {\n get tag(): string {\n return \"printOptions\";\n }\n\n render(xmlStream: any, model?: PrintOptionsModel): void {\n if (model) {\n const attributes = {\n headings: booleanToXml(model.showRowColHeaders),\n gridLines: booleanToXml(model.showGridLines),\n horizontalCentered: booleanToXml(model.horizontalCentered),\n verticalCentered: booleanToXml(model.verticalCentered)\n };\n if (Object.values(attributes).some((value: any) => value !== undefined)) {\n xmlStream.leafNode(this.tag, attributes);\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n showRowColHeaders: node.attributes.headings === \"1\",\n showGridLines: node.attributes.gridLines === \"1\",\n horizontalCentered: node.attributes.horizontalCentered === \"1\",\n verticalCentered: node.attributes.verticalCentered === \"1\"\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PrintOptionsXform };\n","import { colCache } from \"../../../utils/col-cache\";\nimport { BaseXform } from \"../base-xform\";\n\nclass AutoFilterXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"autoFilter\";\n }\n\n render(xmlStream: any, model: any): void {\n if (model) {\n if (typeof model === \"string\") {\n // assume range\n xmlStream.leafNode(\"autoFilter\", { ref: model });\n } else {\n const getAddress = function (addr: any): string {\n if (typeof addr === \"string\") {\n return addr;\n }\n return colCache.getAddress(addr.row, addr.column).address;\n };\n\n const firstAddress = getAddress(model.from);\n const secondAddress = getAddress(model.to);\n if (firstAddress && secondAddress) {\n xmlStream.leafNode(\"autoFilter\", { ref: `${firstAddress}:${secondAddress}` });\n }\n }\n }\n }\n\n parseOpen(node: any): void {\n if (node.name === \"autoFilter\") {\n this.model = node.attributes.ref;\n }\n }\n}\n\nexport { AutoFilterXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface PictureModel {\n rId: string;\n}\n\nclass PictureXform extends BaseXform {\n get tag(): string {\n return \"picture\";\n }\n\n render(xmlStream: any, model?: PictureModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PictureXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface DrawingModel {\n rId: string;\n}\n\nclass DrawingXform extends BaseXform {\n get tag(): string {\n return \"drawing\";\n }\n\n render(xmlStream: any, model?: DrawingModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { DrawingXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface TablePartModel {\n rId: string;\n}\n\nclass TablePartXform extends BaseXform {\n get tag(): string {\n return \"tablePart\";\n }\n\n render(xmlStream: any, model?: TablePartModel): void {\n if (model) {\n xmlStream.leafNode(this.tag, { \"r:id\": model.rId });\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:id\"]\n };\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TablePartXform };\n","import { BaseXform } from \"../base-xform\";\n\n/**\n * Xform for individual page break (brk element)\n * Used by both RowBreaksXform and ColBreaksXform\n */\nclass PageBreaksXform extends BaseXform {\n declare public model: any;\n\n get tag(): string {\n return \"brk\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(\"brk\", model);\n }\n\n parseOpen(node: any): boolean {\n if (node.name === \"brk\") {\n const { id, max, man, min } = node.attributes;\n this.model = {\n id: +id,\n max: +max,\n man: +man\n };\n if (min !== undefined) {\n this.model.min = +min;\n }\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { PageBreaksXform };\n","import { PageBreaksXform } from \"./page-breaks-xform\";\nimport { ListXform } from \"../list-xform\";\n\n/**\n * Xform for row page breaks (rowBreaks element in worksheet XML)\n * Used to define manual page breaks between rows when printing.\n */\nclass RowBreaksXform extends ListXform {\n constructor() {\n super({\n tag: \"rowBreaks\",\n count: true,\n childXform: new PageBreaksXform()\n });\n }\n\n // Override to add manualBreakCount attribute required by Excel\n render(xmlStream: any, model: any): void {\n if (model && model.length) {\n xmlStream.openNode(this.tag, this.$);\n xmlStream.addAttribute(this.$count, model.length);\n xmlStream.addAttribute(\"manualBreakCount\", model.length);\n\n const { childXform } = this;\n for (const childModel of model) {\n childXform.render(xmlStream, childModel);\n }\n xmlStream.closeNode();\n }\n }\n}\n\nexport { RowBreaksXform };\n","import { PageBreaksXform } from \"./page-breaks-xform\";\nimport { ListXform } from \"../list-xform\";\n\n/**\n * Xform for column page breaks (colBreaks element in worksheet XML)\n * Used to define manual page breaks between columns when printing.\n *\n * XML structure:\n * <colBreaks count=\"3\" manualBreakCount=\"3\">\n * <brk id=\"3\" max=\"1048575\" man=\"1\"/>\n * <brk id=\"6\" max=\"1048575\" man=\"1\"/>\n * </colBreaks>\n */\nclass ColBreaksXform extends ListXform {\n constructor() {\n super({\n tag: \"colBreaks\",\n count: true,\n childXform: new PageBreaksXform()\n });\n }\n\n // Override to add manualBreakCount attribute required by Excel\n render(xmlStream: any, model: any): void {\n if (model && model.length) {\n xmlStream.openNode(this.tag, this.$);\n xmlStream.addAttribute(this.$count, model.length);\n xmlStream.addAttribute(\"manualBreakCount\", model.length);\n\n const { childXform } = this;\n for (const childModel of model) {\n childXform.render(xmlStream, childModel);\n }\n xmlStream.closeNode();\n }\n }\n}\n\nexport { ColBreaksXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface HeaderFooterModel {\n differentFirst?: boolean;\n differentOddEven?: boolean;\n oddHeader?: string;\n oddFooter?: string;\n evenHeader?: string;\n evenFooter?: string;\n firstHeader?: string;\n firstFooter?: string;\n}\n\nclass HeaderFooterXform extends BaseXform {\n declare private currentNode?: string;\n\n get tag(): string {\n return \"headerFooter\";\n }\n\n render(xmlStream: any, model?: HeaderFooterModel): void {\n if (model) {\n xmlStream.addRollback();\n\n let createTag = false;\n\n xmlStream.openNode(\"headerFooter\");\n if (model.differentFirst) {\n xmlStream.addAttribute(\"differentFirst\", \"1\");\n createTag = true;\n }\n if (model.differentOddEven) {\n xmlStream.addAttribute(\"differentOddEven\", \"1\");\n createTag = true;\n }\n if (model.oddHeader && typeof model.oddHeader === \"string\") {\n xmlStream.leafNode(\"oddHeader\", null, model.oddHeader);\n createTag = true;\n }\n if (model.oddFooter && typeof model.oddFooter === \"string\") {\n xmlStream.leafNode(\"oddFooter\", null, model.oddFooter);\n createTag = true;\n }\n if (model.evenHeader && typeof model.evenHeader === \"string\") {\n xmlStream.leafNode(\"evenHeader\", null, model.evenHeader);\n createTag = true;\n }\n if (model.evenFooter && typeof model.evenFooter === \"string\") {\n xmlStream.leafNode(\"evenFooter\", null, model.evenFooter);\n createTag = true;\n }\n if (model.firstHeader && typeof model.firstHeader === \"string\") {\n xmlStream.leafNode(\"firstHeader\", null, model.firstHeader);\n createTag = true;\n }\n if (model.firstFooter && typeof model.firstFooter === \"string\") {\n xmlStream.leafNode(\"firstFooter\", null, model.firstFooter);\n createTag = true;\n }\n\n if (createTag) {\n xmlStream.closeNode();\n xmlStream.commit();\n } else {\n xmlStream.rollback();\n }\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case \"headerFooter\":\n this.model = {};\n if (node.attributes.differentFirst) {\n this.model.differentFirst = parseInt(node.attributes.differentFirst, 0) === 1;\n }\n if (node.attributes.differentOddEven) {\n this.model.differentOddEven = parseInt(node.attributes.differentOddEven, 0) === 1;\n }\n return true;\n\n case \"oddHeader\":\n this.currentNode = \"oddHeader\";\n return true;\n\n case \"oddFooter\":\n this.currentNode = \"oddFooter\";\n return true;\n\n case \"evenHeader\":\n this.currentNode = \"evenHeader\";\n return true;\n\n case \"evenFooter\":\n this.currentNode = \"evenFooter\";\n return true;\n\n case \"firstHeader\":\n this.currentNode = \"firstHeader\";\n return true;\n\n case \"firstFooter\":\n this.currentNode = \"firstFooter\";\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n switch (this.currentNode) {\n case \"oddHeader\":\n this.model.oddHeader = (this.model.oddHeader || \"\") + text;\n break;\n\n case \"oddFooter\":\n this.model.oddFooter = (this.model.oddFooter || \"\") + text;\n break;\n\n case \"evenHeader\":\n this.model.evenHeader = (this.model.evenHeader || \"\") + text;\n break;\n\n case \"evenFooter\":\n this.model.evenFooter = (this.model.evenFooter || \"\") + text;\n break;\n\n case \"firstHeader\":\n this.model.firstHeader = (this.model.firstHeader || \"\") + text;\n break;\n\n case \"firstFooter\":\n this.model.firstFooter = (this.model.firstFooter || \"\") + text;\n break;\n\n default:\n break;\n }\n }\n\n parseClose(): boolean {\n switch (this.currentNode) {\n case \"oddHeader\":\n case \"oddFooter\":\n case \"evenHeader\":\n case \"evenFooter\":\n case \"firstHeader\":\n case \"firstFooter\":\n this.currentNode = undefined;\n return true;\n\n default:\n return false;\n }\n }\n}\n\nexport { HeaderFooterXform };\n","import { BaseXform } from \"./base-xform\";\n\n/* 'virtual' methods used as a form of documentation */\n\n// base class for xforms that are composed of other xforms\n// offers some default implementations\nclass CompositeXform extends BaseXform {\n declare public parser?: any;\n\n createNewModel(_node?: any): any {\n return {};\n }\n\n parseOpen(node: any): boolean {\n // Typical pattern for composite xform\n this.parser = this.parser || this.map![node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n if (node.name === this.tag) {\n this.model = this.createNewModel(node);\n return true;\n }\n\n return false;\n }\n\n parseText(text: string): void {\n // Default implementation. Send text to child parser\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n onParserClose(name: string, parser: any): void {\n // parseClose has seen a child parser close\n // now need to incorporate into this.model somehow\n this.model[name] = parser.model;\n }\n\n parseClose(name: string): boolean {\n // Default implementation\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.onParserClose(name, this.parser);\n this.parser = undefined;\n }\n return true;\n }\n\n return name !== this.tag;\n }\n\n get tag(): string {\n return \"\";\n }\n}\n\nexport { CompositeXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass CfvoXform extends BaseXform {\n get tag(): string {\n return \"cfvo\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, {\n type: model.type,\n val: model.value\n });\n }\n\n parseOpen(node: any): void {\n this.model = {\n type: node.attributes.type,\n value: BaseXform.toFloatValue(node.attributes.val)\n };\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nexport { CfvoXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { ColorXform } from \"../../style/color-xform\";\nimport { CfvoXform } from \"./cfvo-xform\";\n\nclass DatabarXform extends CompositeXform {\n cfvoXform: CfvoXform;\n colorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform()),\n color: (this.colorXform = new ColorXform())\n };\n }\n\n get tag(): string {\n return \"dataBar\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n this.colorXform.render(xmlStream, model.color);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {\n cfvo: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n switch (name) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n case \"color\":\n this.model.color = parser.model;\n break;\n }\n }\n}\n\nexport { DatabarXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\n\nclass X14IdXform extends BaseXform {\n get tag(): string {\n return \"x14:id\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(): void {\n this.model = \"\";\n }\n\n parseText(text: string): void {\n this.model += text;\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nclass ExtXform extends CompositeXform {\n idXform: X14IdXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:id\": (this.idXform = new X14IdXform())\n };\n }\n\n get tag(): string {\n return \"ext\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, {\n uri: \"{B025F937-C7B1-47D3-B67F-A62EFF666E3E}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n });\n\n this.idXform.render(xmlStream, model.x14Id);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model.x14Id = parser.model;\n }\n}\n\nclass ExtLstRefXform extends CompositeXform {\n constructor() {\n super();\n this.map = {\n ext: new ExtXform()\n };\n }\n\n get tag(): string {\n return \"extLst\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n this.map.ext.render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n Object.assign(this.model, parser.model);\n }\n}\n\nexport { ExtLstRefXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass FormulaXform extends BaseXform {\n get tag(): string {\n return \"formula\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(): void {\n this.model = \"\";\n }\n\n parseText(text: string): void {\n this.model += text;\n }\n\n parseClose(name: string): boolean {\n return name !== this.tag;\n }\n}\n\nexport { FormulaXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { ColorXform } from \"../../style/color-xform\";\nimport { CfvoXform } from \"./cfvo-xform\";\n\nclass ColorScaleXform extends CompositeXform {\n cfvoXform: CfvoXform;\n colorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform()),\n color: (this.colorXform = new ColorXform())\n };\n }\n\n get tag(): string {\n return \"colorScale\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n model.color.forEach((color: any) => {\n this.colorXform.render(xmlStream, color);\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel(node: any): any {\n return {\n cfvo: [],\n color: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name].push(parser.model);\n }\n}\n\nexport { ColorScaleXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\nimport { CfvoXform } from \"./cfvo-xform\";\n\nclass IconSetXform extends CompositeXform {\n cfvoXform: CfvoXform;\n\n constructor() {\n super();\n\n this.map = {\n cfvo: (this.cfvoXform = new CfvoXform())\n };\n }\n\n get tag(): string {\n return \"iconSet\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, {\n iconSet: BaseXform.toStringAttribute(model.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolAttribute(model.reverse, false),\n showValue: BaseXform.toBoolAttribute(model.showValue, true)\n });\n\n model.cfvo.forEach((cfvo: any) => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }: any): any {\n return {\n iconSet: BaseXform.toStringValue(attributes.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolValue(attributes.reverse),\n showValue: BaseXform.toBoolValue(attributes.showValue),\n cfvo: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name].push(parser.model);\n }\n}\n\nexport { IconSetXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\nimport { Range } from \"../../../../doc/range\";\nimport { DatabarXform } from \"./databar-xform\";\nimport { ExtLstRefXform } from \"./ext-lst-ref-xform\";\nimport { FormulaXform } from \"./formula-xform\";\nimport { ColorScaleXform } from \"./color-scale-xform\";\nimport { IconSetXform } from \"./icon-set-xform\";\n\nconst extIcons = {\n \"3Triangles\": true,\n \"3Stars\": true,\n \"5Boxes\": true\n};\n\nconst getTextFormula = model => {\n if (model.formulae && model.formulae[0]) {\n return model.formulae[0];\n }\n\n const range = new Range(model.ref);\n const { tl } = range;\n switch (model.operator) {\n case \"containsText\":\n return `NOT(ISERROR(SEARCH(\"${model.text}\",${tl})))`;\n case \"containsBlanks\":\n return `LEN(TRIM(${tl}))=0`;\n case \"notContainsBlanks\":\n return `LEN(TRIM(${tl}))>0`;\n case \"containsErrors\":\n return `ISERROR(${tl})`;\n case \"notContainsErrors\":\n return `NOT(ISERROR(${tl}))`;\n default:\n return undefined;\n }\n};\n\nconst getTimePeriodFormula = model => {\n if (model.formulae && model.formulae[0]) {\n return model.formulae[0];\n }\n\n const range = new Range(model.ref);\n const { tl } = range;\n switch (model.timePeriod) {\n case \"thisWeek\":\n return `AND(TODAY()-ROUNDDOWN(${tl},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${tl},0)-TODAY()<=7-WEEKDAY(TODAY()))`;\n case \"lastWeek\":\n return `AND(TODAY()-ROUNDDOWN(${tl},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${tl},0)<(WEEKDAY(TODAY())+7))`;\n case \"nextWeek\":\n return `AND(ROUNDDOWN(${tl},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${tl},0)-TODAY()<(15-WEEKDAY(TODAY())))`;\n case \"yesterday\":\n return `FLOOR(${tl},1)=TODAY()-1`;\n case \"today\":\n return `FLOOR(${tl},1)=TODAY()`;\n case \"tomorrow\":\n return `FLOOR(${tl},1)=TODAY()+1`;\n case \"last7Days\":\n return `AND(TODAY()-FLOOR(${tl},1)<=6,FLOOR(${tl},1)<=TODAY())`;\n case \"lastMonth\":\n return `AND(MONTH(${tl})=MONTH(EDATE(TODAY(),0-1)),YEAR(${tl})=YEAR(EDATE(TODAY(),0-1)))`;\n case \"thisMonth\":\n return `AND(MONTH(${tl})=MONTH(TODAY()),YEAR(${tl})=YEAR(TODAY()))`;\n case \"nextMonth\":\n return `AND(MONTH(${tl})=MONTH(EDATE(TODAY(),0+1)),YEAR(${tl})=YEAR(EDATE(TODAY(),0+1)))`;\n default:\n return undefined;\n }\n};\n\nconst opType = attributes => {\n const { type, operator } = attributes;\n switch (type) {\n case \"containsText\":\n case \"containsBlanks\":\n case \"notContainsBlanks\":\n case \"containsErrors\":\n case \"notContainsErrors\":\n return {\n type: \"containsText\",\n operator: type\n };\n\n default:\n return { type, operator };\n }\n};\n\nclass CfRuleXform extends CompositeXform {\n databarXform: DatabarXform;\n extLstRefXform: ExtLstRefXform;\n formulaXform: FormulaXform;\n colorScaleXform: ColorScaleXform;\n iconSetXform: IconSetXform;\n\n constructor() {\n super();\n\n this.map = {\n dataBar: (this.databarXform = new DatabarXform()),\n extLst: (this.extLstRefXform = new ExtLstRefXform()),\n formula: (this.formulaXform = new FormulaXform()),\n colorScale: (this.colorScaleXform = new ColorScaleXform()),\n iconSet: (this.iconSetXform = new IconSetXform())\n };\n }\n\n get tag() {\n return \"cfRule\";\n }\n\n static isPrimitive(rule) {\n // is this rule primitive?\n if (rule.type === \"iconSet\") {\n if (rule.custom || extIcons[rule.iconSet]) {\n return false;\n }\n }\n return true;\n }\n\n render(xmlStream, model) {\n switch (model.type) {\n case \"expression\":\n this.renderExpression(xmlStream, model);\n break;\n case \"cellIs\":\n this.renderCellIs(xmlStream, model);\n break;\n case \"top10\":\n this.renderTop10(xmlStream, model);\n break;\n case \"aboveAverage\":\n this.renderAboveAverage(xmlStream, model);\n break;\n case \"dataBar\":\n this.renderDataBar(xmlStream, model);\n break;\n case \"colorScale\":\n this.renderColorScale(xmlStream, model);\n break;\n case \"iconSet\":\n this.renderIconSet(xmlStream, model);\n break;\n case \"containsText\":\n this.renderText(xmlStream, model);\n break;\n case \"timePeriod\":\n this.renderTimePeriod(xmlStream, model);\n break;\n }\n }\n\n renderExpression(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"expression\",\n dxfId: model.dxfId,\n priority: model.priority\n });\n\n this.formulaXform.render(xmlStream, model.formulae[0]);\n\n xmlStream.closeNode();\n }\n\n renderCellIs(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"cellIs\",\n dxfId: model.dxfId,\n priority: model.priority,\n operator: model.operator\n });\n\n model.formulae.forEach(formula => {\n this.formulaXform.render(xmlStream, formula);\n });\n\n xmlStream.closeNode();\n }\n\n renderTop10(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n type: \"top10\",\n dxfId: model.dxfId,\n priority: model.priority,\n percent: BaseXform.toBoolAttribute(model.percent, false),\n bottom: BaseXform.toBoolAttribute(model.bottom, false),\n rank: BaseXform.toIntValue(model.rank, 10)\n });\n }\n\n renderAboveAverage(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n type: \"aboveAverage\",\n dxfId: model.dxfId,\n priority: model.priority,\n aboveAverage: BaseXform.toBoolAttribute(model.aboveAverage, true)\n });\n }\n\n renderDataBar(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"dataBar\",\n priority: model.priority\n });\n\n this.databarXform.render(xmlStream, model);\n this.extLstRefXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderColorScale(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"colorScale\",\n priority: model.priority\n });\n\n this.colorScaleXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderIconSet(xmlStream, model) {\n // iconset is all primitive or all extLst\n if (!CfRuleXform.isPrimitive(model)) {\n return;\n }\n\n xmlStream.openNode(this.tag, {\n type: \"iconSet\",\n priority: model.priority\n });\n\n this.iconSetXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderText(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: model.operator,\n dxfId: model.dxfId,\n priority: model.priority,\n operator: BaseXform.toStringAttribute(model.operator, \"containsText\")\n });\n\n const formula = getTextFormula(model);\n if (formula) {\n this.formulaXform.render(xmlStream, formula);\n }\n\n xmlStream.closeNode();\n }\n\n renderTimePeriod(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"timePeriod\",\n dxfId: model.dxfId,\n priority: model.priority,\n timePeriod: model.timePeriod\n });\n\n const formula = getTimePeriodFormula(model);\n if (formula) {\n this.formulaXform.render(xmlStream, formula);\n }\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n ...opType(attributes),\n dxfId: BaseXform.toIntValue(attributes.dxfId),\n priority: BaseXform.toIntValue(attributes.priority),\n timePeriod: attributes.timePeriod,\n percent: BaseXform.toBoolValue(attributes.percent),\n bottom: BaseXform.toBoolValue(attributes.bottom),\n rank: BaseXform.toIntValue(attributes.rank),\n aboveAverage: BaseXform.toBoolValue(attributes.aboveAverage)\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"dataBar\":\n case \"extLst\":\n case \"colorScale\":\n case \"iconSet\":\n // merge parser model with ours\n Object.assign(this.model, parser.model);\n break;\n\n case \"formula\":\n // except - formula is a string and appends to formulae\n this.model.formulae = this.model.formulae || [];\n this.model.formulae.push(parser.model);\n break;\n }\n }\n}\n\nexport { CfRuleXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { CfRuleXform } from \"./cf-rule-xform\";\n\nclass ConditionalFormattingXform extends CompositeXform {\n constructor() {\n super();\n\n this.map = {\n cfRule: new CfRuleXform()\n };\n }\n\n get tag(): string {\n return \"conditionalFormatting\";\n }\n\n render(xmlStream: any, model: any): void {\n // if there are no primitive rules, exit now\n if (!model.rules.some(CfRuleXform.isPrimitive)) {\n return;\n }\n\n xmlStream.openNode(this.tag, { sqref: model.ref });\n\n model.rules.forEach((rule: any) => {\n if (CfRuleXform.isPrimitive(rule)) {\n rule.ref = model.ref;\n this.map.cfRule.render(xmlStream, rule);\n }\n });\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }: any): any {\n return {\n ref: attributes.sqref,\n rules: []\n };\n }\n\n onParserClose(name: string, parser: any): void {\n this.model.rules.push(parser.model);\n }\n}\n\nexport { ConditionalFormattingXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { ConditionalFormattingXform } from \"./conditional-formatting-xform\";\n\nclass ConditionalFormattingsXform extends BaseXform {\n cfXform: ConditionalFormattingXform;\n parser: any;\n\n constructor() {\n super();\n\n this.cfXform = new ConditionalFormattingXform();\n }\n\n get tag(): string {\n return \"conditionalFormatting\";\n }\n\n reset(): void {\n this.model = [];\n }\n\n prepare(model: any, options: any): void {\n // ensure each rule has a priority value\n let nextPriority = model.reduce(\n (p: number, cf: any) => Math.max(p, ...cf.rules.map((rule: any) => rule.priority || 0)),\n 1\n );\n model.forEach((cf: any) => {\n cf.rules.forEach((rule: any) => {\n if (!rule.priority) {\n rule.priority = nextPriority++;\n }\n\n if (rule.style) {\n rule.dxfId = options.styles.addDxfStyle(rule.style);\n }\n });\n });\n }\n\n render(xmlStream: any, model: any): void {\n model.forEach((cf: any) => {\n this.cfXform.render(xmlStream, cf);\n });\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case \"conditionalFormatting\":\n this.parser = this.cfXform;\n this.parser.parseOpen(node);\n return true;\n\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.push(this.parser.model);\n this.parser = undefined;\n return false;\n }\n return true;\n }\n return false;\n }\n\n reconcile(model: any, options: any): void {\n model.forEach((cf: any) => {\n cf.rules.forEach((rule: any) => {\n if (rule.dxfId !== undefined) {\n rule.style = options.styles.getDxfStyle(rule.dxfId);\n delete rule.dxfId;\n }\n });\n });\n }\n}\n\nexport { ConditionalFormattingsXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass FExtXform extends BaseXform {\n get tag() {\n return \"xm:f\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen() {\n this.model = \"\";\n }\n\n parseText(text) {\n this.model += text;\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { FExtXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { FExtXform } from \"./f-ext-xform\";\n\nclass CfvoExtXform extends CompositeXform {\n fExtXform: FExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"xm:f\": (this.fExtXform = new FExtXform())\n };\n }\n\n get tag() {\n return \"x14:cfvo\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: model.type\n });\n if (model.value !== undefined) {\n this.fExtXform.render(xmlStream, model.value);\n }\n xmlStream.closeNode();\n }\n\n createNewModel(node) {\n return {\n type: node.attributes.type\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"xm:f\":\n this.model.value = parser.model ? parseFloat(parser.model) : 0;\n break;\n }\n }\n}\n\nexport { CfvoExtXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\nimport { ColorXform } from \"../../style/color-xform\";\nimport { CfvoExtXform } from \"./cfvo-ext-xform\";\n\nclass DatabarExtXform extends CompositeXform {\n cfvoXform: CfvoExtXform;\n borderColorXform: ColorXform;\n negativeBorderColorXform: ColorXform;\n negativeFillColorXform: ColorXform;\n axisColorXform: ColorXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:cfvo\": (this.cfvoXform = new CfvoExtXform()),\n \"x14:borderColor\": (this.borderColorXform = new ColorXform(\"x14:borderColor\")),\n \"x14:negativeBorderColor\": (this.negativeBorderColorXform = new ColorXform(\n \"x14:negativeBorderColor\"\n )),\n \"x14:negativeFillColor\": (this.negativeFillColorXform = new ColorXform(\n \"x14:negativeFillColor\"\n )),\n \"x14:axisColor\": (this.axisColorXform = new ColorXform(\"x14:axisColor\"))\n };\n }\n\n static isExt(rule) {\n // not all databars need ext\n // TODO: refine this\n return !rule.gradient;\n }\n\n get tag() {\n return \"x14:dataBar\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n minLength: BaseXform.toIntAttribute(model.minLength, 0, true),\n maxLength: BaseXform.toIntAttribute(model.maxLength, 100, true),\n border: BaseXform.toBoolAttribute(model.border, false),\n gradient: BaseXform.toBoolAttribute(model.gradient, true),\n negativeBarColorSameAsPositive: BaseXform.toBoolAttribute(\n model.negativeBarColorSameAsPositive,\n true\n ),\n negativeBarBorderColorSameAsPositive: BaseXform.toBoolAttribute(\n model.negativeBarBorderColorSameAsPositive,\n true\n ),\n axisPosition: BaseXform.toAttribute(model.axisPosition, \"auto\"),\n direction: BaseXform.toAttribute(model.direction, \"leftToRight\")\n });\n\n model.cfvo.forEach(cfvo => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n this.borderColorXform.render(xmlStream, model.borderColor);\n this.negativeBorderColorXform.render(xmlStream, model.negativeBorderColor);\n this.negativeFillColorXform.render(xmlStream, model.negativeFillColor);\n this.axisColorXform.render(xmlStream, model.axisColor);\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n cfvo: [],\n minLength: BaseXform.toIntValue(attributes.minLength, 0),\n maxLength: BaseXform.toIntValue(attributes.maxLength, 100),\n border: BaseXform.toBoolValue(attributes.border, false),\n gradient: BaseXform.toBoolValue(attributes.gradient, true),\n negativeBarColorSameAsPositive: BaseXform.toBoolValue(\n attributes.negativeBarColorSameAsPositive,\n true\n ),\n negativeBarBorderColorSameAsPositive: BaseXform.toBoolValue(\n attributes.negativeBarBorderColorSameAsPositive,\n true\n ),\n axisPosition: BaseXform.toStringValue(attributes.axisPosition, \"auto\"),\n direction: BaseXform.toStringValue(attributes.direction, \"leftToRight\")\n };\n }\n\n onParserClose(name, parser) {\n const [, prop] = name.split(\":\");\n switch (prop) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n\n default:\n this.model[prop] = parser.model;\n break;\n }\n }\n}\n\nexport { DatabarExtXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass CfIconExtXform extends BaseXform {\n get tag() {\n return \"x14:cfIcon\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, {\n iconSet: model.iconSet,\n iconId: model.iconId\n });\n }\n\n parseOpen({ attributes }) {\n this.model = {\n iconSet: attributes.iconSet,\n iconId: BaseXform.toIntValue(attributes.iconId)\n };\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { CfIconExtXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\nimport { CfvoExtXform } from \"./cfvo-ext-xform\";\nimport { CfIconExtXform } from \"./cf-icon-ext-xform\";\n\nclass IconSetExtXform extends CompositeXform {\n cfvoXform: CfvoExtXform;\n cfIconXform: CfIconExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:cfvo\": (this.cfvoXform = new CfvoExtXform()),\n \"x14:cfIcon\": (this.cfIconXform = new CfIconExtXform())\n };\n }\n\n get tag() {\n return \"x14:iconSet\";\n }\n\n render(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n iconSet: BaseXform.toStringAttribute(model.iconSet),\n reverse: BaseXform.toBoolAttribute(model.reverse, false),\n showValue: BaseXform.toBoolAttribute(model.showValue, true),\n custom: BaseXform.toBoolAttribute(model.icons, false)\n });\n\n model.cfvo.forEach(cfvo => {\n this.cfvoXform.render(xmlStream, cfvo);\n });\n\n if (model.icons) {\n model.icons.forEach((icon, i) => {\n icon.iconId = i;\n this.cfIconXform.render(xmlStream, icon);\n });\n }\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n cfvo: [],\n iconSet: BaseXform.toStringValue(attributes.iconSet, \"3TrafficLights\"),\n reverse: BaseXform.toBoolValue(attributes.reverse, false),\n showValue: BaseXform.toBoolValue(attributes.showValue, true)\n };\n }\n\n onParserClose(name, parser) {\n const [, prop] = name.split(\":\");\n switch (prop) {\n case \"cfvo\":\n this.model.cfvo.push(parser.model);\n break;\n\n case \"cfIcon\":\n if (!this.model.icons) {\n this.model.icons = [];\n }\n this.model.icons.push(parser.model);\n break;\n\n default:\n this.model[prop] = parser.model;\n break;\n }\n }\n}\n\nexport { IconSetExtXform };\n","import { BaseXform } from \"../../base-xform\";\nimport { CompositeXform } from \"../../composite-xform\";\nimport { DatabarExtXform } from \"./databar-ext-xform\";\nimport { IconSetExtXform } from \"./icon-set-ext-xform\";\n\nconst extIcons = {\n \"3Triangles\": true,\n \"3Stars\": true,\n \"5Boxes\": true\n};\n\nclass CfRuleExtXform extends CompositeXform {\n databarXform: DatabarExtXform;\n iconSetXform: IconSetExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:dataBar\": (this.databarXform = new DatabarExtXform()),\n \"x14:iconSet\": (this.iconSetXform = new IconSetExtXform())\n };\n }\n\n get tag() {\n return \"x14:cfRule\";\n }\n\n static isExt(rule) {\n // is this rule primitive?\n if (rule.type === \"dataBar\") {\n return DatabarExtXform.isExt(rule);\n }\n if (rule.type === \"iconSet\") {\n if (rule.custom || extIcons[rule.iconSet]) {\n return true;\n }\n }\n return false;\n }\n\n prepare(model) {\n if (CfRuleExtXform.isExt(model)) {\n model.x14Id = `{${crypto.randomUUID()}}`.toUpperCase();\n }\n }\n\n render(xmlStream, model) {\n if (!CfRuleExtXform.isExt(model)) {\n return;\n }\n\n switch (model.type) {\n case \"dataBar\":\n this.renderDataBar(xmlStream, model);\n break;\n case \"iconSet\":\n this.renderIconSet(xmlStream, model);\n break;\n }\n }\n\n renderDataBar(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"dataBar\",\n id: model.x14Id\n });\n\n this.databarXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n renderIconSet(xmlStream, model) {\n xmlStream.openNode(this.tag, {\n type: \"iconSet\",\n priority: model.priority,\n id: model.x14Id || `{${crypto.randomUUID()}}`\n });\n\n this.iconSetXform.render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n createNewModel({ attributes }) {\n return {\n type: attributes.type,\n x14Id: attributes.id,\n priority: BaseXform.toIntValue(attributes.priority)\n };\n }\n\n onParserClose(name, parser) {\n Object.assign(this.model, parser.model);\n }\n}\n\nexport { CfRuleExtXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass SqrefExtXform extends BaseXform {\n get tag() {\n return \"xm:sqref\";\n }\n\n render(xmlStream, model) {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen() {\n this.model = \"\";\n }\n\n parseText(text) {\n this.model += text;\n }\n\n parseClose(name) {\n return name !== this.tag;\n }\n}\n\nexport { SqrefExtXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { SqrefExtXform } from \"./sqref-ext-xform\";\nimport { CfRuleExtXform } from \"./cf-rule-ext-xform\";\n\nclass ConditionalFormattingExtXform extends CompositeXform {\n sqRef: SqrefExtXform;\n cfRule: CfRuleExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"xm:sqref\": (this.sqRef = new SqrefExtXform()),\n \"x14:cfRule\": (this.cfRule = new CfRuleExtXform())\n };\n }\n\n get tag() {\n return \"x14:conditionalFormatting\";\n }\n\n prepare(model) {\n model.rules.forEach(rule => {\n this.cfRule.prepare(rule);\n });\n }\n\n render(xmlStream, model) {\n if (!model.rules.some(CfRuleExtXform.isExt)) {\n return;\n }\n\n xmlStream.openNode(this.tag, {\n \"xmlns:xm\": \"http://schemas.microsoft.com/office/excel/2006/main\"\n });\n\n model.rules.filter(CfRuleExtXform.isExt).forEach(rule => this.cfRule.render(xmlStream, rule));\n\n // for some odd reason, Excel needs the <xm:sqref> node to be after the rules\n this.sqRef.render(xmlStream, model.ref);\n\n xmlStream.closeNode();\n }\n\n createNewModel() {\n return {\n rules: []\n };\n }\n\n onParserClose(name, parser) {\n switch (name) {\n case \"xm:sqref\":\n this.model.ref = parser.model;\n break;\n\n case \"x14:cfRule\":\n this.model.rules.push(parser.model);\n break;\n }\n }\n}\n\nexport { ConditionalFormattingExtXform };\n","import { CompositeXform } from \"../../composite-xform\";\nimport { CfRuleExtXform } from \"./cf-rule-ext-xform\";\nimport { ConditionalFormattingExtXform } from \"./conditional-formatting-ext-xform\";\n\nclass ConditionalFormattingsExtXform extends CompositeXform {\n cfXform: ConditionalFormattingExtXform;\n\n constructor() {\n super();\n\n this.map = {\n \"x14:conditionalFormatting\": (this.cfXform = new ConditionalFormattingExtXform())\n };\n }\n\n get tag() {\n return \"x14:conditionalFormattings\";\n }\n\n hasContent(model) {\n if (model.hasExtContent === undefined) {\n model.hasExtContent = model.some(cf => cf.rules.some(CfRuleExtXform.isExt));\n }\n return model.hasExtContent;\n }\n\n prepare(model) {\n model.forEach(cf => {\n this.cfXform.prepare(cf);\n });\n }\n\n render(xmlStream, model) {\n if (this.hasContent(model)) {\n xmlStream.openNode(this.tag);\n model.forEach(cf => this.cfXform.render(xmlStream, cf));\n xmlStream.closeNode();\n }\n }\n\n createNewModel() {\n return [];\n }\n\n onParserClose(name, parser) {\n // model is array of conditional formatting objects\n this.model.push(parser.model);\n }\n}\n\nexport { ConditionalFormattingsExtXform };\n","import { CompositeXform } from \"../composite-xform\";\nimport { ConditionalFormattingsExtXform } from \"./cf-ext/conditional-formattings-ext-xform\";\n\nclass ExtXform extends CompositeXform {\n declare public map: { [key: string]: any };\n declare public model: any;\n declare private conditionalFormattings: ConditionalFormattingsExtXform;\n\n constructor() {\n super();\n this.map = {\n \"x14:conditionalFormattings\": (this.conditionalFormattings =\n new ConditionalFormattingsExtXform())\n };\n }\n\n get tag(): string {\n return \"ext\";\n }\n\n hasContent(model: any): boolean {\n return this.conditionalFormattings.hasContent(model.conditionalFormattings);\n }\n\n prepare(model: any): void {\n this.conditionalFormattings.prepare(model.conditionalFormattings);\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(\"ext\", {\n uri: \"{78C0D931-6437-407d-A8EE-F0AAD7539E65}\",\n \"xmlns:x14\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n });\n\n this.conditionalFormattings.render(xmlStream, model.conditionalFormattings);\n\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name] = parser.model;\n }\n}\n\nclass ExtLstXform extends CompositeXform {\n declare public map: { [key: string]: any };\n declare public model: any;\n declare private ext: ExtXform;\n\n constructor() {\n super();\n\n this.map = {\n ext: (this.ext = new ExtXform())\n };\n }\n\n get tag(): string {\n return \"extLst\";\n }\n\n prepare(model: any, _options?: any): void {\n this.ext.prepare(model);\n }\n\n hasContent(model: any): boolean {\n return this.ext.hasContent(model);\n }\n\n render(xmlStream: any, model: any): void {\n if (!this.hasContent(model)) {\n return;\n }\n\n xmlStream.openNode(\"extLst\");\n this.ext.render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n createNewModel(): any {\n return {};\n }\n\n onParserClose(name: string, parser: any): void {\n this.model[name] = parser.model;\n }\n}\n\nexport { ExtLstXform };\n","import { colCache } from \"../../../utils/col-cache\";\nimport { XmlStream } from \"../../../utils/xml-stream\";\nimport { RelType } from \"../../rel-type\";\nimport { Merges } from \"./merges\";\nimport { BaseXform } from \"../base-xform\";\nimport { ListXform } from \"../list-xform\";\nimport { RowXform } from \"./row-xform\";\nimport { ColXform } from \"./col-xform\";\nimport { DimensionXform } from \"./dimension-xform\";\nimport { HyperlinkXform } from \"./hyperlink-xform\";\nimport { MergeCellXform } from \"./merge-cell-xform\";\nimport { DataValidationsXform } from \"./data-validations-xform\";\nimport { SheetPropertiesXform } from \"./sheet-properties-xform\";\nimport { SheetFormatPropertiesXform } from \"./sheet-format-properties-xform\";\nimport { SheetViewXform } from \"./sheet-view-xform\";\nimport { SheetProtectionXform } from \"./sheet-protection-xform\";\nimport { PageMarginsXform } from \"./page-margins-xform\";\nimport { PageSetupXform } from \"./page-setup-xform\";\nimport { PrintOptionsXform } from \"./print-options-xform\";\nimport { AutoFilterXform } from \"./auto-filter-xform\";\nimport { PictureXform } from \"./picture-xform\";\nimport { DrawingXform } from \"./drawing-xform\";\nimport { TablePartXform } from \"./table-part-xform\";\nimport { RowBreaksXform } from \"./row-breaks-xform\";\nimport { ColBreaksXform } from \"./col-breaks-xform\";\nimport { HeaderFooterXform } from \"./header-footer-xform\";\nimport { ConditionalFormattingsXform } from \"./cf/conditional-formattings-xform\";\nimport { ExtLstXform } from \"./ext-lst-xform\";\n\nconst mergeRule = (rule, extRule) => {\n Object.keys(extRule).forEach(key => {\n const value = rule[key];\n const extValue = extRule[key];\n if (value === undefined && extValue !== undefined) {\n rule[key] = extValue;\n }\n });\n};\n\nconst mergeConditionalFormattings = (model, extModel) => {\n // conditional formattings are rendered in worksheet.conditionalFormatting and also in\n // worksheet.extLst.ext.x14:conditionalFormattings\n // some (e.g. dataBar) are even spread across both!\n if (!extModel || !extModel.length) {\n return model;\n }\n if (!model || !model.length) {\n return extModel;\n }\n\n // index model rules by x14Id\n const cfMap = {};\n const ruleMap = {};\n model.forEach(cf => {\n cfMap[cf.ref] = cf;\n cf.rules.forEach(rule => {\n const { x14Id } = rule;\n if (x14Id) {\n ruleMap[x14Id] = rule;\n }\n });\n });\n\n extModel.forEach(extCf => {\n extCf.rules.forEach(extRule => {\n const rule = ruleMap[extRule.x14Id];\n if (rule) {\n // merge with matching rule\n mergeRule(rule, extRule);\n } else if (cfMap[extCf.ref]) {\n // reuse existing cf ref\n cfMap[extCf.ref].rules.push(extRule);\n } else {\n // create new cf\n model.push({\n ref: extCf.ref,\n rules: [extRule]\n });\n }\n });\n });\n\n // need to cope with rules in extModel that don't exist in model\n return model;\n};\n\nclass WorkSheetXform extends BaseXform {\n declare private ignoreNodes: string[];\n declare public parser: any;\n declare private preImageId: string | undefined;\n\n static WORKSHEET_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"x14ac\",\n \"xmlns:x14ac\": \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"\n };\n\n constructor(options?: any) {\n super();\n\n const { maxRows, maxCols, ignoreNodes } = options || {};\n\n this.ignoreNodes = ignoreNodes || [];\n\n this.map = {\n sheetPr: new SheetPropertiesXform(),\n dimension: new DimensionXform(),\n sheetViews: new ListXform({\n tag: \"sheetViews\",\n count: false,\n childXform: new SheetViewXform()\n }),\n sheetFormatPr: new SheetFormatPropertiesXform(),\n cols: new ListXform({ tag: \"cols\", count: false, childXform: new ColXform() }),\n sheetData: new ListXform({\n tag: \"sheetData\",\n count: false,\n empty: true,\n childXform: new RowXform({ maxItems: maxCols }),\n maxItems: maxRows\n }),\n autoFilter: new AutoFilterXform(),\n mergeCells: new ListXform({\n tag: \"mergeCells\",\n count: true,\n childXform: new MergeCellXform()\n }),\n rowBreaks: new RowBreaksXform(),\n colBreaks: new ColBreaksXform(),\n hyperlinks: new ListXform({\n tag: \"hyperlinks\",\n count: false,\n childXform: new HyperlinkXform()\n }),\n pageMargins: new PageMarginsXform(),\n dataValidations: new DataValidationsXform(),\n pageSetup: new PageSetupXform(),\n headerFooter: new HeaderFooterXform(),\n printOptions: new PrintOptionsXform(),\n picture: new PictureXform(),\n drawing: new DrawingXform(),\n sheetProtection: new SheetProtectionXform(),\n tableParts: new ListXform({\n tag: \"tableParts\",\n count: true,\n childXform: new TablePartXform()\n }),\n conditionalFormatting: new ConditionalFormattingsXform(),\n extLst: new ExtLstXform()\n };\n }\n\n prepare(model, options) {\n options.merges = new Merges();\n model.hyperlinks = options.hyperlinks = [];\n model.comments = options.comments = [];\n\n options.formulae = {};\n options.siFormulae = 0;\n this.map.cols.prepare(model.cols, options);\n this.map.sheetData.prepare(model.rows, options);\n this.map.conditionalFormatting.prepare(model.conditionalFormattings, options);\n\n model.mergeCells = options.merges.mergeCells;\n\n // prepare relationships\n const rels = (model.rels = []);\n\n function nextRid(r) {\n return `rId${r.length + 1}`;\n }\n\n model.hyperlinks.forEach(hyperlink => {\n const rId = nextRid(rels);\n hyperlink.rId = rId;\n rels.push({\n Id: rId,\n Type: RelType.Hyperlink,\n Target: hyperlink.target,\n TargetMode: \"External\"\n });\n });\n\n // prepare comment relationships\n if (model.comments.length > 0) {\n const comment = {\n Id: nextRid(rels),\n Type: RelType.Comments,\n Target: `../comments${model.id}.xml`\n };\n rels.push(comment);\n const vmlDrawing = {\n Id: nextRid(rels),\n Type: RelType.VmlDrawing,\n Target: `../drawings/vmlDrawing${model.id}.vml`\n };\n rels.push(vmlDrawing);\n\n model.comments.forEach(item => {\n item.refAddress = colCache.decodeAddress(item.ref);\n });\n\n options.commentRefs.push({\n commentName: `comments${model.id}`,\n vmlDrawing: `vmlDrawing${model.id}`\n });\n }\n\n const drawingRelsHash = [];\n let bookImage;\n model.media.forEach(medium => {\n if (medium.type === \"background\") {\n const rId = nextRid(rels);\n bookImage = options.media[medium.imageId];\n rels.push({\n Id: rId,\n Type: RelType.Image,\n Target: `../media/${bookImage.name}.${bookImage.extension}`\n });\n model.background = {\n rId\n };\n model.image = options.media[medium.imageId];\n } else if (medium.type === \"image\") {\n let { drawing } = model;\n bookImage = options.media[medium.imageId];\n if (!drawing) {\n drawing = model.drawing = {\n rId: nextRid(rels),\n name: `drawing${++options.drawingsCount}`,\n anchors: [],\n rels: []\n };\n options.drawings.push(drawing);\n rels.push({\n Id: drawing.rId,\n Type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n Target: `../drawings/${drawing.name}.xml`\n });\n }\n let rIdImage =\n this.preImageId === medium.imageId\n ? drawingRelsHash[medium.imageId]\n : drawingRelsHash[drawing.rels.length];\n if (!rIdImage) {\n rIdImage = nextRid(drawing.rels);\n drawingRelsHash[drawing.rels.length] = rIdImage;\n drawing.rels.push({\n Id: rIdImage,\n Type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n Target: `../media/${bookImage.name}.${bookImage.extension}`\n });\n }\n\n const anchor: any = {\n picture: {\n rId: rIdImage\n },\n range: medium.range\n };\n if (medium.hyperlinks && medium.hyperlinks.hyperlink) {\n const rIdHyperLink = nextRid(drawing.rels);\n drawingRelsHash[drawing.rels.length] = rIdHyperLink;\n anchor.picture.hyperlinks = {\n tooltip: medium.hyperlinks.tooltip,\n rId: rIdHyperLink\n };\n drawing.rels.push({\n Id: rIdHyperLink,\n Type: RelType.Hyperlink,\n Target: medium.hyperlinks.hyperlink,\n TargetMode: \"External\"\n });\n }\n this.preImageId = medium.imageId;\n drawing.anchors.push(anchor);\n }\n });\n\n // prepare tables\n model.tables.forEach(table => {\n // relationships\n const rId = nextRid(rels);\n table.rId = rId;\n rels.push({\n Id: rId,\n Type: RelType.Table,\n Target: `../tables/${table.target}`\n });\n\n // dynamic styles\n table.columns.forEach(column => {\n const { style } = column;\n if (style) {\n column.dxfId = options.styles.addDxfStyle(style);\n }\n });\n });\n\n // prepare pivot tables\n (model.pivotTables || []).forEach((pivotTable: any) => {\n rels.push({\n Id: nextRid(rels),\n Type: RelType.PivotTable,\n Target: `../pivotTables/pivotTable${pivotTable.tableNumber}.xml`\n });\n });\n\n // prepare ext items\n this.map.extLst.prepare(model, options);\n }\n\n render(xmlStream, model) {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"worksheet\", WorkSheetXform.WORKSHEET_ATTRIBUTES);\n\n const sheetFormatPropertiesModel: any = model.properties\n ? {\n defaultRowHeight: model.properties.defaultRowHeight,\n dyDescent: model.properties.dyDescent,\n outlineLevelCol: model.properties.outlineLevelCol,\n outlineLevelRow: model.properties.outlineLevelRow\n }\n : undefined;\n if (model.properties && model.properties.defaultColWidth) {\n sheetFormatPropertiesModel.defaultColWidth = model.properties.defaultColWidth;\n }\n const sheetPropertiesModel = {\n outlineProperties: model.properties && model.properties.outlineProperties,\n tabColor: model.properties && model.properties.tabColor,\n pageSetup:\n model.pageSetup && model.pageSetup.fitToPage\n ? {\n fitToPage: model.pageSetup.fitToPage\n }\n : undefined\n };\n const pageMarginsModel = model.pageSetup && model.pageSetup.margins;\n const printOptionsModel = {\n showRowColHeaders: model.pageSetup && model.pageSetup.showRowColHeaders,\n showGridLines: model.pageSetup && model.pageSetup.showGridLines,\n horizontalCentered: model.pageSetup && model.pageSetup.horizontalCentered,\n verticalCentered: model.pageSetup && model.pageSetup.verticalCentered\n };\n const sheetProtectionModel = model.sheetProtection;\n\n this.map.sheetPr.render(xmlStream, sheetPropertiesModel);\n this.map.dimension.render(xmlStream, model.dimensions);\n this.map.sheetViews.render(xmlStream, model.views);\n this.map.sheetFormatPr.render(xmlStream, sheetFormatPropertiesModel);\n this.map.cols.render(xmlStream, model.cols);\n this.map.sheetData.render(xmlStream, model.rows);\n this.map.sheetProtection.render(xmlStream, sheetProtectionModel); // Note: must be after sheetData and before autoFilter\n this.map.autoFilter.render(xmlStream, model.autoFilter);\n this.map.mergeCells.render(xmlStream, model.mergeCells);\n this.map.conditionalFormatting.render(xmlStream, model.conditionalFormattings); // Note: must be before dataValidations\n this.map.dataValidations.render(xmlStream, model.dataValidations);\n\n // For some reason hyperlinks have to be after the data validations\n this.map.hyperlinks.render(xmlStream, model.hyperlinks);\n\n this.map.printOptions.render(xmlStream, printOptionsModel); // Note: must be before pageMargins\n this.map.pageMargins.render(xmlStream, pageMarginsModel);\n this.map.pageSetup.render(xmlStream, model.pageSetup);\n this.map.headerFooter.render(xmlStream, model.headerFooter);\n this.map.rowBreaks.render(xmlStream, model.rowBreaks);\n this.map.colBreaks.render(xmlStream, model.colBreaks);\n this.map.drawing.render(xmlStream, model.drawing); // Note: must be after rowBreaks/colBreaks\n this.map.picture.render(xmlStream, model.background); // Note: must be after drawing\n this.map.tableParts.render(xmlStream, model.tables);\n\n this.map.extLst.render(xmlStream, model);\n\n if (model.rels) {\n // add a <legacyDrawing /> node for each comment\n model.rels.forEach(rel => {\n if (rel.Type === RelType.VmlDrawing) {\n xmlStream.leafNode(\"legacyDrawing\", { \"r:id\": rel.Id });\n }\n });\n }\n\n xmlStream.closeNode();\n }\n\n parseOpen(node) {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n if (node.name === \"worksheet\") {\n Object.values(this.map).forEach((xform: any) => {\n xform.reset();\n });\n return true;\n }\n\n if (this.map[node.name] && !this.ignoreNodes.includes(node.name)) {\n this.parser = this.map[node.name];\n this.parser.parseOpen(node);\n }\n return true;\n }\n\n parseText(text) {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name) {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case \"worksheet\": {\n const properties = this.map.sheetFormatPr.model || {};\n if (this.map.sheetPr.model && this.map.sheetPr.model.tabColor) {\n properties.tabColor = this.map.sheetPr.model.tabColor;\n }\n if (this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties) {\n properties.outlineProperties = this.map.sheetPr.model.outlineProperties;\n }\n const sheetProperties = {\n fitToPage:\n (this.map.sheetPr.model &&\n this.map.sheetPr.model.pageSetup &&\n this.map.sheetPr.model.pageSetup.fitToPage) ||\n false,\n margins: this.map.pageMargins.model\n };\n const pageSetup = Object.assign(\n sheetProperties,\n this.map.pageSetup.model,\n this.map.printOptions.model\n );\n const conditionalFormattings = mergeConditionalFormattings(\n this.map.conditionalFormatting.model,\n this.map.extLst.model && this.map.extLst.model[\"x14:conditionalFormattings\"]\n );\n this.model = {\n dimensions: this.map.dimension.model,\n cols: this.map.cols.model,\n rows: this.map.sheetData.model,\n mergeCells: this.map.mergeCells.model,\n hyperlinks: this.map.hyperlinks.model,\n dataValidations: this.map.dataValidations.model,\n properties,\n views: this.map.sheetViews.model,\n pageSetup,\n headerFooter: this.map.headerFooter.model,\n background: this.map.picture.model,\n drawing: this.map.drawing.model,\n tables: this.map.tableParts.model,\n conditionalFormattings,\n rowBreaks: this.map.rowBreaks.model || [],\n colBreaks: this.map.colBreaks.model || []\n };\n\n if (this.map.autoFilter.model) {\n this.model.autoFilter = this.map.autoFilter.model;\n }\n if (this.map.sheetProtection.model) {\n this.model.sheetProtection = this.map.sheetProtection.model;\n }\n\n return false;\n }\n\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n\n reconcile(model, options) {\n // options.merges = new Merges();\n // options.merges.reconcile(model.mergeCells, model.rows);\n const rels = (model.relationships || []).reduce((h, rel) => {\n h[rel.Id] = rel;\n if (rel.Type === RelType.Comments) {\n model.comments = options.comments[rel.Target].comments;\n }\n if (rel.Type === RelType.VmlDrawing && model.comments && model.comments.length) {\n const vmlComment = options.vmlDrawings[rel.Target].comments;\n model.comments.forEach((comment, index) => {\n comment.note = Object.assign({}, comment.note, vmlComment[index]);\n });\n }\n return h;\n }, {});\n options.commentsMap = (model.comments || []).reduce((h, comment) => {\n if (comment.ref) {\n h[comment.ref] = comment;\n }\n return h;\n }, {});\n options.hyperlinkMap = (model.hyperlinks || []).reduce((h, hyperlink) => {\n if (hyperlink.rId) {\n h[hyperlink.address] = rels[hyperlink.rId].Target;\n }\n return h;\n }, {});\n options.formulae = {};\n\n // compact the rows and cells\n model.rows = (model.rows && model.rows.filter(Boolean)) || [];\n model.rows.forEach(row => {\n row.cells = (row.cells && row.cells.filter(Boolean)) || [];\n });\n\n this.map.cols.reconcile(model.cols, options);\n this.map.sheetData.reconcile(model.rows, options);\n this.map.conditionalFormatting.reconcile(model.conditionalFormattings, options);\n\n model.media = [];\n if (model.drawing) {\n const drawingRel = rels[model.drawing.rId];\n const match = drawingRel.Target.match(/\\/drawings\\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);\n if (match) {\n const drawingName = match[1];\n const drawing = options.drawings[drawingName];\n drawing.anchors.forEach(anchor => {\n if (anchor.medium) {\n const image = {\n type: \"image\",\n imageId: anchor.medium.index,\n range: anchor.range,\n hyperlinks: anchor.picture.hyperlinks\n };\n model.media.push(image);\n }\n });\n }\n }\n\n const backgroundRel = model.background && rels[model.background.rId];\n if (backgroundRel) {\n const target = backgroundRel.Target.split(\"/media/\")[1];\n const imageId = options.mediaIndex && options.mediaIndex[target];\n if (imageId !== undefined) {\n model.media.push({\n type: \"background\",\n imageId\n });\n }\n }\n\n model.tables = (model.tables || []).map(tablePart => {\n const rel = rels[tablePart.rId];\n return options.tables[rel.Target];\n });\n\n // Link pivot tables from relationships to worksheet\n // This is needed so that when writing, the worksheet knows which pivot tables it contains\n model.pivotTables = [];\n (model.relationships || []).forEach(rel => {\n if (rel.Type === RelType.PivotTable && options.pivotTables) {\n const pivotTable = options.pivotTables[rel.Target];\n if (pivotTable) {\n model.pivotTables.push(pivotTable);\n }\n }\n });\n\n delete model.relationships;\n delete model.hyperlinks;\n delete model.comments;\n }\n}\n\nexport { WorkSheetXform };\n","import { BaseXform } from \"../base-xform\";\n\nabstract class BaseCellAnchorXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n abstract get tag(): string;\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n range: {\n editAs: node.attributes.editAs || \"oneCell\"\n }\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n reconcilePicture(model: any, options: any): any {\n if (model && model.rId) {\n const rel = options.rels[model.rId];\n const match = rel.Target.match(/.*\\/media\\/(.+[.][a-zA-Z]{3,4})/);\n if (match) {\n const name = match[1];\n const mediaId = options.mediaIndex[name];\n return options.media[mediaId];\n }\n }\n return undefined;\n }\n}\n\nexport { BaseCellAnchorXform };\n","import { BaseXform } from \"../base-xform\";\nimport { IntegerXform } from \"../simple/integer-xform\";\n\ninterface PositionModel {\n nativeCol: number;\n nativeColOff: number;\n nativeRow: number;\n nativeRowOff: number;\n}\n\nclass CellPositionXform extends BaseXform {\n declare private tag: string;\n declare public map: { [key: string]: IntegerXform };\n declare public parser: any;\n declare public model: PositionModel;\n\n constructor(options: { tag: string }) {\n super();\n\n this.tag = options.tag;\n this.map = {\n \"xdr:col\": new IntegerXform({ tag: \"xdr:col\", zero: true }),\n \"xdr:colOff\": new IntegerXform({ tag: \"xdr:colOff\", zero: true }),\n \"xdr:row\": new IntegerXform({ tag: \"xdr:row\", zero: true }),\n \"xdr:rowOff\": new IntegerXform({ tag: \"xdr:rowOff\", zero: true })\n };\n this.model = { nativeCol: 0, nativeColOff: 0, nativeRow: 0, nativeRowOff: 0 };\n }\n\n render(xmlStream: any, model: PositionModel): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"xdr:col\"].render(xmlStream, model.nativeCol);\n this.map[\"xdr:colOff\"].render(xmlStream, model.nativeColOff);\n\n this.map[\"xdr:row\"].render(xmlStream, model.nativeRow);\n this.map[\"xdr:rowOff\"].render(xmlStream, model.nativeRowOff);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = {\n nativeCol: this.map[\"xdr:col\"].model,\n nativeColOff: this.map[\"xdr:colOff\"].model,\n nativeRow: this.map[\"xdr:row\"].model,\n nativeRowOff: this.map[\"xdr:rowOff\"].model\n };\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n}\n\nexport { CellPositionXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface BlipModel {\n rId: string;\n}\n\nclass BlipXform extends BaseXform {\n declare public model: BlipModel;\n\n constructor() {\n super();\n this.model = { rId: \"\" };\n }\n\n get tag(): string {\n return \"a:blip\";\n }\n\n render(xmlStream: any, model: BlipModel): void {\n xmlStream.leafNode(this.tag, {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:embed\": model.rId,\n cstate: \"print\"\n });\n // TODO: handle children (e.g. a:extLst=>a:ext=>a14:useLocalDpi\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n rId: node.attributes[\"r:embed\"]\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { BlipXform };\n","import { BaseXform } from \"../base-xform\";\nimport { BlipXform } from \"./blip-xform\";\n\nclass BlipFillXform extends BaseXform {\n declare public map: { [key: string]: BlipXform };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"a:blip\": new BlipXform()\n };\n }\n\n get tag(): string {\n return \"xdr:blipFill\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"a:blip\"].render(xmlStream, model);\n\n // TODO: options for this + parsing\n xmlStream.openNode(\"a:stretch\");\n xmlStream.leafNode(\"a:fillRect\");\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"a:blip\"].model;\n return false;\n\n default:\n return true;\n }\n }\n}\n\nexport { BlipFillXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass HLinkClickXform extends BaseXform {\n declare public model: any;\n\n constructor() {\n super();\n this.model = {};\n }\n\n get tag(): string {\n return \"a:hlinkClick\";\n }\n\n render(xmlStream: any, model: any): void {\n if (!(model.hyperlinks && model.hyperlinks.rId)) {\n return;\n }\n xmlStream.leafNode(this.tag, {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"r:id\": model.hyperlinks.rId,\n tooltip: model.hyperlinks.tooltip\n });\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n hyperlinks: {\n rId: node.attributes[\"r:id\"],\n tooltip: node.attributes.tooltip\n }\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { HLinkClickXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass ExtLstXform extends BaseXform {\n get tag(): string {\n return \"a:extLst\";\n }\n\n render(xmlStream: any): void {\n xmlStream.openNode(this.tag);\n xmlStream.openNode(\"a:ext\", {\n uri: \"{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}\"\n });\n xmlStream.leafNode(\"a16:creationId\", {\n \"xmlns:a16\": \"http://schemas.microsoft.com/office/drawing/2014/main\",\n id: \"{00000000-0008-0000-0000-000002000000}\"\n });\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { ExtLstXform };\n","import { BaseXform } from \"../base-xform\";\nimport { HLinkClickXform } from \"./hlink-click-xform\";\nimport { ExtLstXform } from \"./ext-lst-xform\";\n\ninterface CNvPrModel {\n index: number;\n}\n\nclass CNvPrXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"a:hlinkClick\": new HLinkClickXform(),\n \"a:extLst\": new ExtLstXform()\n };\n }\n\n get tag(): string {\n return \"xdr:cNvPr\";\n }\n\n render(xmlStream: any, model: CNvPrModel): void {\n xmlStream.openNode(this.tag, {\n id: model.index,\n name: `Picture ${model.index}`\n });\n this.map[\"a:hlinkClick\"].render(xmlStream, model);\n this.map[\"a:extLst\"].render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"a:hlinkClick\"].model;\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { CNvPrXform };\n","import { BaseXform } from \"../base-xform\";\n\nclass CNvPicPrXform extends BaseXform {\n get tag(): string {\n return \"xdr:cNvPicPr\";\n }\n\n render(xmlStream: any): void {\n xmlStream.openNode(this.tag);\n xmlStream.leafNode(\"a:picLocks\", {\n noChangeAspect: \"1\"\n });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n // unprocessed internal nodes\n return true;\n }\n }\n}\n\nexport { CNvPicPrXform };\n","import { BaseXform } from \"../base-xform\";\nimport { CNvPrXform } from \"./c-nv-pr-xform\";\nimport { CNvPicPrXform } from \"./c-nv-pic-pr-xform\";\n\nclass NvPicPrXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:cNvPr\": new CNvPrXform(),\n \"xdr:cNvPicPr\": new CNvPicPrXform()\n };\n }\n\n get tag(): string {\n return \"xdr:nvPicPr\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag);\n this.map[\"xdr:cNvPr\"].render(xmlStream, model);\n this.map[\"xdr:cNvPicPr\"].render(xmlStream, model);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model = this.map[\"xdr:cNvPr\"].model;\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { NvPicPrXform };\n","export const spPrJSON = {\n tag: \"xdr:spPr\",\n c: [\n {\n tag: \"a:xfrm\",\n c: [\n { tag: \"a:off\", $: { x: \"0\", y: \"0\" } },\n { tag: \"a:ext\", $: { cx: \"0\", cy: \"0\" } }\n ]\n },\n {\n tag: \"a:prstGeom\",\n $: { prst: \"rect\" },\n c: [{ tag: \"a:avLst\" }]\n }\n ]\n};\n","import { BaseXform } from \"../base-xform\";\nimport { StaticXform } from \"../static-xform\";\nimport { BlipFillXform } from \"./blip-fill-xform\";\nimport { NvPicPrXform } from \"./nv-pic-pr-xform\";\nimport { spPrJSON } from \"./sp-pr\";\n\ninterface PicModel {\n index?: number;\n [key: string]: any;\n}\n\nclass PicXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:nvPicPr\": new NvPicPrXform(),\n \"xdr:blipFill\": new BlipFillXform(),\n \"xdr:spPr\": new StaticXform(spPrJSON)\n };\n }\n\n get tag(): string {\n return \"xdr:pic\";\n }\n\n prepare(model: PicModel, options: { index: number }): void {\n model.index = options.index + 1;\n }\n\n render(xmlStream: any, model: PicModel): void {\n xmlStream.openNode(this.tag);\n\n this.map[\"xdr:nvPicPr\"].render(xmlStream, model);\n this.map[\"xdr:blipFill\"].render(xmlStream, model);\n this.map[\"xdr:spPr\"].render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.mergeModel(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // not quite sure how we get here!\n return true;\n }\n }\n}\n\nexport { PicXform };\n","import { BaseCellAnchorXform } from \"./base-cell-anchor-xform\";\nimport { StaticXform } from \"../static-xform\";\nimport { CellPositionXform } from \"./cell-position-xform\";\nimport { PicXform } from \"./pic-xform\";\n\ninterface TwoCellModel {\n range: {\n editAs?: string;\n tl: any;\n br: any;\n };\n picture: any;\n}\n\nclass TwoCellAnchorXform extends BaseCellAnchorXform {\n constructor() {\n super();\n\n this.map = {\n \"xdr:from\": new CellPositionXform({ tag: \"xdr:from\" }),\n \"xdr:to\": new CellPositionXform({ tag: \"xdr:to\" }),\n \"xdr:pic\": new PicXform(),\n \"xdr:clientData\": new StaticXform({ tag: \"xdr:clientData\" })\n };\n }\n\n get tag(): string {\n return \"xdr:twoCellAnchor\";\n }\n\n prepare(model: TwoCellModel, options: { index: number }): void {\n this.map[\"xdr:pic\"].prepare(model.picture, options);\n }\n\n render(xmlStream: any, model: TwoCellModel): void {\n xmlStream.openNode(this.tag, { editAs: model.range.editAs || \"oneCell\" });\n\n this.map[\"xdr:from\"].render(xmlStream, model.range.tl);\n this.map[\"xdr:to\"].render(xmlStream, model.range.br);\n this.map[\"xdr:pic\"].render(xmlStream, model.picture);\n this.map[\"xdr:clientData\"].render(xmlStream, {});\n\n xmlStream.closeNode();\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.range.tl = this.map[\"xdr:from\"].model;\n this.model.range.br = this.map[\"xdr:to\"].model;\n this.model.picture = this.map[\"xdr:pic\"].model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.medium = this.reconcilePicture(model.picture, options);\n }\n}\n\nexport { TwoCellAnchorXform };\n","import { BaseXform } from \"../base-xform\";\n\n/** https://en.wikipedia.org/wiki/Office_Open_XML_file_formats#DrawingML */\nconst EMU_PER_PIXEL_AT_96_DPI = 9525;\n\ninterface ExtModel {\n width: number;\n height: number;\n}\n\nclass ExtXform extends BaseXform {\n declare private tag: string;\n declare public map: { [key: string]: any };\n declare public model: ExtModel;\n\n constructor(options: { tag: string }) {\n super();\n\n this.tag = options.tag;\n this.map = {};\n this.model = { width: 0, height: 0 };\n }\n\n render(xmlStream: any, model: ExtModel): void {\n xmlStream.openNode(this.tag);\n\n const width = Math.floor(model.width * EMU_PER_PIXEL_AT_96_DPI);\n const height = Math.floor(model.height * EMU_PER_PIXEL_AT_96_DPI);\n\n xmlStream.addAttribute(\"cx\", width);\n xmlStream.addAttribute(\"cy\", height);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n width: parseInt(node.attributes.cx || \"0\", 10) / EMU_PER_PIXEL_AT_96_DPI,\n height: parseInt(node.attributes.cy || \"0\", 10) / EMU_PER_PIXEL_AT_96_DPI\n };\n return true;\n }\n return false;\n }\n\n parseText(_text?: string): void {}\n\n parseClose(_name?: string): boolean {\n return false;\n }\n}\n\nexport { ExtXform };\n","import { BaseCellAnchorXform } from \"./base-cell-anchor-xform\";\nimport { StaticXform } from \"../static-xform\";\nimport { CellPositionXform } from \"./cell-position-xform\";\nimport { ExtXform } from \"./ext-xform\";\nimport { PicXform } from \"./pic-xform\";\n\ninterface OneCellModel {\n range: {\n editAs?: string;\n tl: any;\n ext: any;\n };\n picture: any;\n}\n\nclass OneCellAnchorXform extends BaseCellAnchorXform {\n constructor() {\n super();\n\n this.map = {\n \"xdr:from\": new CellPositionXform({ tag: \"xdr:from\" }),\n \"xdr:ext\": new ExtXform({ tag: \"xdr:ext\" }),\n \"xdr:pic\": new PicXform(),\n \"xdr:clientData\": new StaticXform({ tag: \"xdr:clientData\" })\n };\n }\n\n get tag(): string {\n return \"xdr:oneCellAnchor\";\n }\n\n prepare(model: OneCellModel, options: { index: number }): void {\n this.map[\"xdr:pic\"].prepare(model.picture, options);\n }\n\n render(xmlStream: any, model: OneCellModel): void {\n xmlStream.openNode(this.tag, { editAs: model.range.editAs || \"oneCell\" });\n\n this.map[\"xdr:from\"].render(xmlStream, model.range.tl);\n this.map[\"xdr:ext\"].render(xmlStream, model.range.ext);\n this.map[\"xdr:pic\"].render(xmlStream, model.picture);\n this.map[\"xdr:clientData\"].render(xmlStream, {});\n\n xmlStream.closeNode();\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.range.tl = this.map[\"xdr:from\"].model;\n this.model.range.ext = this.map[\"xdr:ext\"].model;\n this.model.picture = this.map[\"xdr:pic\"].model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.medium = this.reconcilePicture(model.picture, options);\n }\n}\n\nexport { OneCellAnchorXform };\n","import { colCache } from \"../../../utils/col-cache\";\nimport { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { TwoCellAnchorXform } from \"./two-cell-anchor-xform\";\nimport { OneCellAnchorXform } from \"./one-cell-anchor-xform\";\n\nfunction getAnchorType(model: any): string {\n const range = typeof model.range === \"string\" ? colCache.decode(model.range) : model.range;\n\n return range.br ? \"xdr:twoCellAnchor\" : \"xdr:oneCellAnchor\";\n}\n\ninterface DrawingModel {\n anchors: any[];\n}\n\nclass DrawingXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: DrawingModel;\n\n constructor() {\n super();\n\n this.map = {\n \"xdr:twoCellAnchor\": new TwoCellAnchorXform(),\n \"xdr:oneCellAnchor\": new OneCellAnchorXform()\n };\n this.model = { anchors: [] };\n }\n\n prepare(model: DrawingModel): void {\n model.anchors.forEach((item, index) => {\n item.anchorType = getAnchorType(item);\n const anchor = this.map[item.anchorType];\n anchor.prepare(item, { index });\n });\n }\n\n get tag(): string {\n return \"xdr:wsDr\";\n }\n\n render(xmlStream: any, model?: DrawingModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, DrawingXform.DRAWING_ATTRIBUTES);\n\n renderModel.anchors.forEach(item => {\n const anchor = this.map[item.anchorType];\n anchor.render(xmlStream, item);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n anchors: []\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.anchors.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: DrawingModel, options: any): void {\n model.anchors.forEach(anchor => {\n if (anchor.br) {\n this.map[\"xdr:twoCellAnchor\"].reconcile(anchor, options);\n } else {\n this.map[\"xdr:oneCellAnchor\"].reconcile(anchor, options);\n }\n });\n }\n\n static DRAWING_ATTRIBUTES = {\n \"xmlns:xdr\": \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\",\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\"\n };\n}\n\nexport { DrawingXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface CustomFilterModel {\n val: string;\n operator?: string;\n}\n\nclass CustomFilterXform extends BaseXform {\n declare public model: CustomFilterModel;\n\n constructor() {\n super();\n this.model = { val: \"\" };\n }\n\n get tag(): string {\n return \"customFilter\";\n }\n\n render(xmlStream: any, model: CustomFilterModel): void {\n xmlStream.leafNode(this.tag, {\n val: model.val,\n operator: model.operator\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n val: node.attributes.val,\n operator: node.attributes.operator\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { CustomFilterXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface FilterModel {\n val: string;\n}\n\nclass FilterXform extends BaseXform {\n declare public model: FilterModel;\n\n constructor() {\n super();\n this.model = { val: \"\" };\n }\n\n get tag(): string {\n return \"filter\";\n }\n\n render(xmlStream: any, model: FilterModel): void {\n xmlStream.leafNode(this.tag, {\n val: model.val\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n this.model = {\n val: node.attributes.val\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { FilterXform };\n","import { BaseXform } from \"../base-xform\";\nimport { ListXform } from \"../list-xform\";\nimport { CustomFilterXform } from \"./custom-filter-xform\";\nimport { FilterXform } from \"./filter-xform\";\n\ninterface FilterColumnModel {\n colId?: string;\n filterButton: boolean;\n customFilters?: any[];\n}\n\nclass FilterColumnXform extends BaseXform {\n declare public map: { [key: string]: ListXform };\n declare public parser: any;\n declare public model: FilterColumnModel;\n\n constructor() {\n super();\n\n this.map = {\n customFilters: new ListXform({\n tag: \"customFilters\",\n count: false,\n empty: true,\n childXform: new CustomFilterXform()\n }),\n filters: new ListXform({\n tag: \"filters\",\n count: false,\n empty: true,\n childXform: new FilterXform()\n })\n };\n this.model = { filterButton: false };\n }\n\n get tag(): string {\n return \"filterColumn\";\n }\n\n prepare(model: FilterColumnModel, options: { index: number }): void {\n model.colId = options.index.toString();\n }\n\n render(xmlStream: any, model: FilterColumnModel): void {\n if (model.customFilters) {\n xmlStream.openNode(this.tag, {\n colId: model.colId,\n hiddenButton: model.filterButton ? \"0\" : \"1\"\n });\n\n this.map.customFilters.render(xmlStream, model.customFilters);\n\n xmlStream.closeNode();\n return;\n }\n xmlStream.leafNode(this.tag, {\n colId: model.colId,\n hiddenButton: model.filterButton ? \"0\" : \"1\"\n });\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n const { attributes } = node;\n switch (node.name) {\n case this.tag:\n this.model = {\n filterButton: attributes.hiddenButton === \"0\"\n };\n return true;\n case \"dynamicFilter\":\n // Ignore dynamicFilter nodes - we don't need to preserve them for reading\n // See: https://github.com/exceljs/exceljs/issues/2972\n return true;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.customFilters = this.map.customFilters.model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n}\n\nexport { FilterColumnXform };\n","import { BaseXform } from \"../base-xform\";\nimport { FilterColumnXform } from \"./filter-column-xform\";\n\ninterface AutoFilterModel {\n autoFilterRef: string;\n columns: any[];\n}\n\nclass AutoFilterXform extends BaseXform {\n declare public map: { [key: string]: FilterColumnXform };\n declare public parser: any;\n declare public model: AutoFilterModel;\n\n constructor() {\n super();\n\n this.map = {\n filterColumn: new FilterColumnXform()\n };\n this.model = { autoFilterRef: \"\", columns: [] };\n }\n\n get tag(): string {\n return \"autoFilter\";\n }\n\n prepare(model: any): void {\n model.columns.forEach((column: any, index: number) => {\n this.map.filterColumn.prepare(column, { index });\n });\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.openNode(this.tag, { ref: model.autoFilterRef });\n\n model.columns.forEach((column: any) => {\n this.map.filterColumn.render(xmlStream, column);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.model = {\n autoFilterRef: node.attributes.ref,\n columns: []\n };\n return true;\n\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parseOpen(node);\n return true;\n }\n throw new Error(`Unexpected xml node in parseOpen: ${JSON.stringify(node)}`);\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.columns.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n throw new Error(`Unexpected xml node in parseClose: ${name}`);\n }\n }\n}\n\nexport { AutoFilterXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface TableColumnModel {\n id?: number;\n name: string;\n totalsRowLabel?: string;\n totalsRowFunction?: string;\n dxfId?: string;\n}\n\nclass TableColumnXform extends BaseXform {\n declare public model: TableColumnModel;\n\n constructor() {\n super();\n this.model = { name: \"\" };\n }\n\n get tag(): string {\n return \"tableColumn\";\n }\n\n prepare(model: TableColumnModel, options: { index: number }): void {\n model.id = options.index + 1;\n }\n\n render(xmlStream: any, model: TableColumnModel): void {\n xmlStream.leafNode(this.tag, {\n id: model.id!.toString(),\n name: model.name,\n totalsRowLabel: model.totalsRowLabel,\n totalsRowFunction: model.totalsRowFunction,\n dxfId: model.dxfId\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n const { attributes } = node;\n this.model = {\n name: attributes.name,\n totalsRowLabel: attributes.totalsRowLabel,\n totalsRowFunction: attributes.totalsRowFunction,\n dxfId: attributes.dxfId\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TableColumnXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface TableStyleModel {\n theme?: string | null;\n showFirstColumn: boolean;\n showLastColumn: boolean;\n showRowStripes: boolean;\n showColumnStripes: boolean;\n}\n\nclass TableStyleInfoXform extends BaseXform {\n declare public model: TableStyleModel;\n\n constructor() {\n super();\n this.model = {\n theme: null,\n showFirstColumn: false,\n showLastColumn: false,\n showRowStripes: false,\n showColumnStripes: false\n };\n }\n\n get tag(): string {\n return \"tableStyleInfo\";\n }\n\n render(xmlStream: any, model: TableStyleModel): void {\n xmlStream.leafNode(this.tag, {\n name: model.theme ? model.theme : undefined,\n showFirstColumn: model.showFirstColumn ? \"1\" : \"0\",\n showLastColumn: model.showLastColumn ? \"1\" : \"0\",\n showRowStripes: model.showRowStripes ? \"1\" : \"0\",\n showColumnStripes: model.showColumnStripes ? \"1\" : \"0\"\n });\n }\n\n parseOpen(node: any): boolean {\n if (node.name === this.tag) {\n const { attributes } = node;\n this.model = {\n theme: attributes.name ? attributes.name : null,\n showFirstColumn: attributes.showFirstColumn === \"1\",\n showLastColumn: attributes.showLastColumn === \"1\",\n showRowStripes: attributes.showRowStripes === \"1\",\n showColumnStripes: attributes.showColumnStripes === \"1\"\n };\n return true;\n }\n return false;\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { TableStyleInfoXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { ListXform } from \"../list-xform\";\nimport { AutoFilterXform } from \"./auto-filter-xform\";\nimport { TableColumnXform } from \"./table-column-xform\";\nimport { TableStyleInfoXform } from \"./table-style-info-xform\";\n\ninterface TableModel {\n id?: number;\n name: string;\n displayName?: string;\n ref?: string;\n tableRef: string;\n totalsRow?: boolean;\n headerRow?: boolean;\n columns?: any[];\n rows?: any[];\n autoFilterRef?: string;\n style?: any;\n}\n\nclass TableXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: TableModel;\n\n constructor() {\n super();\n\n this.map = {\n autoFilter: new AutoFilterXform(),\n tableColumns: new ListXform({\n tag: \"tableColumns\",\n count: true,\n empty: true,\n childXform: new TableColumnXform()\n }),\n tableStyleInfo: new TableStyleInfoXform()\n };\n this.model = {\n id: 0,\n name: \"\",\n tableRef: \"\",\n columns: []\n };\n }\n\n prepare(model: TableModel, options: any): void {\n this.map.autoFilter.prepare(model);\n this.map.tableColumns.prepare(model.columns, options);\n }\n\n get tag(): string {\n return \"table\";\n }\n\n render(xmlStream: any, model: TableModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...TableXform.TABLE_ATTRIBUTES,\n id: model.id,\n name: model.name,\n displayName: model.displayName || model.name,\n ref: model.tableRef,\n totalsRowCount: model.totalsRow ? \"1\" : undefined,\n totalsRowShown: model.totalsRow ? undefined : \"1\",\n headerRowCount: model.headerRow ? \"1\" : \"0\"\n });\n\n this.map.autoFilter.render(xmlStream, model);\n this.map.tableColumns.render(xmlStream, model.columns);\n this.map.tableStyleInfo.render(xmlStream, model.style);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n const { name, attributes } = node;\n switch (name) {\n case this.tag:\n this.reset();\n this.model = {\n name: attributes.name,\n displayName: attributes.displayName || attributes.name,\n tableRef: attributes.ref,\n totalsRow: attributes.totalsRowCount === \"1\",\n headerRow: attributes.headerRowCount === \"1\"\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.columns = this.map.tableColumns.model;\n if (this.map.autoFilter.model) {\n this.model.autoFilterRef = this.map.autoFilter.model.autoFilterRef;\n this.map.autoFilter.model.columns.forEach((column: any, index: number) => {\n this.model.columns[index].filterButton = column.filterButton;\n });\n }\n this.model.style = this.map.tableStyleInfo.model;\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: TableModel, options: any): void {\n // Map tableRef to ref for Table constructor compatibility\n if (model.tableRef && !model.ref) {\n model.ref = model.tableRef;\n }\n // Add empty rows array if not present (tables loaded from file don't have row data)\n if (!model.rows) {\n model.rows = [];\n }\n // fetch the dfxs from styles\n model.columns.forEach(column => {\n if (column.dxfId !== undefined) {\n column.style = options.styles.getDxfStyle(column.dxfId);\n }\n });\n }\n\n static TABLE_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"xr xr3\",\n \"xmlns:xr\": \"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\",\n \"xmlns:xr3\": \"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"\n // 'xr:uid': '{00000000-000C-0000-FFFF-FFFF00000000}',\n };\n}\n\nexport { TableXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { xmlEncode, xmlDecode } from \"../../../utils/utils\";\nimport { BaseXform } from \"../base-xform\";\nimport type { PivotTableSource } from \"../../../doc/pivot-table\";\n\n/**\n * Model for generating pivot cache records (with live source)\n */\ninterface CacheRecordsModel {\n source: PivotTableSource;\n cacheFields: any[];\n}\n\n/**\n * Parsed record value - can be:\n * - { type: 'x', value: number } - Shared item index\n * - { type: 'n', value: number } - Numeric value\n * - { type: 's', value: string } - String value\n * - { type: 'b', value: boolean } - Boolean value\n * - { type: 'm' } - Missing/null value\n * - { type: 'd', value: Date } - Date value\n * - { type: 'e', value: string } - Error value\n */\ninterface RecordValue {\n type: \"x\" | \"n\" | \"s\" | \"b\" | \"m\" | \"d\" | \"e\";\n value?: any;\n}\n\n/**\n * Parsed cache records model\n */\ninterface ParsedCacheRecordsModel {\n // Array of records, each record is an array of values\n records: RecordValue[][];\n // Record count\n count: number;\n // Flag indicating this was loaded from file (not newly created)\n isLoaded?: boolean;\n}\n\nclass PivotCacheRecordsXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedCacheRecordsModel | null;\n\n // Parser state\n private currentRecord: RecordValue[] | null;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.currentRecord = null;\n }\n\n prepare(_model: any): void {\n // No preparation needed\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotCacheRecords.html\n return \"pivotCacheRecords\";\n }\n\n reset(): void {\n this.model = null;\n this.currentRecord = null;\n }\n\n /**\n * Render pivot cache records XML.\n * Supports both newly created models (with PivotTableSource) and loaded models.\n */\n render(xmlStream: any, model: CacheRecordsModel | ParsedCacheRecordsModel): void {\n // Check if this is a loaded model\n const isLoaded = (model as ParsedCacheRecordsModel).isLoaded || !(\"source\" in model);\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedCacheRecordsModel);\n } else {\n this.renderNew(xmlStream, model as CacheRecordsModel);\n }\n }\n\n /**\n * Render newly created pivot cache records\n */\n private renderNew(xmlStream: any, model: CacheRecordsModel): void {\n const { source, cacheFields } = model;\n const sourceBodyRows = source.getSheetValues().slice(2);\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheRecordsXform.PIVOT_CACHE_RECORDS_ATTRIBUTES,\n count: sourceBodyRows.length\n });\n xmlStream.writeXml(this.renderTableNew(sourceBodyRows, cacheFields));\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot cache records\n */\n private renderLoaded(xmlStream: any, model: ParsedCacheRecordsModel): void {\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheRecordsXform.PIVOT_CACHE_RECORDS_ATTRIBUTES,\n count: model.count\n });\n\n // Render each record\n for (const record of model.records) {\n xmlStream.writeXml(\"\\n <r>\");\n for (const value of record) {\n xmlStream.writeXml(\"\\n \");\n xmlStream.writeXml(this.renderRecordValue(value));\n }\n xmlStream.writeXml(\"\\n </r>\");\n }\n\n xmlStream.closeNode();\n }\n\n /**\n * Render a single record value to XML\n */\n private renderRecordValue(value: RecordValue): string {\n switch (value.type) {\n case \"x\":\n return `<x v=\"${value.value}\" />`;\n case \"n\":\n return `<n v=\"${value.value}\" />`;\n case \"s\":\n return `<s v=\"${xmlEncode(String(value.value))}\" />`;\n case \"b\":\n return `<b v=\"${value.value ? \"1\" : \"0\"}\" />`;\n case \"m\":\n return \"<m />\";\n case \"d\":\n return `<d v=\"${(value.value as Date).toISOString()}\" />`;\n case \"e\":\n return `<e v=\"${value.value}\" />`;\n default:\n return \"<m />\";\n }\n }\n\n // Helper methods for rendering new records\n private renderTableNew(sourceBodyRows: any[], cacheFields: any[]): string {\n const parts: string[] = [];\n for (const row of sourceBodyRows) {\n const realRow = row.slice(1);\n parts.push(\"\\n <r>\");\n for (let i = 0; i < realRow.length; i++) {\n parts.push(\"\\n \");\n parts.push(this.renderCellNew(realRow[i], cacheFields[i].sharedItems));\n }\n parts.push(\"\\n </r>\");\n }\n return parts.join(\"\");\n }\n\n private renderCellNew(value: any, sharedItems: string[] | null): string {\n // Handle null/undefined values first\n if (value === null || value === undefined) {\n return \"<m />\";\n }\n\n // no shared items\n if (sharedItems === null) {\n if (Number.isFinite(value)) {\n return `<n v=\"${value}\" />`;\n }\n return `<s v=\"${xmlEncode(String(value))}\" />`;\n }\n\n // shared items\n const sharedItemsIndex = sharedItems.indexOf(value);\n if (sharedItemsIndex < 0) {\n throw new Error(`${JSON.stringify(value)} not in sharedItems ${JSON.stringify(sharedItems)}`);\n }\n return `<x v=\"${sharedItemsIndex}\" />`;\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case this.tag:\n // pivotCacheRecords root element\n this.reset();\n this.model = {\n records: [],\n count: parseInt(attributes.count || \"0\", 10),\n isLoaded: true\n };\n break;\n\n case \"r\":\n // Start of a new record\n this.currentRecord = [];\n break;\n\n case \"x\":\n // Shared item index\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"x\",\n value: parseInt(attributes.v || \"0\", 10)\n });\n }\n break;\n\n case \"n\":\n // Numeric value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"n\",\n value: parseFloat(attributes.v || \"0\")\n });\n }\n break;\n\n case \"s\":\n // String value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"s\",\n value: xmlDecode(attributes.v || \"\")\n });\n }\n break;\n\n case \"b\":\n // Boolean value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"b\",\n value: attributes.v === \"1\"\n });\n }\n break;\n\n case \"m\":\n // Missing/null value\n if (this.currentRecord) {\n this.currentRecord.push({ type: \"m\" });\n }\n break;\n\n case \"d\":\n // Date value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"d\",\n value: new Date(attributes.v || \"\")\n });\n }\n break;\n\n case \"e\":\n // Error value\n if (this.currentRecord) {\n this.currentRecord.push({\n type: \"e\",\n value: attributes.v || \"\"\n });\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in cache records elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n // End of pivotCacheRecords\n return false;\n\n case \"r\":\n // End of record - add to model\n if (this.model && this.currentRecord) {\n this.model.records.push(this.currentRecord);\n this.currentRecord = null;\n }\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_CACHE_RECORDS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"xr\",\n \"xmlns:xr\": \"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"\n };\n}\n\nexport { PivotCacheRecordsXform, type ParsedCacheRecordsModel };\n","import { xmlEncode } from \"../../../utils/utils\";\n\ninterface CacheFieldConfig {\n name: string;\n sharedItems: string[] | null;\n}\n\nclass CacheField {\n declare private name: string;\n declare private sharedItems: string[] | null;\n\n constructor({ name, sharedItems }: CacheFieldConfig) {\n // string type\n //\n // {\n // 'name': 'A',\n // 'sharedItems': ['a1', 'a2', 'a3']\n // }\n //\n // or\n //\n // integer type\n //\n // {\n // 'name': 'D',\n // 'sharedItems': null\n // }\n this.name = name;\n this.sharedItems = sharedItems;\n }\n\n render(): string {\n // PivotCache Field: http://www.datypic.com/sc/ooxml/e-ssml_cacheField-1.html\n // Shared Items: http://www.datypic.com/sc/ooxml/e-ssml_sharedItems-1.html\n\n // Escape XML special characters in name attribute\n const escapedName = xmlEncode(this.name);\n\n // integer types\n if (this.sharedItems === null) {\n // TK(2023-07-18): left out attributes... minValue=\"5\" maxValue=\"45\"\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\" containsNumber=\"1\" containsInteger=\"1\" />\n </cacheField>`;\n }\n\n // string types - escape XML special characters in each shared item value\n return `<cacheField name=\"${escapedName}\" numFmtId=\"0\">\n <sharedItems count=\"${this.sharedItems.length}\">\n ${this.sharedItems.map(item => `<s v=\"${xmlEncode(String(item))}\" />`).join(\"\")}\n </sharedItems>\n </cacheField>`;\n }\n}\n\nexport { CacheField };\n","import { BaseXform } from \"../base-xform\";\nimport { xmlDecode } from \"../../../utils/utils\";\n\n/**\n * Parsed cache field model containing name and shared items (if any)\n */\ninterface CacheFieldModel {\n name: string;\n sharedItems: string[] | null;\n // Numeric field metadata\n containsNumber?: boolean;\n containsInteger?: boolean;\n minValue?: number;\n maxValue?: number;\n}\n\n/**\n * Xform for parsing individual <cacheField> elements within a pivot cache definition.\n *\n * Example XML:\n * ```xml\n * <cacheField name=\"Category\" numFmtId=\"0\">\n * <sharedItems count=\"3\">\n * <s v=\"A\" />\n * <s v=\"B\" />\n * <s v=\"C\" />\n * </sharedItems>\n * </cacheField>\n *\n * <cacheField name=\"Value\" numFmtId=\"0\">\n * <sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\"\n * containsNumber=\"1\" containsInteger=\"1\" minValue=\"5\" maxValue=\"45\" />\n * </cacheField>\n * ```\n */\nclass CacheFieldXform extends BaseXform {\n declare public model: CacheFieldModel | null;\n private inSharedItems: boolean;\n\n constructor() {\n super();\n this.model = null;\n this.inSharedItems = false;\n }\n\n get tag(): string {\n return \"cacheField\";\n }\n\n reset(): void {\n this.model = null;\n this.inSharedItems = false;\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case \"cacheField\":\n // Initialize the model with field name\n this.model = {\n name: xmlDecode(attributes.name || \"\"),\n sharedItems: null\n };\n break;\n\n case \"sharedItems\":\n this.inSharedItems = true;\n // Check if this is a numeric field (no string items)\n if (attributes.containsNumber === \"1\" || attributes.containsInteger === \"1\") {\n if (this.model) {\n this.model.containsNumber = attributes.containsNumber === \"1\";\n this.model.containsInteger = attributes.containsInteger === \"1\";\n if (attributes.minValue !== undefined) {\n this.model.minValue = parseFloat(attributes.minValue);\n }\n if (attributes.maxValue !== undefined) {\n this.model.maxValue = parseFloat(attributes.maxValue);\n }\n // Numeric fields have sharedItems = null\n this.model.sharedItems = null;\n }\n } else {\n // String field - initialize sharedItems array if count > 0\n if (this.model) {\n const count = parseInt(attributes.count || \"0\", 10);\n if (count > 0) {\n this.model.sharedItems = [];\n }\n }\n }\n break;\n\n case \"s\":\n // String value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n // Decode XML entities in the value\n const value = xmlDecode(attributes.v || \"\");\n this.model.sharedItems!.push(value);\n }\n break;\n\n case \"n\":\n // Numeric value in sharedItems (less common, but possible)\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = parseFloat(attributes.v || \"0\");\n this.model.sharedItems!.push(value as any);\n }\n break;\n\n case \"b\":\n // Boolean value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = attributes.v === \"1\";\n this.model.sharedItems!.push(value as any);\n }\n break;\n\n case \"e\":\n // Error value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = `#${attributes.v || \"ERROR!\"}`;\n this.model.sharedItems!.push(value);\n }\n break;\n\n case \"m\":\n // Missing/null value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n this.model.sharedItems!.push(null as any);\n }\n break;\n\n case \"d\":\n // Date value in sharedItems\n if (this.inSharedItems && this.model?.sharedItems !== null) {\n const value = new Date(attributes.v || \"\");\n this.model.sharedItems!.push(value as any);\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in cacheField elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"cacheField\":\n // End of this cacheField element\n return false;\n\n case \"sharedItems\":\n this.inSharedItems = false;\n break;\n }\n\n return true;\n }\n}\n\nexport { CacheFieldXform, type CacheFieldModel };\n","import { BaseXform } from \"../base-xform\";\nimport { CacheField } from \"./cache-field\";\nimport { CacheFieldXform, type CacheFieldModel } from \"./cache-field-xform\";\nimport { XmlStream } from \"../../../utils/xml-stream\";\nimport type { PivotTableSource } from \"../../../doc/pivot-table\";\n\n/**\n * Model for parsed pivot cache definition\n */\ninterface ParsedCacheDefinitionModel {\n // Source worksheet reference\n sourceRef?: string;\n sourceSheet?: string;\n // Cache fields with their shared items\n cacheFields: CacheFieldModel[];\n // Record count\n recordCount?: number;\n // Relationship ID for cache records\n rId?: string;\n // Additional attributes to preserve\n refreshOnLoad?: string;\n refreshedBy?: string;\n refreshedDate?: string;\n createdVersion?: string;\n refreshedVersion?: string;\n minRefreshableVersion?: string;\n // Flag indicating this was loaded from file (not newly created)\n isLoaded?: boolean;\n}\n\n/**\n * Model for generating pivot cache definition (with live source)\n */\ninterface CacheDefinitionModel {\n source: PivotTableSource;\n cacheFields: any[];\n}\n\nclass PivotCacheDefinitionXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedCacheDefinitionModel | null;\n\n // Parser state\n private currentCacheField: CacheFieldXform | null;\n private inCacheFields: boolean;\n private inCacheSource: boolean;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.currentCacheField = null;\n this.inCacheFields = false;\n this.inCacheSource = false;\n }\n\n prepare(_model: any): void {\n // No preparation needed for writing\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotCacheDefinition.html\n return \"pivotCacheDefinition\";\n }\n\n reset(): void {\n this.model = null;\n this.currentCacheField = null;\n this.inCacheFields = false;\n this.inCacheSource = false;\n }\n\n /**\n * Render pivot cache definition XML.\n * Supports both newly created models (with PivotTableSource) and loaded models.\n */\n render(xmlStream: any, model: CacheDefinitionModel | ParsedCacheDefinitionModel): void {\n // Check if this is a loaded model (has isLoaded flag or no source property)\n const isLoaded = (model as ParsedCacheDefinitionModel).isLoaded || !(\"source\" in model);\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedCacheDefinitionModel);\n } else {\n this.renderNew(xmlStream, model as CacheDefinitionModel);\n }\n }\n\n /**\n * Render newly created pivot cache definition\n */\n private renderNew(xmlStream: any, model: CacheDefinitionModel): void {\n const { source, cacheFields } = model;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,\n \"r:id\": \"rId1\",\n refreshOnLoad: \"1\", // important for our implementation to work\n refreshedBy: \"Author\",\n refreshedDate: \"45125.026046874998\",\n createdVersion: \"8\",\n refreshedVersion: \"8\",\n minRefreshableVersion: \"3\",\n recordCount: cacheFields.length + 1\n });\n\n xmlStream.openNode(\"cacheSource\", { type: \"worksheet\" });\n xmlStream.leafNode(\"worksheetSource\", {\n ref: source.dimensions.shortRange,\n sheet: source.name\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"cacheFields\", { count: cacheFields.length });\n // Note: keeping this pretty-printed for now to ease debugging.\n xmlStream.writeXml(\n cacheFields.map((cacheField: any) => new CacheField(cacheField).render()).join(\"\\n \")\n );\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot cache definition (preserving original structure)\n */\n private renderLoaded(xmlStream: any, model: ParsedCacheDefinitionModel): void {\n const { cacheFields, sourceRef, sourceSheet, recordCount } = model;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,\n \"r:id\": model.rId || \"rId1\",\n refreshOnLoad: model.refreshOnLoad || \"1\",\n refreshedBy: model.refreshedBy || \"Author\",\n refreshedDate: model.refreshedDate || \"45125.026046874998\",\n createdVersion: model.createdVersion || \"8\",\n refreshedVersion: model.refreshedVersion || \"8\",\n minRefreshableVersion: model.minRefreshableVersion || \"3\",\n recordCount: recordCount || cacheFields.length + 1\n });\n\n xmlStream.openNode(\"cacheSource\", { type: \"worksheet\" });\n xmlStream.leafNode(\"worksheetSource\", {\n ref: sourceRef,\n sheet: sourceSheet\n });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"cacheFields\", { count: cacheFields.length });\n xmlStream.writeXml(\n cacheFields\n .map((cacheField: CacheFieldModel) => new CacheField(cacheField).render())\n .join(\"\\n \")\n );\n xmlStream.closeNode();\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n // Delegate to current cacheField parser if active\n if (this.currentCacheField) {\n this.currentCacheField.parseOpen(node);\n return true;\n }\n\n switch (name) {\n case this.tag:\n // pivotCacheDefinition root element\n this.reset();\n this.model = {\n cacheFields: [],\n rId: attributes[\"r:id\"],\n refreshOnLoad: attributes.refreshOnLoad,\n refreshedBy: attributes.refreshedBy,\n refreshedDate: attributes.refreshedDate,\n createdVersion: attributes.createdVersion,\n refreshedVersion: attributes.refreshedVersion,\n minRefreshableVersion: attributes.minRefreshableVersion,\n recordCount: attributes.recordCount ? parseInt(attributes.recordCount, 10) : undefined,\n isLoaded: true\n };\n break;\n\n case \"cacheSource\":\n this.inCacheSource = true;\n break;\n\n case \"worksheetSource\":\n if (this.inCacheSource && this.model) {\n this.model.sourceRef = attributes.ref;\n this.model.sourceSheet = attributes.sheet;\n }\n break;\n\n case \"cacheFields\":\n this.inCacheFields = true;\n break;\n\n case \"cacheField\":\n if (this.inCacheFields) {\n this.currentCacheField = new CacheFieldXform();\n this.currentCacheField.parseOpen(node);\n }\n break;\n }\n\n return true;\n }\n\n parseText(text: string): void {\n if (this.currentCacheField) {\n this.currentCacheField.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n // Delegate to current cacheField parser if active\n if (this.currentCacheField) {\n if (!this.currentCacheField.parseClose(name)) {\n // cacheField parsing complete, add to model\n if (this.model && this.currentCacheField.model) {\n this.model.cacheFields.push(this.currentCacheField.model);\n }\n this.currentCacheField = null;\n }\n return true;\n }\n\n switch (name) {\n case this.tag:\n // End of pivotCacheDefinition\n return false;\n\n case \"cacheSource\":\n this.inCacheSource = false;\n break;\n\n case \"cacheFields\":\n this.inCacheFields = false;\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_CACHE_DEFINITION_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"xr\",\n \"xmlns:xr\": \"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"\n };\n}\n\nexport { PivotCacheDefinitionXform, type ParsedCacheDefinitionModel };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { xmlEncode, xmlDecode } from \"../../../utils/utils\";\nimport { BaseXform } from \"../base-xform\";\n\n/**\n * Model for generating pivot table (with live source)\n */\ninterface PivotTableModel {\n rows: number[];\n columns: number[];\n values: number[];\n metric: \"sum\" | \"count\";\n cacheFields: any[];\n cacheId: number;\n applyWidthHeightFormats: \"0\" | \"1\";\n}\n\n/**\n * Parsed pivot field\n */\ninterface ParsedPivotField {\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n dataField?: boolean;\n items?: number[];\n compact?: boolean;\n outline?: boolean;\n showAll?: boolean;\n defaultSubtotal?: boolean;\n}\n\n/**\n * Parsed data field\n */\ninterface ParsedDataField {\n name: string;\n fld: number;\n baseField?: number;\n baseItem?: number;\n subtotal?:\n | \"sum\"\n | \"count\"\n | \"average\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"countNums\"\n | \"stdDev\"\n | \"stdDevP\"\n | \"var\"\n | \"varP\";\n}\n\n/**\n * Parsed pivot table model (loaded from file)\n */\ninterface ParsedPivotTableModel {\n // Core identifiers\n name?: string;\n cacheId: number;\n uid?: string;\n\n // Location info\n location?: {\n ref: string;\n firstHeaderRow?: number;\n firstDataRow?: number;\n firstDataCol?: number;\n };\n\n // Field configurations\n pivotFields: ParsedPivotField[];\n rowFields: number[]; // Field indices for rows\n colFields: number[]; // Field indices for columns\n dataFields: ParsedDataField[];\n\n // Style and formatting\n applyNumberFormats?: string;\n applyBorderFormats?: string;\n applyFontFormats?: string;\n applyPatternFormats?: string;\n applyAlignmentFormats?: string;\n applyWidthHeightFormats?: string;\n dataCaption?: string;\n styleName?: string;\n\n // Version info\n updatedVersion?: string;\n minRefreshableVersion?: string;\n createdVersion?: string;\n\n // Other attributes\n useAutoFormatting?: boolean;\n itemPrintTitles?: boolean;\n indent?: number;\n compact?: boolean;\n compactData?: boolean;\n multipleFieldFilters?: boolean;\n\n // Row/col items (for grand totals etc)\n rowItems?: any[];\n colItems?: any[];\n\n // Flag indicating this was loaded from file\n isLoaded?: boolean;\n\n // Extended attributes to preserve any custom extensions\n extensions?: any[];\n}\n\nclass PivotTableXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public model: ParsedPivotTableModel | null;\n\n // Parser state\n private inPivotFields: boolean;\n private inRowFields: boolean;\n private inColFields: boolean;\n private inDataFields: boolean;\n private inRowItems: boolean;\n private inColItems: boolean;\n private inLocation: boolean;\n private currentPivotField: ParsedPivotField | null;\n private inItems: boolean;\n private inPivotTableStyleInfo: boolean;\n\n constructor() {\n super();\n\n this.map = {};\n this.model = null;\n this.inPivotFields = false;\n this.inRowFields = false;\n this.inColFields = false;\n this.inDataFields = false;\n this.inRowItems = false;\n this.inColItems = false;\n this.inLocation = false;\n this.currentPivotField = null;\n this.inItems = false;\n this.inPivotTableStyleInfo = false;\n }\n\n prepare(_model: any): void {\n // No preparation needed\n }\n\n get tag(): string {\n // http://www.datypic.com/sc/ooxml/e-ssml_pivotTableDefinition.html\n return \"pivotTableDefinition\";\n }\n\n reset(): void {\n this.model = null;\n this.inPivotFields = false;\n this.inRowFields = false;\n this.inColFields = false;\n this.inDataFields = false;\n this.inRowItems = false;\n this.inColItems = false;\n this.inLocation = false;\n this.currentPivotField = null;\n this.inItems = false;\n this.inPivotTableStyleInfo = false;\n }\n\n /**\n * Render pivot table XML.\n * Supports both newly created models and loaded models.\n */\n render(xmlStream: any, model: PivotTableModel | ParsedPivotTableModel): void {\n const isLoaded = (model as ParsedPivotTableModel).isLoaded;\n\n if (isLoaded) {\n this.renderLoaded(xmlStream, model as ParsedPivotTableModel);\n } else {\n this.renderNew(xmlStream, model as PivotTableModel);\n }\n }\n\n /**\n * Render newly created pivot table\n */\n private renderNew(xmlStream: any, model: PivotTableModel): void {\n const { rows, columns, values, cacheFields, cacheId, applyWidthHeightFormats } = model;\n\n // Generate unique UID for each pivot table to prevent Excel treating them as identical\n const uniqueUid = `{${crypto.randomUUID().toUpperCase()}}`;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,\n \"xr:uid\": uniqueUid,\n name: \"PivotTable2\",\n cacheId,\n applyNumberFormats: \"0\",\n applyBorderFormats: \"0\",\n applyFontFormats: \"0\",\n applyPatternFormats: \"0\",\n applyAlignmentFormats: \"0\",\n applyWidthHeightFormats,\n dataCaption: \"Values\",\n updatedVersion: \"8\",\n minRefreshableVersion: \"3\",\n useAutoFormatting: \"1\",\n itemPrintTitles: \"1\",\n createdVersion: \"8\",\n indent: \"0\",\n compact: \"0\",\n compactData: \"0\",\n multipleFieldFilters: \"0\"\n });\n\n xmlStream.writeXml(`\n <location ref=\"A3:E15\" firstHeaderRow=\"1\" firstDataRow=\"2\" firstDataCol=\"1\" />\n <pivotFields count=\"${cacheFields.length}\">\n ${renderPivotFields(model)}\n </pivotFields>\n <rowFields count=\"${rows.length}\">\n ${rows.map(rowIndex => `<field x=\"${rowIndex}\" />`).join(\"\\n \")}\n </rowFields>\n <rowItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </rowItems>\n <colFields count=\"${columns.length === 0 ? 1 : columns.length}\">\n ${\n columns.length === 0\n ? '<field x=\"-2\" />'\n : columns.map(columnIndex => `<field x=\"${columnIndex}\" />`).join(\"\\n \")\n }\n </colFields>\n <colItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </colItems>\n <dataFields count=\"${values.length}\">\n ${buildDataFields(cacheFields, values, model.metric)}\n </dataFields>\n <pivotTableStyleInfo\n name=\"PivotStyleLight16\"\n showRowHeaders=\"1\"\n showColHeaders=\"1\"\n showRowStripes=\"0\"\n showColStripes=\"0\"\n showLastColumn=\"1\"\n />\n <extLst>\n <ext\n uri=\"{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}\"\n xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n >\n <x14:pivotTableDefinition\n hideValuesRow=\"1\"\n xmlns:xm=\"http://schemas.microsoft.com/office/excel/2006/main\"\n />\n </ext>\n <ext\n uri=\"{747A6164-185A-40DC-8AA5-F01512510D54}\"\n xmlns:xpdl=\"http://schemas.microsoft.com/office/spreadsheetml/2016/pivotdefaultlayout\"\n >\n <xpdl:pivotTableDefinition16\n EnabledSubtotalsDefault=\"0\"\n SubtotalsOnTopDefault=\"0\"\n />\n </ext>\n </extLst>\n `);\n\n xmlStream.closeNode();\n }\n\n /**\n * Render loaded pivot table (preserving original structure)\n */\n private renderLoaded(xmlStream: any, model: ParsedPivotTableModel): void {\n const uniqueUid = model.uid || `{${crypto.randomUUID().toUpperCase()}}`;\n\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, {\n ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,\n \"xr:uid\": uniqueUid,\n name: model.name || \"PivotTable1\",\n cacheId: model.cacheId,\n applyNumberFormats: model.applyNumberFormats || \"0\",\n applyBorderFormats: model.applyBorderFormats || \"0\",\n applyFontFormats: model.applyFontFormats || \"0\",\n applyPatternFormats: model.applyPatternFormats || \"0\",\n applyAlignmentFormats: model.applyAlignmentFormats || \"0\",\n applyWidthHeightFormats: model.applyWidthHeightFormats || \"0\",\n dataCaption: model.dataCaption || \"Values\",\n updatedVersion: model.updatedVersion || \"8\",\n minRefreshableVersion: model.minRefreshableVersion || \"3\",\n useAutoFormatting: model.useAutoFormatting ? \"1\" : \"0\",\n itemPrintTitles: model.itemPrintTitles ? \"1\" : \"0\",\n createdVersion: model.createdVersion || \"8\",\n indent: model.indent !== undefined ? String(model.indent) : \"0\",\n compact: model.compact ? \"1\" : \"0\",\n compactData: model.compactData ? \"1\" : \"0\",\n multipleFieldFilters: model.multipleFieldFilters ? \"1\" : \"0\"\n });\n\n // Location\n if (model.location) {\n xmlStream.leafNode(\"location\", {\n ref: model.location.ref,\n firstHeaderRow: model.location.firstHeaderRow,\n firstDataRow: model.location.firstDataRow,\n firstDataCol: model.location.firstDataCol\n });\n }\n\n // Pivot fields\n if (model.pivotFields.length > 0) {\n xmlStream.openNode(\"pivotFields\", { count: model.pivotFields.length });\n for (const pivotField of model.pivotFields) {\n this.renderPivotFieldLoaded(xmlStream, pivotField);\n }\n xmlStream.closeNode();\n }\n\n // Row fields\n if (model.rowFields.length > 0) {\n xmlStream.openNode(\"rowFields\", { count: model.rowFields.length });\n for (const fieldIndex of model.rowFields) {\n xmlStream.leafNode(\"field\", { x: fieldIndex });\n }\n xmlStream.closeNode();\n }\n\n // Row items (simplified - just grand total)\n xmlStream.writeXml(`\n <rowItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </rowItems>`);\n\n // Col fields\n const colFieldCount = model.colFields.length === 0 ? 1 : model.colFields.length;\n xmlStream.openNode(\"colFields\", { count: colFieldCount });\n if (model.colFields.length === 0) {\n xmlStream.leafNode(\"field\", { x: -2 });\n } else {\n for (const fieldIndex of model.colFields) {\n xmlStream.leafNode(\"field\", { x: fieldIndex });\n }\n }\n xmlStream.closeNode();\n\n // Col items (simplified - just grand total)\n xmlStream.writeXml(`\n <colItems count=\"1\">\n <i t=\"grand\"><x /></i>\n </colItems>`);\n\n // Data fields\n if (model.dataFields.length > 0) {\n xmlStream.openNode(\"dataFields\", { count: model.dataFields.length });\n for (const dataField of model.dataFields) {\n const attrs: any = {\n name: dataField.name,\n fld: dataField.fld,\n baseField: dataField.baseField ?? 0,\n baseItem: dataField.baseItem ?? 0\n };\n if (dataField.subtotal && dataField.subtotal !== \"sum\") {\n attrs.subtotal = dataField.subtotal;\n }\n xmlStream.leafNode(\"dataField\", attrs);\n }\n xmlStream.closeNode();\n }\n\n // Style info\n xmlStream.leafNode(\"pivotTableStyleInfo\", {\n name: model.styleName || \"PivotStyleLight16\",\n showRowHeaders: \"1\",\n showColHeaders: \"1\",\n showRowStripes: \"0\",\n showColStripes: \"0\",\n showLastColumn: \"1\"\n });\n\n // Extensions\n xmlStream.writeXml(`\n <extLst>\n <ext\n uri=\"{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}\"\n xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"\n >\n <x14:pivotTableDefinition\n hideValuesRow=\"1\"\n xmlns:xm=\"http://schemas.microsoft.com/office/excel/2006/main\"\n />\n </ext>\n <ext\n uri=\"{747A6164-185A-40DC-8AA5-F01512510D54}\"\n xmlns:xpdl=\"http://schemas.microsoft.com/office/spreadsheetml/2016/pivotdefaultlayout\"\n >\n <xpdl:pivotTableDefinition16\n EnabledSubtotalsDefault=\"0\"\n SubtotalsOnTopDefault=\"0\"\n />\n </ext>\n </extLst>\n `);\n\n xmlStream.closeNode();\n }\n\n /**\n * Render a loaded pivot field\n */\n private renderPivotFieldLoaded(xmlStream: any, field: ParsedPivotField): void {\n const attrs: any = {\n compact: field.compact ? \"1\" : \"0\",\n outline: field.outline ? \"1\" : \"0\",\n showAll: field.showAll ? \"1\" : \"0\",\n defaultSubtotal: field.defaultSubtotal ? \"1\" : \"0\"\n };\n\n if (field.axis) {\n attrs.axis = field.axis;\n }\n if (field.dataField) {\n attrs.dataField = \"1\";\n }\n\n if (field.items && field.items.length > 0) {\n xmlStream.openNode(\"pivotField\", attrs);\n xmlStream.openNode(\"items\", { count: field.items.length + 1 });\n for (const itemIndex of field.items) {\n xmlStream.leafNode(\"item\", { x: itemIndex });\n }\n // Grand total item\n xmlStream.writeXml('<item t=\"default\" />');\n xmlStream.closeNode(); // items\n xmlStream.closeNode(); // pivotField\n } else {\n xmlStream.leafNode(\"pivotField\", attrs);\n }\n }\n\n parseOpen(node: any): boolean {\n const { name, attributes } = node;\n\n switch (name) {\n case this.tag:\n // pivotTableDefinition root element\n this.reset();\n this.model = {\n name: attributes.name,\n cacheId: parseInt(attributes.cacheId || \"0\", 10),\n uid: attributes[\"xr:uid\"],\n pivotFields: [],\n rowFields: [],\n colFields: [],\n dataFields: [],\n applyNumberFormats: attributes.applyNumberFormats,\n applyBorderFormats: attributes.applyBorderFormats,\n applyFontFormats: attributes.applyFontFormats,\n applyPatternFormats: attributes.applyPatternFormats,\n applyAlignmentFormats: attributes.applyAlignmentFormats,\n applyWidthHeightFormats: attributes.applyWidthHeightFormats,\n dataCaption: attributes.dataCaption,\n updatedVersion: attributes.updatedVersion,\n minRefreshableVersion: attributes.minRefreshableVersion,\n createdVersion: attributes.createdVersion,\n useAutoFormatting: attributes.useAutoFormatting === \"1\",\n itemPrintTitles: attributes.itemPrintTitles === \"1\",\n indent: attributes.indent ? parseInt(attributes.indent, 10) : 0,\n compact: attributes.compact === \"1\",\n compactData: attributes.compactData === \"1\",\n multipleFieldFilters: attributes.multipleFieldFilters === \"1\",\n isLoaded: true\n };\n break;\n\n case \"location\":\n if (this.model) {\n this.model.location = {\n ref: attributes.ref,\n firstHeaderRow: attributes.firstHeaderRow\n ? parseInt(attributes.firstHeaderRow, 10)\n : undefined,\n firstDataRow: attributes.firstDataRow\n ? parseInt(attributes.firstDataRow, 10)\n : undefined,\n firstDataCol: attributes.firstDataCol\n ? parseInt(attributes.firstDataCol, 10)\n : undefined\n };\n }\n break;\n\n case \"pivotFields\":\n this.inPivotFields = true;\n break;\n\n case \"pivotField\":\n if (this.inPivotFields) {\n this.currentPivotField = {\n axis: attributes.axis as any,\n dataField: attributes.dataField === \"1\",\n items: [],\n compact: attributes.compact === \"1\",\n outline: attributes.outline === \"1\",\n showAll: attributes.showAll === \"1\",\n defaultSubtotal: attributes.defaultSubtotal === \"1\"\n };\n }\n break;\n\n case \"items\":\n if (this.currentPivotField) {\n this.inItems = true;\n }\n break;\n\n case \"item\":\n if (this.inItems && this.currentPivotField && attributes.x !== undefined) {\n this.currentPivotField.items!.push(parseInt(attributes.x, 10));\n }\n break;\n\n case \"rowFields\":\n this.inRowFields = true;\n break;\n\n case \"colFields\":\n this.inColFields = true;\n break;\n\n case \"dataFields\":\n this.inDataFields = true;\n break;\n\n case \"rowItems\":\n this.inRowItems = true;\n break;\n\n case \"colItems\":\n this.inColItems = true;\n break;\n\n case \"field\":\n // Handle field element (used in rowFields, colFields)\n if (this.model) {\n const fieldIndex = parseInt(attributes.x || \"0\", 10);\n if (this.inRowFields) {\n this.model.rowFields.push(fieldIndex);\n } else if (this.inColFields) {\n this.model.colFields.push(fieldIndex);\n }\n }\n break;\n\n case \"dataField\":\n if (this.inDataFields && this.model) {\n this.model.dataFields.push({\n name: xmlDecode(attributes.name || \"\"),\n fld: parseInt(attributes.fld || \"0\", 10),\n baseField: attributes.baseField ? parseInt(attributes.baseField, 10) : 0,\n baseItem: attributes.baseItem ? parseInt(attributes.baseItem, 10) : 0,\n subtotal: attributes.subtotal as any\n });\n }\n break;\n\n case \"pivotTableStyleInfo\":\n if (this.model) {\n this.model.styleName = attributes.name;\n }\n break;\n }\n\n return true;\n }\n\n parseText(_text: string): void {\n // No text content in pivot table elements\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n // End of pivotTableDefinition\n return false;\n\n case \"pivotFields\":\n this.inPivotFields = false;\n break;\n\n case \"pivotField\":\n if (this.currentPivotField && this.model) {\n this.model.pivotFields.push(this.currentPivotField);\n this.currentPivotField = null;\n }\n break;\n\n case \"items\":\n this.inItems = false;\n break;\n\n case \"rowFields\":\n this.inRowFields = false;\n break;\n\n case \"colFields\":\n this.inColFields = false;\n break;\n\n case \"dataFields\":\n this.inDataFields = false;\n break;\n\n case \"rowItems\":\n this.inRowItems = false;\n break;\n\n case \"colItems\":\n this.inColItems = false;\n break;\n }\n\n return true;\n }\n\n reconcile(_model: any, _options: any): void {\n // No reconciliation needed\n }\n\n static PIVOT_TABLE_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n \"mc:Ignorable\": \"xr\",\n \"xmlns:xr\": \"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"\n };\n}\n\n// Helpers\n\n/**\n * Build dataField XML elements for all values in the pivot table.\n * Supports multiple values when columns is empty.\n */\nfunction buildDataFields(cacheFields: any[], values: number[], metric: \"sum\" | \"count\"): string {\n const metricName = metric === \"count\" ? \"Count\" : \"Sum\";\n // For 'count' metric, Excel requires subtotal=\"count\" attribute\n const subtotalAttr = metric === \"count\" ? ' subtotal=\"count\"' : \"\";\n\n return values\n .map(\n valueIndex => `<dataField\n name=\"${metricName} of ${xmlEncode(cacheFields[valueIndex].name)}\"\n fld=\"${valueIndex}\"\n baseField=\"0\"\n baseItem=\"0\"${subtotalAttr}\n />`\n )\n .join(\"\");\n}\n\nfunction renderPivotFields(pivotTable: PivotTableModel): string {\n // Pre-compute field type lookup for O(1) access\n const rowSet = new Set(pivotTable.rows);\n const colSet = new Set(pivotTable.columns);\n const valueSet = new Set(pivotTable.values);\n\n return pivotTable.cacheFields\n .map((cacheField: any, fieldIndex: number) => {\n const fieldType = rowSet.has(fieldIndex)\n ? \"row\"\n : colSet.has(fieldIndex)\n ? \"column\"\n : valueSet.has(fieldIndex)\n ? \"value\"\n : null;\n return renderPivotField(fieldType, cacheField.sharedItems);\n })\n .join(\"\");\n}\n\nfunction renderPivotField(fieldType: string | null, sharedItems: string[] | null): string {\n // fieldType: 'row', 'column', 'value', null\n\n const defaultAttributes = 'compact=\"0\" outline=\"0\" showAll=\"0\" defaultSubtotal=\"0\"';\n\n if (fieldType === \"row\" || fieldType === \"column\") {\n const axis = fieldType === \"row\" ? \"axisRow\" : \"axisCol\";\n return `\n <pivotField axis=\"${axis}\" ${defaultAttributes}>\n <items count=\"${sharedItems!.length + 1}\">\n ${sharedItems!.map((_item: string, index: number) => `<item x=\"${index}\" />`).join(\"\\n \")}\n </items>\n </pivotField>\n `;\n }\n return `\n <pivotField\n ${fieldType === \"value\" ? 'dataField=\"1\"' : \"\"}\n ${defaultAttributes}\n />\n `;\n}\n\nexport { PivotTableXform, type ParsedPivotTableModel };\n","import { RichTextXform } from \"../strings/rich-text-xform\";\nimport { BaseXform } from \"../base-xform\";\n\ninterface NoteText {\n font?: any;\n text: string;\n}\n\ninterface CommentNote {\n texts: NoteText[];\n}\n\ninterface CommentModel {\n type: string;\n note: CommentNote;\n ref: string;\n authorId?: number;\n}\n\nclass CommentXform extends BaseXform {\n declare public model: CommentModel;\n declare public parser: any;\n declare private _richTextXform?: RichTextXform;\n\n constructor(model?: CommentModel) {\n super();\n this.model = model || { type: \"note\", note: { texts: [] }, ref: \"\" };\n }\n\n get tag(): string {\n return \"r\";\n }\n\n get richTextXform(): RichTextXform {\n if (!this._richTextXform) {\n this._richTextXform = new RichTextXform();\n }\n return this._richTextXform;\n }\n\n render(xmlStream: any, model?: CommentModel): void {\n const renderModel = model || this.model;\n\n xmlStream.openNode(\"comment\", {\n ref: renderModel.ref,\n authorId: 0\n });\n xmlStream.openNode(\"text\");\n if (renderModel && renderModel.note && renderModel.note.texts) {\n renderModel.note.texts.forEach(text => {\n this.richTextXform.render(xmlStream, text);\n });\n }\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"comment\":\n this.model = {\n type: \"note\",\n note: {\n texts: []\n },\n ...node.attributes\n };\n return true;\n case \"r\":\n this.parser = this.richTextXform;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"comment\":\n return false;\n case \"r\":\n this.model.note.texts.push(this.parser.model);\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n}\n\nexport { CommentXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { CommentXform } from \"./comment-xform\";\n\ninterface CommentsModel {\n comments: any[];\n}\n\nclass CommentsXform extends BaseXform {\n declare public map: { [key: string]: CommentXform };\n declare public parser: any;\n declare public model: CommentsModel;\n\n constructor() {\n super();\n this.map = {\n comment: new CommentXform()\n };\n this.model = { comments: [] };\n }\n\n render(xmlStream: any, model?: CommentsModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(\"comments\", CommentsXform.COMMENTS_ATTRIBUTES);\n\n // authors\n // TODO: support authors properly\n xmlStream.openNode(\"authors\");\n xmlStream.leafNode(\"author\", null, \"Author\");\n xmlStream.closeNode();\n\n // comments\n xmlStream.openNode(\"commentList\");\n renderModel.comments.forEach(comment => {\n this.map.comment.render(xmlStream, comment);\n });\n xmlStream.closeNode();\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case \"commentList\":\n this.model = {\n comments: []\n };\n return true;\n case \"comment\":\n this.parser = this.map.comment;\n this.parser.parseOpen(node);\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n switch (name) {\n case \"commentList\":\n return false;\n case \"comment\":\n this.model.comments.push(this.parser.model);\n this.parser = undefined;\n return true;\n default:\n if (this.parser) {\n this.parser.parseClose(name);\n }\n return true;\n }\n }\n\n static COMMENTS_ATTRIBUTES = {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n };\n}\n\nexport { CommentsXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface Margins {\n inset?: number[] | string;\n}\n\ninterface NoteModel {\n margins?: Margins;\n}\n\ninterface TextboxModel {\n note?: NoteModel;\n inset?: number[];\n}\n\nclass VmlTextboxXform extends BaseXform {\n declare public model: TextboxModel;\n\n constructor() {\n super();\n this.model = {};\n }\n\n get tag(): string {\n return \"v:textbox\";\n }\n\n conversionUnit(value: string | number, multiple: number, unit: string): string {\n return `${(parseFloat(value.toString()) * multiple).toFixed(2)}${unit}`;\n }\n\n reverseConversionUnit(inset?: string): number[] {\n return (inset || \"\").split(\",\").map(margin => {\n return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, \"\")).toFixed(2));\n });\n }\n\n render(xmlStream: any, model: TextboxModel): void {\n const attributes: any = {\n style: \"mso-direction-alt:auto\"\n };\n if (model && model.note) {\n let { inset } = (model.note && model.note.margins) || {};\n if (Array.isArray(inset)) {\n inset = inset\n .map(margin => {\n return this.conversionUnit(margin, 10, \"mm\");\n })\n .join(\",\");\n }\n if (inset) {\n attributes.inset = inset;\n }\n }\n xmlStream.openNode(\"v:textbox\", attributes);\n xmlStream.leafNode(\"div\", { style: \"text-align:left\" });\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {\n inset: this.reverseConversionUnit(node.attributes.inset)\n };\n return true;\n default:\n return true;\n }\n }\n\n parseText(): void {}\n\n parseClose(name: string): boolean {\n switch (name) {\n case this.tag:\n return false;\n default:\n return true;\n }\n }\n}\n\nexport { VmlTextboxXform };\n","import { BaseXform } from \"../base-xform\";\n\ninterface AnchorModel {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ninterface RefAddress {\n col: number;\n row: number;\n}\n\ninterface RenderModel {\n anchor?: AnchorModel;\n refAddress?: RefAddress;\n}\n\n// render the triangle in the cell for the comment\nclass VmlAnchorXform extends BaseXform {\n declare private text: string;\n\n constructor() {\n super();\n this.text = \"\";\n }\n\n get tag(): string {\n return \"x:Anchor\";\n }\n\n getAnchorRect(anchor: AnchorModel): number[] {\n const l = Math.floor(anchor.left);\n const lf = Math.floor((anchor.left - l) * 68);\n const t = Math.floor(anchor.top);\n const tf = Math.floor((anchor.top - t) * 18);\n const r = Math.floor(anchor.right);\n const rf = Math.floor((anchor.right - r) * 68);\n const b = Math.floor(anchor.bottom);\n const bf = Math.floor((anchor.bottom - b) * 18);\n return [l, lf, t, tf, r, rf, b, bf];\n }\n\n getDefaultRect(ref: RefAddress): number[] {\n const l = ref.col;\n const lf = 6;\n const t = Math.max(ref.row - 2, 0);\n const tf = 14;\n const r = l + 2;\n const rf = 2;\n const b = t + 4;\n const bf = 16;\n return [l, lf, t, tf, r, rf, b, bf];\n }\n\n render(xmlStream: any, model: RenderModel): void {\n const rect = model.anchor\n ? this.getAnchorRect(model.anchor)\n : this.getDefaultRect(model.refAddress!);\n\n xmlStream.leafNode(\"x:Anchor\", null, rect.join(\", \"));\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.text = \"\";\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this.text = text;\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlAnchorXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass VmlProtectionXform extends BaseXform {\n declare private _model: { tag?: string };\n declare private text: string;\n\n constructor(model?: { tag?: string }) {\n super();\n this._model = model || {};\n this.text = \"\";\n }\n\n get tag(): string {\n return (this._model && this._model.tag) || \"\";\n }\n\n render(xmlStream: any, model: any): void {\n xmlStream.leafNode(this.tag, null, model);\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.text = \"\";\n return true;\n default:\n return false;\n }\n }\n\n parseText(text: string): void {\n this.text = text;\n }\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlProtectionXform };\n","import { BaseXform } from \"../../base-xform\";\n\nclass VmlPositionXform extends BaseXform {\n declare private _model: { tag?: string };\n declare public model: { [key: string]: boolean };\n\n constructor(model?: { tag?: string }) {\n super();\n this._model = model || {};\n this.model = {};\n }\n\n get tag(): string {\n return (this._model && this._model.tag) || \"\";\n }\n\n render(xmlStream: any, model: string, type?: string[]): void {\n if (type && model === type[2]) {\n xmlStream.leafNode(this.tag);\n } else if (type && this.tag === \"x:SizeWithCells\" && model === type[1]) {\n xmlStream.leafNode(this.tag);\n }\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.model = {};\n this.model[this.tag] = true;\n return true;\n default:\n return false;\n }\n }\n\n parseText(): void {}\n\n parseClose(): boolean {\n return false;\n }\n}\n\nexport { VmlPositionXform };\n","import { BaseXform } from \"../base-xform\";\nimport { VmlAnchorXform } from \"./vml-anchor-xform\";\nimport { VmlProtectionXform } from \"./style/vml-protection-xform\";\nimport { VmlPositionXform } from \"./style/vml-position-xform\";\n\nconst POSITION_TYPE = [\"twoCells\", \"oneCells\", \"absolute\"];\n\ninterface Protection {\n locked?: string;\n lockText?: string;\n}\n\ninterface ClientDataModel {\n anchor: any;\n protection: Protection;\n editAs: string;\n}\n\ninterface RenderModel {\n note: {\n protection: Protection;\n editAs: string;\n };\n refAddress: {\n row: number;\n col: number;\n };\n}\n\nclass VmlClientDataXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: ClientDataModel;\n\n constructor() {\n super();\n this.map = {\n \"x:Anchor\": new VmlAnchorXform(),\n \"x:Locked\": new VmlProtectionXform({ tag: \"x:Locked\" }),\n \"x:LockText\": new VmlProtectionXform({ tag: \"x:LockText\" }),\n \"x:SizeWithCells\": new VmlPositionXform({ tag: \"x:SizeWithCells\" }),\n \"x:MoveWithCells\": new VmlPositionXform({ tag: \"x:MoveWithCells\" })\n };\n this.model = { anchor: [], protection: {}, editAs: \"\" };\n }\n\n get tag(): string {\n return \"x:ClientData\";\n }\n\n render(xmlStream: any, model: RenderModel): void {\n const { protection, editAs } = model.note;\n xmlStream.openNode(this.tag, { ObjectType: \"Note\" });\n this.map[\"x:MoveWithCells\"].render(xmlStream, editAs, POSITION_TYPE);\n this.map[\"x:SizeWithCells\"].render(xmlStream, editAs, POSITION_TYPE);\n this.map[\"x:Anchor\"].render(xmlStream, model);\n this.map[\"x:Locked\"].render(xmlStream, protection.locked);\n xmlStream.leafNode(\"x:AutoFill\", null, \"False\");\n this.map[\"x:LockText\"].render(xmlStream, protection.lockText);\n xmlStream.leafNode(\"x:Row\", null, model.refAddress.row - 1);\n xmlStream.leafNode(\"x:Column\", null, model.refAddress.col - 1);\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n anchor: [],\n protection: {},\n editAs: \"\"\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.normalizeModel();\n return false;\n default:\n return true;\n }\n }\n\n normalizeModel(): void {\n const position = Object.assign(\n {},\n this.map[\"x:MoveWithCells\"].model,\n this.map[\"x:SizeWithCells\"].model\n );\n const len = Object.keys(position).length;\n this.model.editAs = POSITION_TYPE[len];\n this.model.anchor = this.map[\"x:Anchor\"].text;\n this.model.protection.locked = this.map[\"x:Locked\"].text;\n this.model.protection.lockText = this.map[\"x:LockText\"].text;\n }\n}\n\nexport { VmlClientDataXform };\n","import { BaseXform } from \"../base-xform\";\nimport { VmlTextboxXform } from \"./vml-textbox-xform\";\nimport { VmlClientDataXform } from \"./vml-client-data-xform\";\n\ninterface ShapeModel {\n note: {\n margins?: {\n insetmode?: string;\n inset?: number[];\n };\n };\n refAddress?: any;\n}\n\nclass VmlShapeXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: any;\n\n constructor() {\n super();\n this.map = {\n \"v:textbox\": new VmlTextboxXform(),\n \"x:ClientData\": new VmlClientDataXform()\n };\n }\n\n get tag(): string {\n return \"v:shape\";\n }\n\n render(xmlStream: any, model: ShapeModel, index?: number): void {\n xmlStream.openNode(\"v:shape\", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index || 0));\n\n xmlStream.leafNode(\"v:fill\", { color2: \"infoBackground [80]\" });\n xmlStream.leafNode(\"v:shadow\", { color: \"none [81]\", obscured: \"t\" });\n xmlStream.leafNode(\"v:path\", { \"o:connecttype\": \"none\" });\n this.map[\"v:textbox\"].render(xmlStream, model);\n this.map[\"x:ClientData\"].render(xmlStream, model);\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n margins: {\n insetmode: node.attributes[\"o:insetmode\"]\n },\n anchor: \"\",\n editAs: \"\",\n protection: {}\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n this.model.margins.inset = this.map[\"v:textbox\"].model && this.map[\"v:textbox\"].model.inset;\n this.model.protection =\n this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.protection;\n this.model.anchor = this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.anchor;\n this.model.editAs = this.map[\"x:ClientData\"].model && this.map[\"x:ClientData\"].model.editAs;\n return false;\n default:\n return true;\n }\n }\n\n static V_SHAPE_ATTRIBUTES = (model: ShapeModel, index: number): any => ({\n id: `_x0000_s${1025 + index}`,\n type: \"#_x0000_t202\",\n style:\n \"position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden\",\n fillcolor: \"infoBackground [80]\",\n strokecolor: \"none [81]\",\n \"o:insetmode\": model.note.margins && model.note.margins.insetmode\n });\n}\n\nexport { VmlShapeXform };\n","import { XmlStream } from \"../../../utils/xml-stream\";\nimport { BaseXform } from \"../base-xform\";\nimport { VmlShapeXform } from \"./vml-shape-xform\";\n\ninterface VmlNotesModel {\n comments: any[];\n}\n\n// This class is (currently) single purposed to insert the triangle\n// drawing icons on commented cells\nclass VmlNotesXform extends BaseXform {\n declare public map: { [key: string]: any };\n declare public parser: any;\n declare public model: VmlNotesModel;\n\n constructor() {\n super();\n this.map = {\n \"v:shape\": new VmlShapeXform()\n };\n this.model = { comments: [] };\n }\n\n get tag(): string {\n return \"xml\";\n }\n\n render(xmlStream: any, model?: VmlNotesModel): void {\n const renderModel = model || this.model;\n xmlStream.openXml(XmlStream.StdDocAttributes);\n xmlStream.openNode(this.tag, VmlNotesXform.DRAWING_ATTRIBUTES);\n\n xmlStream.openNode(\"o:shapelayout\", { \"v:ext\": \"edit\" });\n xmlStream.leafNode(\"o:idmap\", { \"v:ext\": \"edit\", data: 1 });\n xmlStream.closeNode();\n\n xmlStream.openNode(\"v:shapetype\", {\n id: \"_x0000_t202\",\n coordsize: \"21600,21600\",\n \"o:spt\": 202,\n path: \"m,l,21600r21600,l21600,xe\"\n });\n xmlStream.leafNode(\"v:stroke\", { joinstyle: \"miter\" });\n xmlStream.leafNode(\"v:path\", { gradientshapeok: \"t\", \"o:connecttype\": \"rect\" });\n xmlStream.closeNode();\n\n renderModel.comments.forEach((item, index) => {\n this.map[\"v:shape\"].render(xmlStream, item, index);\n });\n\n xmlStream.closeNode();\n }\n\n parseOpen(node: any): boolean {\n if (this.parser) {\n this.parser.parseOpen(node);\n return true;\n }\n switch (node.name) {\n case this.tag:\n this.reset();\n this.model = {\n comments: []\n };\n break;\n default:\n this.parser = this.map[node.name];\n if (this.parser) {\n this.parser.parseOpen(node);\n }\n break;\n }\n return true;\n }\n\n parseText(text: string): void {\n if (this.parser) {\n this.parser.parseText(text);\n }\n }\n\n parseClose(name: string): boolean {\n if (this.parser) {\n if (!this.parser.parseClose(name)) {\n this.model.comments.push(this.parser.model);\n this.parser = undefined;\n }\n return true;\n }\n switch (name) {\n case this.tag:\n return false;\n default:\n // could be some unrecognised tags\n return true;\n }\n }\n\n reconcile(model: any, options: any): void {\n model.anchors.forEach((anchor: any) => {\n if (anchor.br) {\n this.map[\"xdr:twoCellAnchor\"].reconcile(anchor, options);\n } else {\n this.map[\"xdr:oneCellAnchor\"].reconcile(anchor, options);\n }\n });\n }\n\n static DRAWING_ATTRIBUTES = {\n \"xmlns:v\": \"urn:schemas-microsoft-com:vml\",\n \"xmlns:o\": \"urn:schemas-microsoft-com:office:office\",\n \"xmlns:x\": \"urn:schemas-microsoft-com:office:excel\"\n };\n}\n\nexport { VmlNotesXform };\n","export const theme1Xml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"> <a:themeElements> <a:clrScheme name=\"Office\"> <a:dk1> <a:sysClr val=\"windowText\" lastClr=\"000000\"/> </a:dk1> <a:lt1> <a:sysClr val=\"window\" lastClr=\"FFFFFF\"/> </a:lt1> <a:dk2> <a:srgbClr val=\"1F497D\"/> </a:dk2> <a:lt2> <a:srgbClr val=\"EEECE1\"/> </a:lt2> <a:accent1> <a:srgbClr val=\"4F81BD\"/> </a:accent1> <a:accent2> <a:srgbClr val=\"C0504D\"/> </a:accent2> <a:accent3> <a:srgbClr val=\"9BBB59\"/> </a:accent3> <a:accent4> <a:srgbClr val=\"8064A2\"/> </a:accent4> <a:accent5> <a:srgbClr val=\"4BACC6\"/> </a:accent5> <a:accent6> <a:srgbClr val=\"F79646\"/> </a:accent6> <a:hlink> <a:srgbClr val=\"0000FF\"/> </a:hlink> <a:folHlink> <a:srgbClr val=\"800080\"/> </a:folHlink> </a:clrScheme> <a:fontScheme name=\"Office\"> <a:majorFont> <a:latin typeface=\"Cambria\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/> <a:font script=\"Hang\" typeface=\"맑은 고딕\"/> <a:font script=\"Hans\" typeface=\"宋体\"/> <a:font script=\"Hant\" typeface=\"新細明體\"/> <a:font script=\"Arab\" typeface=\"Times New Roman\"/> <a:font script=\"Hebr\" typeface=\"Times New Roman\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"MoolBoran\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Times New Roman\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:majorFont> <a:minorFont> <a:latin typeface=\"Calibri\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/> <a:font script=\"Hang\" typeface=\"맑은 고딕\"/> <a:font script=\"Hans\" typeface=\"宋体\"/> <a:font script=\"Hant\" typeface=\"新細明體\"/> <a:font script=\"Arab\" typeface=\"Arial\"/> <a:font script=\"Hebr\" typeface=\"Arial\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"DaunPenh\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Arial\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:minorFont> </a:fontScheme> <a:fmtScheme name=\"Office\"> <a:fillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"35000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"37000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"15000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"1\"/> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"100000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"130000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"0\"/> </a:gradFill> </a:fillStyleLst> <a:lnStyleLst> <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"> <a:shade val=\"95000\"/> <a:satMod val=\"105000\"/> </a:schemeClr> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> </a:lnStyleLst> <a:effectStyleLst> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"38000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> <a:scene3d> <a:camera prst=\"orthographicFront\"> <a:rot lat=\"0\" lon=\"0\" rev=\"0\"/> </a:camera> <a:lightRig rig=\"threePt\" dir=\"t\"> <a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/> </a:lightRig> </a:scene3d> <a:sp3d> <a:bevelT w=\"63500\" h=\"25400\"/> </a:sp3d> </a:effectStyle> </a:effectStyleLst> <a:bgFillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"40000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"40000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"45000\"/> <a:shade val=\"99000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"20000\"/> <a:satMod val=\"255000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/> </a:path> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"80000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"30000\"/> <a:satMod val=\"200000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/> </a:path> </a:gradFill> </a:bgFillStyleLst> </a:fmtScheme> </a:themeElements> <a:objectDefaults> <a:spDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"3\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"lt1\"/> </a:fontRef> </a:style> </a:spDef> <a:lnDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"0\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"tx1\"/> </a:fontRef> </a:style> </a:lnDef> </a:objectDefaults> <a:extraClrSchemeLst/> </a:theme>';\n","/**\n * XLSXBase - Abstract base class for XLSX operations\n *\n * Contains all platform-agnostic logic shared between Node.js and Browser versions:\n * - reconcile: Reconcile model after parsing\n * - _process*Entry: Process individual ZIP entries\n * - add*: Add content to ZIP during writing\n * - prepareModel: Prepare model for writing\n * - loadFromFiles: Load from pre-extracted ZIP data\n */\n\nimport { XmlStream } from \"../utils/xml-stream\";\nimport { StylesXform } from \"./xform/style/styles-xform\";\nimport { CoreXform } from \"./xform/core/core-xform\";\nimport { SharedStringsXform } from \"./xform/strings/shared-strings-xform\";\nimport { RelationshipsXform } from \"./xform/core/relationships-xform\";\nimport { ContentTypesXform } from \"./xform/core/content-types-xform\";\nimport { AppXform } from \"./xform/core/app-xform\";\nimport { WorkbookXform } from \"./xform/book/workbook-xform\";\nimport { WorkSheetXform } from \"./xform/sheet/worksheet-xform\";\nimport { DrawingXform } from \"./xform/drawing/drawing-xform\";\nimport { TableXform } from \"./xform/table/table-xform\";\nimport { PivotCacheRecordsXform } from \"./xform/pivot-table/pivot-cache-records-xform\";\nimport {\n PivotCacheDefinitionXform,\n type ParsedCacheDefinitionModel\n} from \"./xform/pivot-table/pivot-cache-definition-xform\";\nimport {\n PivotTableXform,\n type ParsedPivotTableModel\n} from \"./xform/pivot-table/pivot-table-xform\";\nimport { CommentsXform } from \"./xform/comment/comments-xform\";\nimport { VmlNotesXform } from \"./xform/comment/vml-notes-xform\";\nimport { theme1Xml } from \"./xml/theme1\";\nimport { RelType } from \"./rel-type\";\n\n/**\n * Interface for stream-like objects used in parsing\n */\nexport interface IParseStream {\n on(event: string, callback: Function): this;\n removeListener(event: string, callback: Function): this;\n pipe(dest: any): any;\n [Symbol.asyncIterator]?: () => AsyncIterator<any>;\n}\n\n/**\n * Interface for StreamBuf-like objects\n */\nexport interface IStreamBuf {\n write(data: any): void;\n end(): void;\n read(): any;\n toBuffer?(): any;\n once(event: string, callback: Function): void;\n on(event: string, callback: Function): void;\n removeListener(event: string, callback: Function): void;\n pipe?(dest: any): any;\n}\n\n/**\n * Interface for ZipWriter-like objects\n */\nexport interface IZipWriter {\n append(data: any, options: { name: string; base64?: boolean }): void;\n pipe(stream: any): void;\n on(event: string, callback: Function): void;\n finalize(): void;\n}\n\n/**\n * Abstract base class for XLSX operations\n */\nabstract class XLSXBase {\n declare public workbook: any;\n\n static RelType = RelType;\n\n constructor(workbook: any) {\n this.workbook = workbook;\n }\n\n // ===========================================================================\n // Abstract methods - must be implemented by subclasses\n // ===========================================================================\n\n /**\n * Create a StreamBuf instance for buffering data\n */\n protected abstract createStreamBuf(): IStreamBuf;\n\n /**\n * Create a stream from binary data (for media/themes)\n */\n protected abstract createBinaryStream(data: Uint8Array): IParseStream;\n\n /**\n * Create a stream from string content (for XML parsing)\n */\n protected abstract createTextStream(content: string): IParseStream;\n\n /**\n * Convert buffer/Uint8Array to string\n */\n protected abstract bufferToString(data: any): string;\n\n // ===========================================================================\n // Parse helpers - shared by all platforms\n // ===========================================================================\n\n parseRels(stream: any): Promise<any> {\n const xform = new RelationshipsXform();\n return xform.parseStream(stream);\n }\n\n parseWorkbook(stream: any): Promise<any> {\n const xform = new WorkbookXform();\n return xform.parseStream(stream);\n }\n\n parseSharedStrings(stream: any): Promise<any> {\n const xform = new SharedStringsXform();\n return xform.parseStream(stream);\n }\n\n // ===========================================================================\n // Reconcile - shared by all platforms\n // ===========================================================================\n\n reconcile(model: any, options?: any): void {\n const workbookXform = new WorkbookXform();\n const worksheetXform = new WorkSheetXform(options);\n const drawingXform = new DrawingXform();\n const tableXform = new TableXform();\n\n workbookXform.reconcile(model);\n\n // reconcile drawings with their rels\n const drawingOptions: any = {\n media: model.media,\n mediaIndex: model.mediaIndex\n };\n Object.keys(model.drawings).forEach(name => {\n const drawing = model.drawings[name];\n const drawingRel = model.drawingRels[name];\n if (drawingRel) {\n drawingOptions.rels = drawingRel.reduce((o: any, rel: any) => {\n o[rel.Id] = rel;\n return o;\n }, {});\n (drawing.anchors || []).forEach((anchor: any) => {\n const hyperlinks = anchor.picture && anchor.picture.hyperlinks;\n if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {\n hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;\n delete hyperlinks.rId;\n }\n });\n drawingXform.reconcile(drawing, drawingOptions);\n }\n });\n\n // reconcile tables with the default styles\n const tableOptions = {\n styles: model.styles\n };\n Object.values(model.tables).forEach((table: any) => {\n tableXform.reconcile(table, tableOptions);\n });\n\n // Reconcile pivot tables\n this._reconcilePivotTables(model);\n\n const sheetOptions = {\n styles: model.styles,\n sharedStrings: model.sharedStrings,\n media: model.media,\n mediaIndex: model.mediaIndex,\n date1904: model.properties && model.properties.date1904,\n drawings: model.drawings,\n comments: model.comments,\n tables: model.tables,\n vmlDrawings: model.vmlDrawings,\n pivotTables: model.pivotTablesIndexed\n };\n model.worksheets.forEach((worksheet: any) => {\n worksheet.relationships = model.worksheetRels[worksheet.sheetNo];\n worksheetXform.reconcile(worksheet, sheetOptions);\n });\n\n // delete unnecessary parts\n delete model.worksheetHash;\n delete model.worksheetRels;\n delete model.globalRels;\n delete model.sharedStrings;\n delete model.workbookRels;\n delete model.sheetDefs;\n delete model.styles;\n delete model.mediaIndex;\n delete model.drawings;\n delete model.drawingRels;\n delete model.vmlDrawings;\n delete model.pivotTableRels;\n delete model.pivotCacheDefinitionRels;\n }\n\n /**\n * Reconcile pivot tables by linking them to worksheets and their cache data.\n */\n protected _reconcilePivotTables(model: any): void {\n const rawPivotTables = model.pivotTables || {};\n if (typeof rawPivotTables !== \"object\" || Object.keys(rawPivotTables).length === 0) {\n model.pivotTables = [];\n model.pivotTablesIndexed = {};\n return;\n }\n\n const definitionToCacheId = this._buildDefinitionToCacheIdMap(model);\n\n const cacheMap = new Map<\n number,\n {\n definition: ParsedCacheDefinitionModel;\n records: any;\n definitionName: string;\n }\n >();\n\n Object.entries(model.pivotCacheDefinitions || {}).forEach(\n ([name, definition]: [string, any]) => {\n const cacheId = definitionToCacheId.get(name);\n if (cacheId !== undefined) {\n const recordsName = name.replace(\"Definition\", \"Records\");\n cacheMap.set(cacheId, {\n definition,\n records: model.pivotCacheRecords?.[recordsName],\n definitionName: name\n });\n }\n }\n );\n\n const loadedPivotTables: any[] = [];\n const pivotTablesIndexed: Record<string, any> = {};\n\n Object.entries(rawPivotTables).forEach(([pivotName, pivotTable]: [string, any]) => {\n const pt = pivotTable as ParsedPivotTableModel;\n const tableNumber = this._extractTableNumber(pivotName);\n const cacheData = cacheMap.get(pt.cacheId);\n\n const completePivotTable = {\n ...pt,\n tableNumber,\n cacheDefinition: cacheData?.definition,\n cacheRecords: cacheData?.records,\n cacheFields: cacheData?.definition?.cacheFields || [],\n rows: pt.rowFields.filter(f => f >= 0),\n columns: pt.colFields.filter(f => f >= 0 && f !== -2),\n values: pt.dataFields.map(df => df.fld),\n metric: this._determineMetric(pt.dataFields),\n applyWidthHeightFormats: pt.applyWidthHeightFormats || \"0\"\n };\n\n loadedPivotTables.push(completePivotTable);\n pivotTablesIndexed[`../pivotTables/${pivotName}.xml`] = completePivotTable;\n });\n\n loadedPivotTables.sort((a, b) => a.tableNumber - b.tableNumber);\n model.pivotTables = loadedPivotTables;\n model.pivotTablesIndexed = pivotTablesIndexed;\n model.loadedPivotTables = loadedPivotTables;\n }\n\n protected _extractTableNumber(name: string): number {\n const match = name.match(/pivotTable(\\d+)/);\n return match ? parseInt(match[1], 10) : 1;\n }\n\n protected _buildCacheIdMap(model: any): Map<string, number> {\n const rIdToCacheId = new Map<string, number>();\n const pivotCaches = model.pivotCaches || [];\n for (const cache of pivotCaches) {\n if (cache.cacheId && cache.rId) {\n rIdToCacheId.set(cache.rId, parseInt(cache.cacheId, 10));\n }\n }\n return rIdToCacheId;\n }\n\n protected _buildDefinitionToCacheIdMap(model: any): Map<string, number> {\n const definitionToCacheId = new Map<string, number>();\n const rIdToCacheId = this._buildCacheIdMap(model);\n const workbookRels = model.workbookRels || [];\n\n for (const rel of workbookRels) {\n if (rel.Type === XLSXBase.RelType.PivotCacheDefinition && rel.Target) {\n const match = rel.Target.match(/pivotCacheDefinition(\\d+)\\.xml/);\n if (match) {\n const defName = `pivotCacheDefinition${match[1]}`;\n const cacheId = rIdToCacheId.get(rel.Id);\n if (cacheId !== undefined) {\n definitionToCacheId.set(defName, cacheId);\n }\n }\n }\n }\n\n return definitionToCacheId;\n }\n\n protected _determineMetric(dataFields: Array<{ subtotal?: string }>): \"sum\" | \"count\" {\n if (dataFields.length > 0 && dataFields[0].subtotal === \"count\") {\n return \"count\";\n }\n return \"sum\";\n }\n\n // ===========================================================================\n // Process Entry methods - shared by all platforms\n // ===========================================================================\n\n async _processWorksheetEntry(\n stream: any,\n model: any,\n sheetNo: number,\n options: any,\n path: string\n ): Promise<void> {\n const xform = new WorkSheetXform(options);\n const worksheet = await xform.parseStream(stream);\n if (!worksheet) {\n throw new Error(`Failed to parse worksheet ${path}`);\n }\n worksheet.sheetNo = sheetNo;\n model.worksheetHash[path] = worksheet;\n model.worksheets.push(worksheet);\n }\n\n async _processCommentEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new CommentsXform();\n const comments = await xform.parseStream(stream);\n model.comments[`../${name}.xml`] = comments;\n }\n\n async _processTableEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new TableXform();\n const table = await xform.parseStream(stream);\n model.tables[`../tables/${name}.xml`] = table;\n }\n\n async _processWorksheetRelsEntry(stream: any, model: any, sheetNo: number): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.worksheetRels[sheetNo] = relationships;\n }\n\n async _processMediaEntry(stream: any, model: any, filename: string): Promise<void> {\n const lastDot = filename.lastIndexOf(\".\");\n if (lastDot >= 1) {\n const extension = filename.substr(lastDot + 1);\n const name = filename.substr(0, lastDot);\n await new Promise<void>((resolve, reject) => {\n const streamBuf = this.createStreamBuf();\n\n const cleanup = () => {\n stream.removeListener(\"error\", onError);\n streamBuf.removeListener(\"error\", onError);\n streamBuf.removeListener(\"finish\", onFinish);\n };\n\n const onFinish = () => {\n cleanup();\n model.mediaIndex[filename] = model.media.length;\n model.mediaIndex[name] = model.media.length;\n const medium = {\n type: \"image\",\n name,\n extension,\n buffer: streamBuf.toBuffer ? streamBuf.toBuffer() : streamBuf.read()\n };\n model.media.push(medium);\n resolve();\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n streamBuf.once(\"finish\", onFinish);\n stream.on(\"error\", onError);\n streamBuf.on(\"error\", onError);\n stream.pipe(streamBuf);\n });\n }\n }\n\n async _processDrawingEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new DrawingXform();\n const drawing = await xform.parseStream(entry);\n model.drawings[name] = drawing;\n }\n\n async _processDrawingRelsEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(entry);\n model.drawingRels[name] = relationships;\n }\n\n async _processVmlDrawingEntry(entry: any, model: any, name: string): Promise<void> {\n const xform = new VmlNotesXform();\n const vmlDrawing = await xform.parseStream(entry);\n model.vmlDrawings[`../drawings/${name}.vml`] = vmlDrawing;\n }\n\n async _processThemeEntry(stream: any, model: any, name: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const streamBuf = this.createStreamBuf();\n\n const cleanup = () => {\n stream.removeListener(\"error\", onError);\n streamBuf.removeListener(\"error\", onError);\n streamBuf.removeListener(\"finish\", onFinish);\n };\n\n const onFinish = () => {\n cleanup();\n const data = streamBuf.read();\n model.themes[name] = data\n ? typeof data === \"string\"\n ? data\n : this.bufferToString(data)\n : \"\";\n resolve();\n };\n\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n streamBuf.once(\"finish\", onFinish);\n stream.on(\"error\", onError);\n streamBuf.on(\"error\", onError);\n stream.pipe(streamBuf);\n });\n }\n\n async _processPivotTableEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new PivotTableXform();\n const pivotTable = await xform.parseStream(stream);\n if (pivotTable) {\n model.pivotTables[name] = pivotTable;\n }\n }\n\n async _processPivotTableRelsEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.pivotTableRels[name] = relationships;\n }\n\n async _processPivotCacheDefinitionEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new PivotCacheDefinitionXform();\n const cacheDefinition = await xform.parseStream(stream);\n if (cacheDefinition) {\n model.pivotCacheDefinitions[name] = cacheDefinition;\n }\n }\n\n async _processPivotCacheDefinitionRelsEntry(\n stream: any,\n model: any,\n name: string\n ): Promise<void> {\n const xform = new RelationshipsXform();\n const relationships = await xform.parseStream(stream);\n model.pivotCacheDefinitionRels[name] = relationships;\n }\n\n async _processPivotCacheRecordsEntry(stream: any, model: any, name: string): Promise<void> {\n const xform = new PivotCacheRecordsXform();\n const cacheRecords = await xform.parseStream(stream);\n if (cacheRecords) {\n model.pivotCacheRecords[name] = cacheRecords;\n }\n }\n\n // ===========================================================================\n // loadFromFiles - shared logic for loading from pre-extracted ZIP data\n // ===========================================================================\n\n async loadFromFiles(zipData: Record<string, Uint8Array>, options?: any): Promise<any> {\n const model: any = {\n worksheets: [],\n worksheetHash: {},\n worksheetRels: [],\n themes: {},\n media: [],\n mediaIndex: {},\n drawings: {},\n drawingRels: {},\n comments: {},\n tables: {},\n vmlDrawings: {},\n pivotTables: {},\n pivotTableRels: {},\n pivotCacheDefinitions: {},\n pivotCacheDefinitionRels: {},\n pivotCacheRecords: {}\n };\n\n const entries = Object.keys(zipData).map(name => ({\n name,\n dir: name.endsWith(\"/\"),\n data: zipData[name]\n }));\n\n for (const entry of entries) {\n if (!entry.dir) {\n let entryName = entry.name;\n if (entryName[0] === \"/\") {\n entryName = entryName.substr(1);\n }\n\n // Create appropriate stream based on entry type\n const isBinaryEntry =\n entryName.match(/xl\\/media\\//) || entryName.match(/xl\\/theme\\/([a-zA-Z0-9]+)[.]xml/);\n const stream = isBinaryEntry\n ? this.createBinaryStream(entry.data)\n : this.createTextStream(this.bufferToString(entry.data));\n\n const match = entryName.match(/xl\\/worksheets\\/sheet(\\d+)[.]xml/);\n if (match) {\n const sheetNo = parseInt(match[1], 10);\n await this._processWorksheetEntry(stream, model, sheetNo, options, entryName);\n } else {\n switch (entryName) {\n case \"_rels/.rels\":\n model.globalRels = await this.parseRels(stream);\n break;\n case \"xl/workbook.xml\": {\n const workbook = await this.parseWorkbook(stream);\n model.sheets = workbook.sheets;\n model.definedNames = workbook.definedNames;\n model.views = workbook.views;\n model.properties = workbook.properties;\n model.calcProperties = workbook.calcProperties;\n model.pivotCaches = workbook.pivotCaches;\n break;\n }\n case \"xl/sharedStrings.xml\":\n model.sharedStrings = new SharedStringsXform();\n await model.sharedStrings.parseStream(stream);\n break;\n case \"xl/_rels/workbook.xml.rels\":\n model.workbookRels = await this.parseRels(stream);\n break;\n case \"docProps/app.xml\": {\n const appXform = new AppXform();\n const appProperties = await appXform.parseStream(stream);\n model.company = appProperties.company;\n model.manager = appProperties.manager;\n break;\n }\n case \"docProps/core.xml\": {\n const coreXform = new CoreXform();\n const coreProperties = await coreXform.parseStream(stream);\n Object.assign(model, coreProperties);\n break;\n }\n case \"xl/styles.xml\":\n model.styles = new StylesXform();\n await model.styles.parseStream(stream);\n break;\n default:\n await this._processDefaultEntry(stream, model, entryName);\n }\n }\n }\n }\n\n this.reconcile(model, options);\n this.workbook.model = model;\n return this.workbook;\n }\n\n /**\n * Process default entries (drawings, comments, tables, etc.)\n */\n protected async _processDefaultEntry(stream: any, model: any, entryName: string): Promise<void> {\n let match: RegExpMatchArray | null;\n\n match = entryName.match(/xl\\/worksheets\\/_rels\\/sheet(\\d+)[.]xml[.]rels/);\n if (match) {\n const sheetNo = parseInt(match[1], 10);\n await this._processWorksheetRelsEntry(stream, model, sheetNo);\n return;\n }\n\n match = entryName.match(/xl\\/media\\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/);\n if (match) {\n await this._processMediaEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/drawings\\/(drawing\\d+)[.]xml/);\n if (match) {\n await this._processDrawingEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/drawings\\/_rels\\/(drawing\\d+)[.]xml[.]rels/);\n if (match) {\n await this._processDrawingRelsEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/drawings\\/(vmlDrawing\\d+)[.]vml/);\n if (match) {\n await this._processVmlDrawingEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/comments(\\d+)[.]xml/);\n if (match) {\n await this._processCommentEntry(stream, model, `comments${match[1]}`);\n return;\n }\n\n match = entryName.match(/xl\\/tables\\/(table\\d+)[.]xml/);\n if (match) {\n await this._processTableEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/theme\\/([a-zA-Z0-9]+)[.]xml/);\n if (match) {\n await this._processThemeEntry(stream, model, match[1]);\n return;\n }\n\n // Pivot table files\n match = entryName.match(/xl\\/pivotTables\\/(pivotTable\\d+)[.]xml/);\n if (match) {\n await this._processPivotTableEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/pivotTables\\/_rels\\/(pivotTable\\d+)[.]xml[.]rels/);\n if (match) {\n await this._processPivotTableRelsEntry(stream, model, match[1]);\n return;\n }\n\n // Pivot cache files\n match = entryName.match(/xl\\/pivotCache\\/(pivotCacheDefinition\\d+)[.]xml/);\n if (match) {\n await this._processPivotCacheDefinitionEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/pivotCache\\/_rels\\/(pivotCacheDefinition\\d+)[.]xml[.]rels/);\n if (match) {\n await this._processPivotCacheDefinitionRelsEntry(stream, model, match[1]);\n return;\n }\n\n match = entryName.match(/xl\\/pivotCache\\/(pivotCacheRecords\\d+)[.]xml/);\n if (match) {\n await this._processPivotCacheRecordsEntry(stream, model, match[1]);\n return;\n }\n }\n\n // ===========================================================================\n // Write methods - shared by all platforms\n // ===========================================================================\n\n async addContentTypes(zip: IZipWriter, model: any): Promise<void> {\n const xform = new ContentTypesXform();\n const xml = xform.toXml(model);\n zip.append(xml, { name: \"[Content_Types].xml\" });\n }\n\n async addApp(zip: IZipWriter, model: any): Promise<void> {\n const xform = new AppXform();\n const xml = xform.toXml(model);\n zip.append(xml, { name: \"docProps/app.xml\" });\n }\n\n async addCore(zip: IZipWriter, model: any): Promise<void> {\n const xform = new CoreXform();\n zip.append(xform.toXml(model), { name: \"docProps/core.xml\" });\n }\n\n async addThemes(zip: IZipWriter, model: any): Promise<void> {\n const themes = model.themes || { theme1: theme1Xml };\n Object.keys(themes).forEach(name => {\n const xml = themes[name];\n const path = `xl/theme/${name}.xml`;\n zip.append(xml, { name: path });\n });\n }\n\n async addOfficeRels(zip: IZipWriter, _model: any): Promise<void> {\n const xform = new RelationshipsXform();\n const xml = xform.toXml([\n { Id: \"rId1\", Type: XLSXBase.RelType.OfficeDocument, Target: \"xl/workbook.xml\" },\n { Id: \"rId2\", Type: XLSXBase.RelType.CoreProperties, Target: \"docProps/core.xml\" },\n { Id: \"rId3\", Type: XLSXBase.RelType.ExtenderProperties, Target: \"docProps/app.xml\" }\n ]);\n zip.append(xml, { name: \"_rels/.rels\" });\n }\n\n async addWorkbookRels(zip: IZipWriter, model: any): Promise<void> {\n let count = 1;\n const relationships: any[] = [\n { Id: `rId${count++}`, Type: XLSXBase.RelType.Styles, Target: \"styles.xml\" },\n { Id: `rId${count++}`, Type: XLSXBase.RelType.Theme, Target: \"theme/theme1.xml\" }\n ];\n if (model.sharedStrings.count) {\n relationships.push({\n Id: `rId${count++}`,\n Type: XLSXBase.RelType.SharedStrings,\n Target: \"sharedStrings.xml\"\n });\n }\n (model.pivotTables || []).forEach((pivotTable: any) => {\n pivotTable.rId = `rId${count++}`;\n relationships.push({\n Id: pivotTable.rId,\n Type: XLSXBase.RelType.PivotCacheDefinition,\n Target: `pivotCache/pivotCacheDefinition${pivotTable.tableNumber}.xml`\n });\n });\n model.worksheets.forEach((worksheet: any, index: number) => {\n worksheet.rId = `rId${count++}`;\n worksheet.fileIndex = index + 1;\n relationships.push({\n Id: worksheet.rId,\n Type: XLSXBase.RelType.Worksheet,\n Target: `worksheets/sheet${worksheet.fileIndex}.xml`\n });\n });\n const xform = new RelationshipsXform();\n const xml = xform.toXml(relationships);\n zip.append(xml, { name: \"xl/_rels/workbook.xml.rels\" });\n }\n\n async addSharedStrings(zip: IZipWriter, model: any): Promise<void> {\n if (model.sharedStrings && model.sharedStrings.count) {\n zip.append(model.sharedStrings.xml, { name: \"xl/sharedStrings.xml\" });\n }\n }\n\n async addStyles(zip: IZipWriter, model: any): Promise<void> {\n const { xml } = model.styles;\n if (xml) {\n zip.append(xml, { name: \"xl/styles.xml\" });\n }\n }\n\n async addWorkbook(zip: IZipWriter, model: any): Promise<void> {\n const xform = new WorkbookXform();\n zip.append(xform.toXml(model), { name: \"xl/workbook.xml\" });\n }\n\n async addWorksheets(zip: IZipWriter, model: any): Promise<void> {\n const worksheetXform = new WorkSheetXform();\n const relationshipsXform = new RelationshipsXform();\n const commentsXform = new CommentsXform();\n const vmlNotesXform = new VmlNotesXform();\n\n model.worksheets.forEach((worksheet: any, index: number) => {\n const fileIndex = worksheet.fileIndex || index + 1;\n let xmlStream = new XmlStream();\n worksheetXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: `xl/worksheets/sheet${fileIndex}.xml` });\n\n if (worksheet.rels && worksheet.rels.length) {\n xmlStream = new XmlStream();\n relationshipsXform.render(xmlStream, worksheet.rels);\n zip.append(xmlStream.xml, { name: `xl/worksheets/_rels/sheet${fileIndex}.xml.rels` });\n }\n\n if (worksheet.comments.length > 0) {\n xmlStream = new XmlStream();\n commentsXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: `xl/comments${fileIndex}.xml` });\n\n xmlStream = new XmlStream();\n vmlNotesXform.render(xmlStream, worksheet);\n zip.append(xmlStream.xml, { name: `xl/drawings/vmlDrawing${fileIndex}.vml` });\n }\n });\n }\n\n addDrawings(zip: IZipWriter, model: any): void {\n const drawingXform = new DrawingXform();\n const relsXform = new RelationshipsXform();\n\n model.worksheets.forEach((worksheet: any) => {\n const { drawing } = worksheet;\n if (drawing) {\n drawingXform.prepare(drawing);\n let xml = drawingXform.toXml(drawing);\n zip.append(xml, { name: `xl/drawings/${drawing.name}.xml` });\n\n xml = relsXform.toXml(drawing.rels);\n zip.append(xml, { name: `xl/drawings/_rels/${drawing.name}.xml.rels` });\n }\n });\n }\n\n addTables(zip: IZipWriter, model: any): void {\n const tableXform = new TableXform();\n\n model.worksheets.forEach((worksheet: any) => {\n const { tables } = worksheet;\n tables.forEach((table: any) => {\n tableXform.prepare(table, {});\n const tableXml = tableXform.toXml(table);\n zip.append(tableXml, { name: `xl/tables/${table.target}` });\n });\n });\n }\n\n addPivotTables(zip: IZipWriter, model: any): void {\n if (!model.pivotTables.length) {\n return;\n }\n\n const pivotCacheRecordsXform = new PivotCacheRecordsXform();\n const pivotCacheDefinitionXform = new PivotCacheDefinitionXform();\n const pivotTableXform = new PivotTableXform();\n const relsXform = new RelationshipsXform();\n\n model.pivotTables.forEach((pivotTable: any) => {\n const n = pivotTable.tableNumber;\n const isLoaded = pivotTable.isLoaded;\n\n if (isLoaded) {\n if (pivotTable.cacheDefinition) {\n const xml = pivotCacheDefinitionXform.toXml(pivotTable.cacheDefinition);\n zip.append(xml, { name: `xl/pivotCache/pivotCacheDefinition${n}.xml` });\n }\n if (pivotTable.cacheRecords) {\n const xml = pivotCacheRecordsXform.toXml(pivotTable.cacheRecords);\n zip.append(xml, { name: `xl/pivotCache/pivotCacheRecords${n}.xml` });\n }\n } else {\n let xml = pivotCacheRecordsXform.toXml(pivotTable);\n zip.append(xml, { name: `xl/pivotCache/pivotCacheRecords${n}.xml` });\n\n xml = pivotCacheDefinitionXform.toXml(pivotTable);\n zip.append(xml, { name: `xl/pivotCache/pivotCacheDefinition${n}.xml` });\n }\n\n let xml = relsXform.toXml([\n {\n Id: \"rId1\",\n Type: XLSXBase.RelType.PivotCacheRecords,\n Target: `pivotCacheRecords${n}.xml`\n }\n ]);\n zip.append(xml, { name: `xl/pivotCache/_rels/pivotCacheDefinition${n}.xml.rels` });\n\n xml = pivotTableXform.toXml(pivotTable);\n zip.append(xml, { name: `xl/pivotTables/pivotTable${n}.xml` });\n\n xml = relsXform.toXml([\n {\n Id: \"rId1\",\n Type: XLSXBase.RelType.PivotCacheDefinition,\n Target: `../pivotCache/pivotCacheDefinition${n}.xml`\n }\n ]);\n zip.append(xml, { name: `xl/pivotTables/_rels/pivotTable${n}.xml.rels` });\n });\n }\n\n _finalize(zip: IZipWriter): Promise<this> {\n return new Promise((resolve, reject) => {\n zip.on(\"finish\", () => {\n resolve(this);\n });\n zip.on(\"error\", reject);\n zip.finalize();\n });\n }\n\n prepareModel(model: any, options: any): void {\n model.creator = model.creator || \"ExcelTS\";\n model.lastModifiedBy = model.lastModifiedBy || \"ExcelTS\";\n model.created = model.created || new Date();\n model.modified = model.modified || new Date();\n\n model.useSharedStrings =\n options.useSharedStrings !== undefined ? options.useSharedStrings : true;\n model.useStyles = options.useStyles !== undefined ? options.useStyles : true;\n\n model.sharedStrings = new SharedStringsXform();\n model.styles = model.useStyles ? new StylesXform(true) : new (StylesXform as any).Mock();\n\n const workbookXform = new WorkbookXform();\n const worksheetXform = new WorkSheetXform();\n\n workbookXform.prepare(model);\n\n const worksheetOptions: any = {\n sharedStrings: model.sharedStrings,\n styles: model.styles,\n date1904: model.properties.date1904,\n drawingsCount: 0,\n media: model.media\n };\n worksheetOptions.drawings = model.drawings = [];\n worksheetOptions.commentRefs = model.commentRefs = [];\n let tableCount = 0;\n model.tables = [];\n model.worksheets.forEach((worksheet: any) => {\n worksheet.tables.forEach((table: any) => {\n tableCount++;\n table.target = `table${tableCount}.xml`;\n table.id = tableCount;\n model.tables.push(table);\n });\n\n worksheetXform.prepare(worksheet, worksheetOptions);\n });\n }\n}\n\nexport { XLSXBase };\n","/**\n * XLSX Browser version - No Node.js dependencies\n *\n * Extends XLSXBase with:\n * - load: Load from buffer/ArrayBuffer/Uint8Array\n * - writeBuffer: Write to BrowserBuffer (Uint8Array with toString(\"base64\"))\n *\n * NOT supported:\n * - readFile/writeFile (no file system)\n * - read/write (no streams)\n */\n\nimport { ZipParser } from \"../utils/unzip/zip-parser\";\nimport { ZipWriter } from \"../utils/zip-stream.browser\";\nimport { StreamBuf } from \"../utils/stream-buf.browser\";\nimport { bufferToString } from \"../utils/utils\";\nimport { base64ToUint8Array, BrowserBuffer } from \"../utils/browser-buffer\";\nimport { XLSXBase, type IStreamBuf, type IParseStream } from \"./xlsx.base\";\n\n/**\n * Simple stream-like wrapper for parsing - implements async iterable\n */\nclass SimpleStream implements IParseStream {\n private data: string | Uint8Array;\n private listeners: Map<string, Function[]> = new Map();\n private ended = false;\n\n constructor(data: string | Uint8Array) {\n this.data = data;\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<Uint8Array | string> {\n yield this.data;\n }\n\n on(event: string, callback: Function): this {\n const listeners = this.listeners.get(event) || [];\n listeners.push(callback);\n this.listeners.set(event, listeners);\n\n if (!this.ended) {\n this.ended = true;\n queueMicrotask(() => {\n this.emit(\"data\", this.data);\n this.emit(\"end\");\n });\n }\n return this;\n }\n\n removeListener(event: string, callback: Function): this {\n const listeners = this.listeners.get(event) || [];\n const index = listeners.indexOf(callback);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n private emit(event: string, ...args: any[]): void {\n const listeners = this.listeners.get(event) || [];\n listeners.forEach(cb => cb(...args));\n }\n\n pipe(dest: IStreamBuf): IStreamBuf {\n dest.write(this.data instanceof Uint8Array ? this.data : new TextEncoder().encode(this.data));\n dest.end();\n return dest;\n }\n}\n\nclass XLSX extends XLSXBase {\n // ===========================================================================\n // Abstract method implementations\n // ===========================================================================\n\n protected createStreamBuf(): IStreamBuf {\n return new StreamBuf() as unknown as IStreamBuf;\n }\n\n protected createBinaryStream(data: Uint8Array): IParseStream {\n return new SimpleStream(data);\n }\n\n protected createTextStream(content: string): IParseStream {\n return new SimpleStream(content);\n }\n\n protected bufferToString(data: any): string {\n return bufferToString(data);\n }\n\n // ===========================================================================\n // Browser specific: Buffer operations\n // ===========================================================================\n\n /**\n * Load workbook from buffer/ArrayBuffer/Uint8Array\n * This is the main entry point for browser usage\n */\n async load(data: any, options?: any): Promise<any> {\n let buffer: Uint8Array;\n\n if (\n !data ||\n (typeof data === \"object\" && !(data instanceof Uint8Array) && !(data instanceof ArrayBuffer))\n ) {\n throw new Error(\n \"Can't read the data of 'the loaded zip file'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"\n );\n }\n\n if (options && options.base64) {\n buffer = base64ToUint8Array(data.toString());\n } else if (data instanceof ArrayBuffer) {\n buffer = new Uint8Array(data);\n } else if (data instanceof Uint8Array) {\n buffer = data;\n } else {\n buffer = new Uint8Array(data);\n }\n\n // Use native ZipParser for extraction\n const parser = new ZipParser(buffer);\n const allFiles = await parser.extractAll();\n\n // Convert Map to Record for loadFromFiles\n const filesRecord: Record<string, Uint8Array> = {};\n for (const [path, content] of allFiles) {\n filesRecord[path] = content;\n }\n\n return this.loadFromFiles(filesRecord, options);\n }\n\n /**\n * Write workbook to buffer\n * Returns a BrowserBuffer which supports toString(\"base64\")\n */\n async writeBuffer(options?: any): Promise<BrowserBuffer> {\n options = options || {};\n const { model } = this.workbook;\n const zip = new ZipWriter(options.zip);\n const stream = new StreamBuf();\n zip.pipe(stream);\n\n this.prepareModel(model, options);\n\n await this.addContentTypes(zip, model);\n await this.addOfficeRels(zip, model);\n await this.addWorkbookRels(zip, model);\n await this.addWorksheets(zip, model);\n await this.addSharedStrings(zip, model);\n this.addDrawings(zip, model);\n this.addTables(zip, model);\n this.addPivotTables(zip, model);\n await Promise.all([this.addThemes(zip, model), this.addStyles(zip, model)]);\n await this.addMedia(zip, model);\n await Promise.all([this.addApp(zip, model), this.addCore(zip, model)]);\n await this.addWorkbook(zip, model);\n\n await this._finalize(zip);\n return BrowserBuffer.from(stream.read());\n }\n\n // ===========================================================================\n // Browser specific: Media handling (no file support)\n // ===========================================================================\n\n async addMedia(zip: any, model: any): Promise<void> {\n await Promise.all(\n model.media.map(async (medium: any) => {\n if (medium.type === \"image\") {\n const filename = `xl/media/${medium.name}.${medium.extension}`;\n if (medium.buffer) {\n return zip.append(medium.buffer, { name: filename });\n }\n if (medium.base64) {\n const dataimg64 = medium.base64;\n const content = dataimg64.substring(dataimg64.indexOf(\",\") + 1);\n return zip.append(content, { name: filename, base64: true });\n }\n throw new Error(\"Loading images from filename is not supported in browser\");\n }\n throw new Error(\"Unsupported media\");\n })\n );\n }\n}\n\nexport { XLSX };\n","/**\n * High-performance native date parsing and formatting utilities\n *\n * Zero external dependencies. Optimized for CSV batch processing.\n * Uses character code operations and lookup tables for maximum speed.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported date format strings */\nexport type DateFormat =\n | \"YYYY-MM-DD[T]HH:mm:ssZ\"\n | \"YYYY-MM-DD[T]HH:mm:ss\"\n | \"YYYY-MM-DD[T]HH:mm:ss.SSSZ\"\n | \"YYYY-MM-DD\"\n | \"YYYY-MM-DD HH:mm:ss\"\n | \"MM-DD-YYYY\"\n | \"MM-DD-YYYY HH:mm:ss\"\n | \"MM/DD/YYYY HH:mm:ss\"\n | \"DD-MM-YYYY\"\n | \"DD-MM-YYYY HH:mm:ss\"\n | \"DD/MM/YYYY HH:mm:ss\";\n\n// ============================================================================\n// Constants - Pre-computed lookup tables for zero-allocation operations\n// ============================================================================\n\n// Padding lookup (0-59 covers hours, minutes, seconds, and months/days)\nconst PAD2 = Array.from({ length: 60 }, (_, i) => (i < 10 ? `0${i}` : `${i}`));\n\n// Character codes for fast comparison\nconst C_0 = 48;\nconst C_9 = 57;\nconst C_DASH = 45;\nconst C_SLASH = 47;\nconst C_COLON = 58;\nconst C_T = 84;\nconst C_SPACE = 32;\nconst C_Z = 90;\nconst C_PLUS = 43;\nconst C_DOT = 46;\n\n// ============================================================================\n// Low-level utilities (inlined for JIT optimization)\n// ============================================================================\n\n// Inline digit extraction - avoid function call overhead\n// Using bitwise OR for integer coercion (faster than Math.floor)\nconst digit2 = (s: string, i: number) =>\n ((s.charCodeAt(i) - C_0) * 10 + s.charCodeAt(i + 1) - C_0) | 0;\nconst digit4 = (s: string, i: number) =>\n ((s.charCodeAt(i) - C_0) * 1000 +\n (s.charCodeAt(i + 1) - C_0) * 100 +\n (s.charCodeAt(i + 2) - C_0) * 10 +\n s.charCodeAt(i + 3) -\n C_0) |\n 0;\n\n// Days in month lookup (index 0 unused, 1-12 for Jan-Dec)\n// Using 31 for Feb; actual validation done by Date constructor\nconst DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction validateDate(y: number, m: number, d: number): Date | null {\n // Fast bounds check using lookup table\n if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {\n return null;\n }\n const date = new Date(y, m - 1, d);\n // Check for overflow (e.g., Feb 30 -> Mar 2)\n return date.getMonth() === m - 1 ? date : null;\n}\n\nfunction validateDateTime(\n y: number,\n m: number,\n d: number,\n h: number,\n min: number,\n s: number\n): Date | null {\n if (m < 1 || m > 12 || d < 1 || d > DAYS_IN_MONTH[m]) {\n return null;\n }\n if (h > 23 || min > 59 || s > 59) {\n return null;\n }\n return new Date(y, m - 1, d, h, min, s);\n}\n\n// ============================================================================\n// Specialized parsers (length-based dispatch for speed)\n// ============================================================================\n\n// YYYY-MM-DD (10 chars)\nfunction parseISO(s: string): Date | null {\n if (s.charCodeAt(4) !== C_DASH || s.charCodeAt(7) !== C_DASH) {\n return null;\n }\n return validateDate(digit4(s, 0), digit2(s, 5), digit2(s, 8));\n}\n\n// YYYY-MM-DDTHH:mm:ss (19 chars)\nfunction parseISOT(s: string): Date | null {\n if (\n s.charCodeAt(4) !== C_DASH ||\n s.charCodeAt(7) !== C_DASH ||\n s.charCodeAt(10) !== C_T ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 0),\n digit2(s, 5),\n digit2(s, 8),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// YYYY-MM-DD HH:mm:ss (19 chars, space separator)\nfunction parseISOSpace(s: string): Date | null {\n if (\n s.charCodeAt(4) !== C_DASH ||\n s.charCodeAt(7) !== C_DASH ||\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 0),\n digit2(s, 5),\n digit2(s, 8),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// YYYY-MM-DDTHH:mm:ssZ (20 chars)\nfunction parseISOZ(s: string): Date | null {\n if (s.charCodeAt(19) !== C_Z) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss.SSSZ (24 chars)\nfunction parseISOMsZ(s: string): Date | null {\n if (s.charCodeAt(19) !== C_DOT || s.charCodeAt(23) !== C_Z) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss+HH:mm (25 chars)\nfunction parseISOOffset(s: string): Date | null {\n const c = s.charCodeAt(19);\n if (c !== C_PLUS && c !== C_DASH) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// YYYY-MM-DDTHH:mm:ss.SSS+HH:mm (29 chars)\nfunction parseISOMsOffset(s: string): Date | null {\n if (s.charCodeAt(19) !== C_DOT) {\n return null;\n }\n const c = s.charCodeAt(23);\n if (c !== C_PLUS && c !== C_DASH) {\n return null;\n }\n const d = new Date(s);\n return isNaN(d.getTime()) ? null : d;\n}\n\n// MM-DD-YYYY or MM/DD/YYYY (10 chars)\nfunction parseUS(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n return validateDate(digit4(s, 6), digit2(s, 0), digit2(s, 3));\n}\n\n// DD-MM-YYYY or DD/MM/YYYY (10 chars)\nfunction parseEU(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n return validateDate(digit4(s, 6), digit2(s, 3), digit2(s, 0));\n}\n\n// MM-DD-YYYY HH:mm:ss or MM/DD/YYYY HH:mm:ss (19 chars)\nfunction parseUSTime(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n if (\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 6),\n digit2(s, 0),\n digit2(s, 3),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// DD-MM-YYYY HH:mm:ss or DD/MM/YYYY HH:mm:ss (19 chars)\nfunction parseEUTime(s: string): Date | null {\n const sep = s.charCodeAt(2);\n if ((sep !== C_DASH && sep !== C_SLASH) || s.charCodeAt(5) !== sep) {\n return null;\n }\n if (\n s.charCodeAt(10) !== C_SPACE ||\n s.charCodeAt(13) !== C_COLON ||\n s.charCodeAt(16) !== C_COLON\n ) {\n return null;\n }\n return validateDateTime(\n digit4(s, 6),\n digit2(s, 3),\n digit2(s, 0),\n digit2(s, 11),\n digit2(s, 14),\n digit2(s, 17)\n );\n}\n\n// ============================================================================\n// Format dispatch tables\n// ============================================================================\n\ntype Parser = (s: string) => Date | null;\n\nconst PARSERS: Record<DateFormat, Parser> = {\n \"YYYY-MM-DD\": parseISO,\n \"YYYY-MM-DD[T]HH:mm:ss\": parseISOT,\n \"YYYY-MM-DD HH:mm:ss\": parseISOSpace,\n \"YYYY-MM-DD[T]HH:mm:ssZ\": s =>\n s.length === 20 ? parseISOZ(s) : s.length === 25 ? parseISOOffset(s) : null,\n \"YYYY-MM-DD[T]HH:mm:ss.SSSZ\": s =>\n s.length === 24 ? parseISOMsZ(s) : s.length === 29 ? parseISOMsOffset(s) : null,\n \"MM-DD-YYYY\": parseUS,\n \"MM-DD-YYYY HH:mm:ss\": parseUSTime,\n \"MM/DD/YYYY HH:mm:ss\": parseUSTime,\n \"DD-MM-YYYY\": parseEU,\n \"DD-MM-YYYY HH:mm:ss\": parseEUTime,\n \"DD/MM/YYYY HH:mm:ss\": parseEUTime\n};\n\n// Length-based auto-detection (ISO formats only, US/EU excluded due to ambiguity)\nconst AUTO_DETECT: Array<[number, Parser[]]> = [\n [10, [parseISO]],\n [19, [parseISOT, parseISOSpace]],\n [20, [parseISOZ]],\n [24, [parseISOMsZ]],\n [25, [parseISOOffset]],\n [29, [parseISOMsOffset]]\n];\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Quick pre-filter to reject non-date strings\n */\nexport function mightBeDate(s: string): boolean {\n const len = s.length;\n if (len < 10 || len > 30) {\n return false;\n }\n const c0 = s.charCodeAt(0);\n const c1 = s.charCodeAt(1);\n // Must start with digits\n if (c0 < C_0 || c0 > C_9 || c1 < C_0 || c1 > C_9) {\n return false;\n }\n const c2 = s.charCodeAt(2);\n // Either YYYY format (4 digits) or MM/DD format (separator at pos 2)\n return (c2 >= C_0 && c2 <= C_9) || c2 === C_DASH || c2 === C_SLASH;\n}\n\n/**\n * Parse a date string\n *\n * @param value - String to parse\n * @param formats - Specific formats to try (optional, auto-detects ISO if omitted)\n * @returns Date object or null\n *\n * @example\n * parseDate(\"2024-12-26\") // auto-detect ISO\n * parseDate(\"12-26-2024\", [\"MM-DD-YYYY\"]) // explicit US format\n */\nexport function parseDate(value: string, formats?: DateFormat[]): Date | null {\n if (!value || typeof value !== \"string\") {\n return null;\n }\n const s = value.trim();\n if (!s) {\n return null;\n }\n\n // Explicit formats\n if (formats?.length) {\n for (const fmt of formats) {\n const result = PARSERS[fmt]?.(s);\n if (result) {\n return result;\n }\n }\n return null;\n }\n\n // Auto-detect by length\n const len = s.length;\n for (const [l, parsers] of AUTO_DETECT) {\n if (len === l) {\n for (const p of parsers) {\n const result = p(s);\n if (result) {\n return result;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * Format a Date to string\n *\n * @param date - Date to format\n * @param format - Format template (optional, defaults to ISO)\n * @param utc - Use UTC time (default: false)\n * @returns Formatted string or empty string if invalid\n *\n * @example\n * formatDate(date) // \"2024-12-26T10:30:00.000+08:00\"\n * formatDate(date, \"YYYY-MM-DD\", true) // \"2024-12-26\"\n */\nexport function formatDate(date: Date, format?: string, utc = false): string {\n if (!(date instanceof Date)) {\n return \"\";\n }\n const t = date.getTime();\n if (t !== t) {\n return \"\";\n } // NaN check (faster than isNaN)\n\n // Default ISO format - direct string building (faster than toISOString)\n if (!format) {\n if (utc) {\n const y = date.getUTCFullYear();\n const M = date.getUTCMonth() + 1;\n const D = date.getUTCDate();\n const H = date.getUTCHours();\n const m = date.getUTCMinutes();\n const s = date.getUTCSeconds();\n const ms = date.getUTCMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}Z`;\n }\n const y = date.getFullYear();\n const M = date.getMonth() + 1;\n const D = date.getDate();\n const H = date.getHours();\n const m = date.getMinutes();\n const s = date.getSeconds();\n const ms = date.getMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}${tzOffset(date)}`;\n }\n\n // Fast paths for common formats\n if (format === \"YYYY-MM-DD\") {\n return utc\n ? `${date.getUTCFullYear()}-${PAD2[date.getUTCMonth() + 1]}-${PAD2[date.getUTCDate()]}`\n : `${date.getFullYear()}-${PAD2[date.getMonth() + 1]}-${PAD2[date.getDate()]}`;\n }\n\n return renderFormat(date, format, utc);\n}\n\nfunction tzOffset(d: Date): string {\n const off = -d.getTimezoneOffset();\n const sign = off >= 0 ? \"+\" : \"-\";\n const h = (Math.abs(off) / 60) | 0; // Bitwise OR faster than Math.floor\n const m = Math.abs(off) % 60;\n return `${sign}${PAD2[h]}:${PAD2[m]}`;\n}\n\nfunction renderFormat(d: Date, fmt: string, utc: boolean): string {\n // Handle escaped sections [...]\n const esc: string[] = [];\n let out = fmt.replace(/\\[([^\\]]*)\\]/g, (_, c) => {\n esc.push(c);\n return `\\x00${esc.length - 1}\\x00`;\n });\n\n // Get components once\n const y = utc ? d.getUTCFullYear() : d.getFullYear();\n const M = utc ? d.getUTCMonth() + 1 : d.getMonth() + 1;\n const D = utc ? d.getUTCDate() : d.getDate();\n const H = utc ? d.getUTCHours() : d.getHours();\n const m = utc ? d.getUTCMinutes() : d.getMinutes();\n const s = utc ? d.getUTCSeconds() : d.getSeconds();\n const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();\n\n // Replace tokens\n out = out\n .replace(/YYYY/g, String(y))\n .replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms))\n .replace(/MM/g, PAD2[M])\n .replace(/DD/g, PAD2[D])\n .replace(/HH/g, PAD2[H])\n .replace(/mm/g, PAD2[m])\n .replace(/ss/g, PAD2[s])\n .replace(/Z/g, utc ? \"Z\" : tzOffset(d));\n\n // Restore escaped\n if (esc.length) {\n // oxlint-disable-next-line no-control-regex\n out = out.replace(/\\x00(\\d+)\\x00/g, (_, i) => esc[+i]);\n }\n return out;\n}\n\n// ============================================================================\n// High-performance batch processors (class-based for state encapsulation)\n// ============================================================================\n\n/**\n * Optimized date parser for batch processing\n *\n * @example\n * const parser = DateParser.create([\"YYYY-MM-DD\"]);\n * const dates = parser.parseAll(csvStrings);\n */\nexport class DateParser {\n private readonly fns: Parser[];\n private readonly single: boolean;\n private readonly fn0: Parser;\n\n private constructor(fns: Parser[]) {\n this.fns = fns;\n this.single = fns.length === 1;\n this.fn0 = fns[0];\n }\n\n /** Create parser for specific formats */\n static create(formats: readonly DateFormat[]): DateParser {\n return new DateParser(formats.map(f => PARSERS[f]).filter(Boolean));\n }\n\n /** Create parser for auto-detecting ISO formats */\n static iso(): DateParser {\n const fns: Parser[] = [];\n for (const [, parsers] of AUTO_DETECT) {\n fns.push(...parsers);\n }\n return new DateParser(fns);\n }\n\n /** Parse single value */\n parse = (value: string): Date | null => {\n if (!value) {\n return null;\n }\n const s = value.trim();\n if (!s) {\n return null;\n }\n // Fast path for single parser\n if (this.single) {\n return this.fn0(s);\n }\n // Multi-parser path\n for (let i = 0, len = this.fns.length; i < len; i++) {\n const r = this.fns[i](s);\n if (r) {\n return r;\n }\n }\n return null;\n };\n\n /** Parse array of values */\n parseAll(values: string[]): (Date | null)[] {\n const len = values.length;\n const out = new Array<Date | null>(len);\n const parse = this.parse;\n for (let i = 0; i < len; i++) {\n out[i] = parse(values[i]);\n }\n return out;\n }\n\n /** Parse and filter valid dates */\n parseValid(values: string[]): Date[] {\n const out: Date[] = [];\n const parse = this.parse;\n for (let i = 0, len = values.length; i < len; i++) {\n const d = parse(values[i]);\n if (d) {\n out.push(d);\n }\n }\n return out;\n }\n}\n\n/**\n * Optimized date formatter for batch processing\n *\n * @example\n * const formatter = DateFormatter.create(\"YYYY-MM-DD\", { utc: true });\n * const strings = formatter.formatAll(dates);\n */\nexport class DateFormatter {\n private readonly fn: (d: Date) => string;\n\n private constructor(fn: (d: Date) => string) {\n this.fn = fn;\n }\n\n /** Create ISO formatter (fastest) */\n static iso(utc = false): DateFormatter {\n // Direct string building is faster than toISOString() + slice\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n } // NaN check\n const y = d.getUTCFullYear();\n const M = d.getUTCMonth() + 1;\n const D = d.getUTCDate();\n const H = d.getUTCHours();\n const m = d.getUTCMinutes();\n const s = d.getUTCSeconds();\n const ms = d.getUTCMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}Z`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n } // NaN check\n const y = d.getFullYear();\n const M = d.getMonth() + 1;\n const D = d.getDate();\n const H = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n return `${y}-${PAD2[M]}-${PAD2[D]}T${PAD2[H]}:${PAD2[m]}:${PAD2[s]}.${ms < 10 ? \"00\" + ms : ms < 100 ? \"0\" + ms : ms}${tzOffset(d)}`;\n });\n }\n\n /** Create custom format formatter */\n static create(format: string, options?: { utc?: boolean }): DateFormatter {\n const utc = options?.utc ?? false;\n\n // Fast paths for common formats (no regex, direct string building)\n if (format === \"YYYY-MM-DD\") {\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]}`;\n });\n }\n\n if (format === \"YYYY-MM-DD HH:mm:ss\") {\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getUTCFullYear()}-${PAD2[d.getUTCMonth() + 1]}-${PAD2[d.getUTCDate()]} ${PAD2[d.getUTCHours()]}:${PAD2[d.getUTCMinutes()]}:${PAD2[d.getUTCSeconds()]}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${d.getFullYear()}-${PAD2[d.getMonth() + 1]}-${PAD2[d.getDate()]} ${PAD2[d.getHours()]}:${PAD2[d.getMinutes()]}:${PAD2[d.getSeconds()]}`;\n });\n }\n\n if (format === \"MM-DD-YYYY\" || format === \"MM/DD/YYYY\") {\n const sep = format.charAt(2);\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getUTCMonth() + 1]}${sep}${PAD2[d.getUTCDate()]}${sep}${d.getUTCFullYear()}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getMonth() + 1]}${sep}${PAD2[d.getDate()]}${sep}${d.getFullYear()}`;\n });\n }\n\n if (format === \"DD-MM-YYYY\" || format === \"DD/MM/YYYY\") {\n const sep = format.charAt(2);\n return utc\n ? new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getUTCDate()]}${sep}${PAD2[d.getUTCMonth() + 1]}${sep}${d.getUTCFullYear()}`;\n })\n : new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n return `${PAD2[d.getDate()]}${sep}${PAD2[d.getMonth() + 1]}${sep}${d.getFullYear()}`;\n });\n }\n\n // Generic path with pre-compiled template\n return DateFormatter.createGeneric(format, utc);\n }\n\n /** Generic formatter for arbitrary formats */\n private static createGeneric(format: string, utc: boolean): DateFormatter {\n // Pre-process escaped sections\n const esc: string[] = [];\n const tpl = format.replace(/\\[([^\\]]*)\\]/g, (_, c) => {\n esc.push(c);\n return `\\x00${esc.length - 1}\\x00`;\n });\n\n // Detect used tokens for conditional computation\n const hasY = tpl.includes(\"YYYY\");\n const hasMs = tpl.includes(\"SSS\");\n const hasM = tpl.includes(\"MM\");\n const hasD = tpl.includes(\"DD\");\n const hasH = tpl.includes(\"HH\");\n const hasMin = tpl.includes(\"mm\");\n const hasS = tpl.includes(\"ss\");\n const hasZ = tpl.includes(\"Z\");\n\n return new DateFormatter(d => {\n if (!(d instanceof Date)) {\n return \"\";\n }\n const t = d.getTime();\n if (t !== t) {\n return \"\";\n }\n\n let out = tpl;\n if (hasY) {\n out = out.replace(/YYYY/g, String(utc ? d.getUTCFullYear() : d.getFullYear()));\n }\n if (hasMs) {\n const ms = utc ? d.getUTCMilliseconds() : d.getMilliseconds();\n out = out.replace(/SSS/g, ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : String(ms));\n }\n if (hasM) {\n out = out.replace(/MM/g, PAD2[utc ? d.getUTCMonth() + 1 : d.getMonth() + 1]);\n }\n if (hasD) {\n out = out.replace(/DD/g, PAD2[utc ? d.getUTCDate() : d.getDate()]);\n }\n if (hasH) {\n out = out.replace(/HH/g, PAD2[utc ? d.getUTCHours() : d.getHours()]);\n }\n if (hasMin) {\n out = out.replace(/mm/g, PAD2[utc ? d.getUTCMinutes() : d.getMinutes()]);\n }\n if (hasS) {\n out = out.replace(/ss/g, PAD2[utc ? d.getUTCSeconds() : d.getSeconds()]);\n }\n if (hasZ) {\n out = out.replace(/Z/g, utc ? \"Z\" : tzOffset(d));\n }\n\n if (esc.length) {\n // oxlint-disable-next-line no-control-regex\n out = out.replace(/\\x00(\\d+)\\x00/g, (_, i) => esc[+i]);\n }\n return out;\n });\n }\n\n /** Format single date */\n format = (date: Date): string => this.fn(date);\n\n /** Format array of dates */\n formatAll(dates: Date[]): string[] {\n const len = dates.length;\n const out = new Array<string>(len);\n const fn = this.fn;\n for (let i = 0; i < len; i++) {\n out[i] = fn(dates[i]);\n }\n return out;\n }\n}\n\n/** Get supported format strings */\nexport function getSupportedFormats(): DateFormat[] {\n return Object.keys(PARSERS) as DateFormat[];\n}\n","/**\n * CSV Parser and Formatter - RFC 4180 compliant\n *\n * A lightweight, cross-platform CSV implementation that works in both\n * Node.js and Browser environments with zero dependencies.\n *\n * High-performance RFC 4180 compliant CSV parser and formatter.\n *\n * @see https://tools.ietf.org/html/rfc4180\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Header array type (can include undefined to skip columns) */\nexport type HeaderArray = (string | undefined | null)[];\n\n/** Header transform function */\nexport type HeaderTransformFunction = (headers: string[]) => HeaderArray;\n\n/** Row types */\nexport type RowArray = string[];\nexport type RowMap = Record<string, string>;\nexport type Row = RowArray | RowMap;\n\n/** Row transform callback */\nexport type RowTransformCallback<T> = (error?: Error | null, row?: T | null) => void;\n\n/** Row transform function - sync or async */\nexport type RowTransformFunction<I = Row, O = Row> =\n | ((row: I) => O | null)\n | ((row: I, callback: RowTransformCallback<O>) => void);\n\n/** Row validate callback */\nexport type RowValidateCallback = (\n error?: Error | null,\n isValid?: boolean,\n reason?: string\n) => void;\n\n/** Row validate function - sync or async */\nexport type RowValidateFunction<T = Row> =\n | ((row: T) => boolean)\n | ((row: T, callback: RowValidateCallback) => void);\n\n/** Validation result */\nexport interface RowValidationResult<T = Row> {\n row: T | null;\n isValid: boolean;\n reason?: string;\n}\n\n/**\n * CSV parsing options\n */\nexport interface CsvParseOptions {\n /** Field delimiter (default: \",\") */\n delimiter?: string;\n /** Quote character (default: '\"'), set to false or null to disable quoting */\n quote?: string | false | null;\n /** Escape character for quotes (default: '\"'), set to false or null to disable */\n escape?: string | false | null;\n /** Skip empty lines (default: false) */\n skipEmptyLines?: boolean;\n /** Alias for skipEmptyLines */\n ignoreEmpty?: boolean;\n /** Trim whitespace from both sides of fields (default: false) */\n trim?: boolean;\n /** Left trim whitespace from fields (default: false) */\n ltrim?: boolean;\n /** Right trim whitespace from fields (default: false) */\n rtrim?: boolean;\n /**\n * Header handling:\n * - true: first row is headers, return objects\n * - false: no headers, return arrays\n * - string[]: use these as headers\n * - function: transform first row headers\n */\n headers?: boolean | HeaderArray | HeaderTransformFunction;\n /**\n * If true and headers is string[], discard first row and use provided headers\n */\n renameHeaders?: boolean;\n /** Comment character - lines starting with this are ignored */\n comment?: string;\n /** Maximum number of data rows to parse (excluding header) */\n maxRows?: number;\n /** Number of lines to skip at the beginning (before header detection) */\n skipLines?: number;\n /** Number of data rows to skip (after header detection) */\n skipRows?: number;\n /**\n * Strict column handling:\n * - If true, rows with column count mismatch emit 'data-invalid' event\n * - If false (default), throws error on mismatch (unless discardUnmappedColumns)\n */\n strictColumnHandling?: boolean;\n /**\n * If true, discard columns that exceed header count\n * Only valid when headers are specified\n */\n discardUnmappedColumns?: boolean;\n /**\n * Enable object mode (default: true for Node.js streams)\n * - true: push row objects/arrays\n * - false: push JSON strings\n */\n objectMode?: boolean;\n /**\n * Character encoding for input (default: \"utf8\")\n * Only used in Node.js streaming context\n */\n encoding?: BufferEncoding;\n /**\n * Synchronous transform function to apply to each row after parsing\n * Return null/undefined to skip the row\n * Works in both Node.js and Browser environments\n *\n * @example\n * // With headers (row is Record<string, string>)\n * transform: (row) => ({ ...row, name: row.name.toUpperCase() })\n *\n * // Without headers (row is string[])\n * transform: (row) => [row[0].toUpperCase(), row[1]]\n */\n transform?: (row: Row) => Row | null | undefined;\n /**\n * Synchronous validate function to check each row\n * Return false to mark row as invalid (will be in invalidRows)\n * Can also return { isValid: boolean, reason?: string }\n * Works in both Node.js and Browser environments\n *\n * @example\n * // With headers\n * validate: (row) => row.name !== ''\n *\n * // With custom reason\n * validate: (row) => ({ isValid: row.age >= 18, reason: 'Must be adult' })\n */\n validate?: (row: Row) => boolean | { isValid: boolean; reason?: string };\n}\n\n/**\n * CSV formatting options\n */\nexport interface CsvFormatOptions {\n /** Field delimiter (default: \",\") */\n delimiter?: string;\n /** Quote character (default: '\"'), set to false or null to disable quoting */\n quote?: string | false | null;\n /** Escape character (default: same as quote) */\n escape?: string | false | null;\n /** Row delimiter (default: \"\\n\") */\n rowDelimiter?: string;\n /** Always quote all fields (default: false, only quote when necessary) */\n alwaysQuote?: boolean;\n /** Quote specific columns by name or index */\n quoteColumns?: boolean | boolean[] | Record<string, boolean>;\n /** Quote header fields */\n quoteHeaders?: boolean | boolean[] | Record<string, boolean>;\n /**\n * Header handling:\n * - true: auto-detect headers from first object\n * - false/null: no headers\n * - string[]: use these as headers\n */\n headers?: string[] | boolean | null;\n /**\n * Whether to write headers (default: true when headers is provided)\n * Set to false to suppress header row output\n */\n writeHeaders?: boolean;\n /** Include BOM for UTF-8 (default: false) */\n writeBOM?: boolean;\n /** Include final row delimiter (default: true) */\n includeEndRowDelimiter?: boolean;\n /** Write headers even when there's no data (default: false) */\n alwaysWriteHeaders?: boolean;\n /**\n * Transform function to apply to each row before formatting\n * Can be sync (returns row) or async (calls callback)\n */\n transform?: RowTransformFunction<Row, Row>;\n /**\n * Enable object mode (default: true for Node.js streams)\n * - true: accept row objects/arrays directly\n * - false: accept JSON strings\n */\n objectMode?: boolean;\n}\n\n/**\n * Parsed CSV result with headers\n */\nexport interface CsvParseResult<T = string[]> {\n /** Header row (if headers option was true) */\n headers?: string[];\n /** Data rows */\n rows: T[];\n /** Invalid rows (when strictColumnHandling is true) */\n invalidRows?: { row: string[]; reason: string }[];\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Check if a transform function is synchronous (1 argument) vs async (2 arguments)\n */\nexport function isSyncTransform<I, O>(\n transform: RowTransformFunction<I, O>\n): transform is (row: I) => O | null {\n return transform.length === 1;\n}\n\n/**\n * Check if a validate function is synchronous (1 argument) vs async (2 arguments)\n */\nexport function isSyncValidate<T>(\n validate: RowValidateFunction<T>\n): validate is (row: T) => boolean {\n return validate.length === 1;\n}\n\n/**\n * Check if headers are unique\n */\nfunction validateUniqueHeaders(headers: HeaderArray): void {\n const seen = new Set<string>();\n const duplicates: string[] = [];\n\n for (const header of headers) {\n if (header !== null && header !== undefined) {\n if (seen.has(header)) {\n duplicates.push(header);\n }\n seen.add(header);\n }\n }\n\n if (duplicates.length > 0) {\n throw new Error(`Duplicate headers found ${JSON.stringify(duplicates)}`);\n }\n}\n\n/**\n * Apply trim options to a field\n */\nfunction applyTrim(field: string, trim: boolean, ltrim: boolean, rtrim: boolean): string {\n if (trim) {\n return field.trim();\n }\n let result = field;\n if (ltrim) {\n result = result.trimStart();\n }\n if (rtrim) {\n result = result.trimEnd();\n }\n return result;\n}\n\n// =============================================================================\n// Parse Functions\n// =============================================================================\n\n/**\n * Parse a CSV string into rows of fields\n */\nexport function parseCsv(\n input: string,\n options: CsvParseOptions = {}\n): string[][] | CsvParseResult<Record<string, string>> {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption = '\"',\n skipEmptyLines = false,\n ignoreEmpty = false,\n trim = false,\n ltrim = false,\n rtrim = false,\n headers = false,\n renameHeaders = false,\n comment,\n maxRows,\n skipLines = 0,\n skipRows = 0,\n strictColumnHandling = false,\n discardUnmappedColumns = false,\n transform,\n validate\n } = options;\n\n const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;\n\n // Handle quote: null/false to disable quoting\n const quoteEnabled = quoteOption !== null && quoteOption !== false;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : \"\";\n\n const rows: string[][] = [];\n const invalidRows: { row: string[]; reason: string }[] = [];\n let currentRow: string[] = [];\n let currentField = \"\";\n let inQuotes = false;\n let i = 0;\n let lineNumber = 0;\n let dataRowCount = 0;\n let skippedDataRows = 0;\n\n // Header handling\n let headerRow: HeaderArray | null = null;\n let headersLength = 0;\n let useHeaders = false;\n let headerRowProcessed = false;\n\n // Determine header mode\n if (headers === true) {\n useHeaders = true;\n } else if (Array.isArray(headers)) {\n headerRow = headers;\n headersLength = headers.filter(h => h !== null && h !== undefined).length;\n validateUniqueHeaders(headers);\n useHeaders = true;\n if (!renameHeaders) {\n headerRowProcessed = true; // We already have headers, don't wait for first row\n }\n } else if (typeof headers === \"function\") {\n useHeaders = true;\n }\n\n // Normalize line endings\n input = input.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\n const processRow = (row: string[]): boolean => {\n // If we have headers defined and this is the first data row (for headers: true)\n // or we need to validate headers from a function\n if (useHeaders && !headerRowProcessed) {\n // First row is headers\n if (typeof headers === \"function\") {\n const transformed = headers(row);\n validateUniqueHeaders(transformed);\n headerRow = transformed;\n } else if (!Array.isArray(headers)) {\n validateUniqueHeaders(row);\n headerRow = row;\n }\n headersLength = headerRow!.filter(h => h !== null && h !== undefined).length;\n headerRowProcessed = true;\n\n // If renameHeaders and custom headers provided, discard this row\n if (renameHeaders) {\n return false;\n }\n\n // For headers: true, don't add header row to data\n if (headers === true || typeof headers === \"function\") {\n return false;\n }\n\n return false;\n }\n\n // Skip data rows\n if (skippedDataRows < skipRows) {\n skippedDataRows++;\n return false;\n }\n\n // Column validation when using headers\n if (headerRow && headerRow.length > 0) {\n const expectedCols = headersLength;\n const actualCols = row.length;\n\n if (actualCols > expectedCols) {\n if (strictColumnHandling && !discardUnmappedColumns) {\n // Mark as invalid but continue\n invalidRows.push({\n row,\n reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`\n });\n return false;\n } else {\n // Default: trim extra columns\n row.length = headerRow.length;\n }\n } else if (actualCols < expectedCols) {\n if (strictColumnHandling) {\n invalidRows.push({\n row,\n reason: `Column header mismatch expected: ${expectedCols} columns got: ${actualCols}`\n });\n return false;\n }\n // Pad with empty strings\n while (row.length < headerRow.length) {\n row.push(\"\");\n }\n }\n }\n\n return true;\n };\n\n while (i < input.length) {\n const char = input[i];\n const nextChar = input[i + 1];\n\n if (inQuotes && quoteEnabled) {\n // Inside quoted field\n if (escape && char === escape && nextChar === quote) {\n // Escaped quote\n currentField += quote;\n i += 2;\n } else if (char === quote) {\n // End of quoted field\n inQuotes = false;\n i++;\n } else {\n currentField += char;\n i++;\n }\n } else {\n // Outside quoted field\n if (quoteEnabled && char === quote && currentField === \"\") {\n // Start of quoted field\n inQuotes = true;\n i++;\n } else if (char === delimiter) {\n // Field separator\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n currentField = \"\";\n i++;\n } else if (char === \"\\n\") {\n // End of row\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n currentField = \"\";\n\n lineNumber++;\n\n // Skip lines at beginning\n if (lineNumber <= skipLines) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Skip comment lines\n if (comment && currentRow[0]?.startsWith(comment)) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Skip empty lines\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (shouldSkipEmpty && isEmpty) {\n currentRow = [];\n i++;\n continue;\n }\n\n // Process row (handles headers, validation)\n if (processRow(currentRow)) {\n rows.push(currentRow);\n dataRowCount++;\n }\n\n currentRow = [];\n i++;\n\n // Check max rows - after resetting currentRow\n if (maxRows !== undefined && dataRowCount >= maxRows) {\n break;\n }\n } else {\n currentField += char;\n i++;\n }\n }\n }\n\n // Handle last field/row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n\n // Skip lines at beginning\n if (lineNumber >= skipLines) {\n // Skip comment lines\n if (!(comment && currentRow[0]?.startsWith(comment))) {\n // Skip empty lines\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (!(shouldSkipEmpty && isEmpty)) {\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n if (processRow(currentRow)) {\n rows.push(currentRow);\n }\n }\n }\n }\n }\n }\n\n // Convert to objects if headers enabled\n if (useHeaders && headerRow) {\n let dataRows = rows.map(row => {\n const obj: Record<string, string> = {};\n headerRow!.forEach((header, index) => {\n if (header !== null && header !== undefined) {\n obj[header] = row[index] ?? \"\";\n }\n });\n return obj;\n });\n\n // Apply transform if provided\n if (transform) {\n dataRows = dataRows\n .map(row => transform(row))\n .filter((row): row is Record<string, string> => row !== null && row !== undefined);\n }\n\n // Apply validate if provided\n if (validate) {\n const validatedRows: Record<string, string>[] = [];\n for (const row of dataRows) {\n const result = validate(row);\n if (typeof result === \"boolean\") {\n if (result) {\n validatedRows.push(row);\n } else {\n invalidRows.push({ row: Object.values(row), reason: \"Validation failed\" });\n }\n } else {\n if (result.isValid) {\n validatedRows.push(row);\n } else {\n invalidRows.push({\n row: Object.values(row),\n reason: result.reason || \"Validation failed\"\n });\n }\n }\n }\n dataRows = validatedRows;\n }\n\n if ((strictColumnHandling || validate) && invalidRows.length > 0) {\n return {\n headers: headerRow.filter((h): h is string => h !== null && h !== undefined),\n rows: dataRows,\n invalidRows\n };\n }\n\n return {\n headers: headerRow.filter((h): h is string => h !== null && h !== undefined),\n rows: dataRows\n };\n }\n\n // For array mode (no headers), apply transform and validate\n let resultRows: string[][] = rows;\n\n if (transform) {\n resultRows = resultRows\n .map(row => transform(row))\n .filter((row): row is string[] => row !== null && row !== undefined);\n }\n\n if (validate) {\n const validatedRows: string[][] = [];\n const arrayInvalidRows: { row: string[]; reason: string }[] = [];\n for (const row of resultRows) {\n const result = validate(row);\n if (typeof result === \"boolean\") {\n if (result) {\n validatedRows.push(row);\n } else {\n arrayInvalidRows.push({ row, reason: \"Validation failed\" });\n }\n } else {\n if (result.isValid) {\n validatedRows.push(row);\n } else {\n arrayInvalidRows.push({ row, reason: result.reason || \"Validation failed\" });\n }\n }\n }\n resultRows = validatedRows;\n\n if (arrayInvalidRows.length > 0) {\n return {\n rows: resultRows,\n invalidRows: arrayInvalidRows\n } as any; // Return with invalidRows for array mode too\n }\n }\n\n return resultRows;\n}\n\n// =============================================================================\n// Format Functions\n// =============================================================================\n\n/**\n * Format data as a CSV string\n */\nexport function formatCsv(\n data: (string | number | boolean | null | undefined)[][] | Record<string, any>[],\n options: CsvFormatOptions = {}\n): string {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption,\n rowDelimiter = \"\\n\",\n alwaysQuote = false,\n quoteColumns = false,\n quoteHeaders = false,\n headers,\n writeHeaders: writeHeadersOption,\n writeBOM = false,\n includeEndRowDelimiter = false,\n alwaysWriteHeaders = false,\n transform\n } = options;\n\n // Determine if headers should be written (default: true when headers is provided)\n const shouldWriteHeaders = writeHeadersOption ?? true;\n\n // If quote is false or null, disable quoting entirely\n const quoteEnabled = quoteOption !== false && quoteOption !== null;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape =\n escapeOption !== undefined && escapeOption !== false && escapeOption !== null\n ? String(escapeOption)\n : quote;\n\n const lines: string[] = [];\n\n const shouldQuoteColumn = (\n index: number,\n header?: string,\n isHeader: boolean = false\n ): boolean => {\n const quoteConfig = isHeader ? quoteHeaders : quoteColumns;\n\n if (typeof quoteConfig === \"boolean\") {\n return quoteConfig;\n }\n if (Array.isArray(quoteConfig)) {\n return quoteConfig[index] === true;\n }\n if (typeof quoteConfig === \"object\" && header) {\n return quoteConfig[header] === true;\n }\n return false;\n };\n\n const formatField = (\n value: any,\n index: number,\n header?: string,\n isHeader: boolean = false\n ): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n const str = String(value);\n\n // If quoting is disabled, return raw string\n if (!quoteEnabled) {\n return str;\n }\n\n // Check if quoting is needed\n const forceQuote = alwaysQuote || shouldQuoteColumn(index, header, isHeader);\n\n // Check if quoting is needed (contains delimiter, quote, or newline)\n const quoteRegex = new RegExp(`[${escapeRegex(delimiter)}${escapeRegex(quote)}\\r\\n]`);\n const needsQuote = forceQuote || quoteRegex.test(str);\n\n if (needsQuote) {\n // Escape quotes\n const escaped = str.replace(new RegExp(escapeRegex(quote), \"g\"), escape + quote);\n return quote + escaped + quote;\n }\n\n return str;\n };\n\n const formatRow = (row: any[], rowHeaders?: string[], isHeader: boolean = false): string => {\n return row\n .map((value, index) => formatField(value, index, rowHeaders?.[index], isHeader))\n .join(delimiter);\n };\n\n // Determine headers\n let keys: string[] | null = null;\n\n // Helper to apply transform if provided (sync only)\n const applyTransform = (row: any): any | null => {\n if (transform) {\n // Check if it's a sync transform (1 argument)\n if (transform.length === 1) {\n return (transform as (row: any) => any)(row);\n }\n // For async transform in sync context, just return the row unchanged\n // Async transforms should use streaming API\n return row;\n }\n return row;\n };\n\n // Handle array of objects\n if (data.length > 0 && !Array.isArray(data[0])) {\n const objects = data as Record<string, any>[];\n keys = headers === true ? Object.keys(objects[0]) : Array.isArray(headers) ? headers : null;\n\n if (keys && shouldWriteHeaders) {\n // Add header row\n lines.push(formatRow(keys, keys, true));\n }\n\n // Add data rows\n for (const obj of objects) {\n const transformedObj = applyTransform(obj);\n if (transformedObj === null || transformedObj === undefined) {\n continue; // Skip row if transform returns null\n }\n const row = keys ? keys.map(key => transformedObj[key]) : Object.values(transformedObj);\n lines.push(formatRow(row, keys ?? undefined));\n }\n } else if (data.length > 0) {\n // Handle 2D array with data\n const arrays = data as any[][];\n\n // Add custom headers if provided\n if (Array.isArray(headers)) {\n keys = headers;\n if (shouldWriteHeaders) {\n lines.push(formatRow(headers, headers, true));\n }\n }\n\n for (const row of arrays) {\n const transformedRow = applyTransform(row);\n if (transformedRow === null || transformedRow === undefined) {\n continue; // Skip row if transform returns null\n }\n lines.push(formatRow(transformedRow, keys ?? undefined));\n }\n } else if (alwaysWriteHeaders && Array.isArray(headers) && shouldWriteHeaders) {\n // Handle empty data with alwaysWriteHeaders\n lines.push(formatRow(headers, headers, true));\n }\n\n let result = lines.join(rowDelimiter);\n\n // Add trailing row delimiter\n if (result.length > 0 && includeEndRowDelimiter) {\n result += rowDelimiter;\n }\n\n // Add BOM for UTF-8\n if (writeBOM) {\n result = \"\\uFEFF\" + result;\n }\n\n return result;\n}\n\n// =============================================================================\n// Streaming Parser\n// =============================================================================\n\n/**\n * Async CSV parser that yields rows one at a time\n */\nexport async function* parseCsvStream(\n input: string | AsyncIterable<string>,\n options: CsvParseOptions = {}\n): AsyncGenerator<string[] | Record<string, string>, void, unknown> {\n const {\n delimiter = \",\",\n quote: quoteOption = '\"',\n escape: escapeOption = '\"',\n skipEmptyLines = false,\n ignoreEmpty = false,\n trim = false,\n ltrim = false,\n rtrim = false,\n headers = false,\n renameHeaders = false,\n comment,\n maxRows,\n skipLines = 0,\n skipRows = 0,\n strictColumnHandling = false,\n discardUnmappedColumns = false\n } = options;\n\n const shouldSkipEmpty = skipEmptyLines || ignoreEmpty;\n\n // Handle quote: null/false to disable quoting\n const quoteEnabled = quoteOption !== null && quoteOption !== false;\n const quote = quoteEnabled ? String(quoteOption) : \"\";\n const escape = escapeOption !== null && escapeOption !== false ? String(escapeOption) : \"\";\n\n let headerRow: HeaderArray | null = null;\n let headersLength = 0;\n let useHeaders = false;\n let headerRowProcessed = false;\n let buffer = \"\";\n let currentRow: string[] = [];\n let currentField = \"\";\n let inQuotes = false;\n let lineNumber = 0;\n let dataRowCount = 0;\n let skippedDataRows = 0;\n\n // Determine header mode\n if (headers === true) {\n useHeaders = true;\n } else if (Array.isArray(headers)) {\n headerRow = headers;\n headersLength = headers.filter(h => h !== null && h !== undefined).length;\n validateUniqueHeaders(headers);\n useHeaders = true;\n if (!renameHeaders) {\n headerRowProcessed = true;\n }\n } else if (typeof headers === \"function\") {\n useHeaders = true;\n }\n\n const processRow = (\n row: string[]\n ): { valid: boolean; row: string[] | Record<string, string> | null } => {\n // Header handling\n if (useHeaders && !headerRowProcessed) {\n if (typeof headers === \"function\") {\n const transformed = headers(row);\n validateUniqueHeaders(transformed);\n headerRow = transformed;\n } else if (!Array.isArray(headers)) {\n validateUniqueHeaders(row);\n headerRow = row;\n }\n headersLength = headerRow!.filter(h => h !== null && h !== undefined).length;\n headerRowProcessed = true;\n\n if (renameHeaders) {\n return { valid: false, row: null };\n }\n if (headers === true || typeof headers === \"function\") {\n return { valid: false, row: null };\n }\n return { valid: false, row: null };\n }\n\n // Skip data rows\n if (skippedDataRows < skipRows) {\n skippedDataRows++;\n return { valid: false, row: null };\n }\n\n // Column validation\n if (headerRow && headerRow.length > 0) {\n const expectedCols = headersLength;\n const actualCols = row.length;\n\n if (actualCols > expectedCols) {\n if (strictColumnHandling && !discardUnmappedColumns) {\n return { valid: false, row: null };\n } else {\n // Default: trim extra columns\n row.length = headerRow.length;\n }\n } else if (actualCols < expectedCols) {\n if (strictColumnHandling) {\n return { valid: false, row: null };\n }\n while (row.length < headerRow.length) {\n row.push(\"\");\n }\n }\n }\n\n // Convert to object if using headers\n if (useHeaders && headerRow) {\n const obj: Record<string, string> = {};\n headerRow.forEach((header, index) => {\n if (header !== null && header !== undefined) {\n obj[header] = row[index] ?? \"\";\n }\n });\n return { valid: true, row: obj };\n }\n\n return { valid: true, row };\n };\n\n const processBuffer = function* (): Generator<string[] | Record<string, string>> {\n let i = 0;\n\n while (i < buffer.length) {\n const char = buffer[i];\n const nextChar = buffer[i + 1];\n\n if (inQuotes && quoteEnabled) {\n if (escape && char === escape && nextChar === quote) {\n currentField += quote;\n i += 2;\n } else if (char === quote) {\n inQuotes = false;\n i++;\n } else if (i === buffer.length - 1) {\n buffer = buffer.slice(i);\n return;\n } else {\n currentField += char;\n i++;\n }\n } else {\n if (quoteEnabled && char === quote && currentField === \"\") {\n inQuotes = true;\n i++;\n } else if (char === delimiter) {\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n currentField = \"\";\n i++;\n } else if (char === \"\\n\" || char === \"\\r\") {\n if (char === \"\\r\" && nextChar === \"\\n\") {\n i++;\n }\n\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n currentField = \"\";\n lineNumber++;\n\n if (lineNumber <= skipLines) {\n currentRow = [];\n i++;\n continue;\n }\n\n if (comment && currentRow[0]?.startsWith(comment)) {\n currentRow = [];\n i++;\n continue;\n }\n\n const isEmpty = currentRow.length === 1 && currentRow[0] === \"\";\n if (shouldSkipEmpty && isEmpty) {\n currentRow = [];\n i++;\n continue;\n }\n\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n dataRowCount++;\n\n if (maxRows !== undefined && dataRowCount > maxRows) {\n return;\n }\n\n yield result.row;\n }\n\n currentRow = [];\n i++;\n } else {\n currentField += char;\n i++;\n }\n }\n }\n\n buffer = \"\";\n };\n\n // Handle string input\n if (typeof input === \"string\") {\n buffer = input;\n yield* processBuffer();\n\n // Handle last row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n yield result.row;\n }\n }\n }\n return;\n }\n\n // Handle async iterable\n for await (const chunk of input) {\n buffer += chunk;\n yield* processBuffer();\n }\n\n // Handle last row\n if (currentField !== \"\" || currentRow.length > 0) {\n currentRow.push(applyTrim(currentField, trim, ltrim, rtrim));\n\n if (!(maxRows !== undefined && dataRowCount >= maxRows)) {\n const result = processRow(currentRow);\n if (result.valid && result.row) {\n yield result.row;\n }\n }\n }\n}\n","/**\n * CSV Base class - Shared functionality for Node.js and Browser\n *\n * Uses native CSV parser (RFC 4180 compliant) with zero external dependencies.\n * Date parsing uses native high-performance datetime utilities.\n */\n\nimport { DateParser, DateFormatter, type DateFormat } from \"../utils/datetime\";\nimport { parseCsv, formatCsv, type CsvParseOptions, type CsvFormatOptions } from \"./csv-core\";\nimport type { Workbook } from \"../doc/workbook\";\nimport type { Worksheet } from \"../doc/worksheet\";\nimport type { CellErrorValue } from \"../types\";\n\n/**\n * CSV read options\n */\nexport interface CsvReadOptions {\n /** Date format strings to try when parsing (default: ISO formats) */\n dateFormats?: readonly DateFormat[];\n /** Custom value mapper function */\n map?(value: any, index: number): any;\n /** Worksheet name to create (default: \"Sheet1\") */\n sheetName?: string;\n /** CSV parsing options */\n parserOptions?: Partial<CsvParseOptions>;\n}\n\n/**\n * CSV write options\n */\nexport interface CsvWriteOptions {\n /** Date format for output (default: ISO format) */\n dateFormat?: string;\n /** Use UTC for dates (default: false) */\n dateUTC?: boolean;\n /** Worksheet name or ID to export */\n sheetName?: string;\n /** Worksheet ID to export */\n sheetId?: number;\n /** Output encoding (default: \"utf8\") */\n encoding?: string;\n /** Custom value mapper function */\n map?(value: any, index: number): any;\n /** Include empty rows (default: true) */\n includeEmptyRows?: boolean;\n /** CSV formatting options */\n formatterOptions?: Partial<CsvFormatOptions>;\n}\n\n// Special Excel values mapping\nconst SpecialValues: Record<string, boolean | CellErrorValue> = {\n true: true,\n false: false,\n \"#N/A\": { error: \"#N/A\" },\n \"#REF!\": { error: \"#REF!\" },\n \"#NAME?\": { error: \"#NAME?\" },\n \"#DIV/0!\": { error: \"#DIV/0!\" },\n \"#NULL!\": { error: \"#NULL!\" },\n \"#VALUE!\": { error: \"#VALUE!\" },\n \"#NUM!\": { error: \"#NUM!\" }\n};\n\n/**\n * Create the default value mapper for CSV parsing\n */\nexport function createDefaultValueMapper(dateFormats: readonly DateFormat[]) {\n const dateParser = DateParser.create(dateFormats);\n\n return function mapValue(datum: any): any {\n if (datum === \"\") {\n return null;\n }\n\n // Try to parse as number\n const datumNumber = Number(datum);\n if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {\n return datumNumber;\n }\n\n // Try to parse as date\n const date = dateParser.parse(datum);\n if (date) {\n return date;\n }\n\n // Check for special values\n const special = SpecialValues[datum];\n if (special !== undefined) {\n return special;\n }\n\n return datum;\n };\n}\n\n/**\n * Create the default value mapper for CSV writing\n */\nexport function createDefaultWriteMapper(dateFormat?: string, dateUTC?: boolean) {\n const formatter = dateFormat\n ? DateFormatter.create(dateFormat, { utc: dateUTC })\n : DateFormatter.iso(dateUTC);\n\n return function mapValue(value: any): any {\n if (value) {\n // Handle hyperlinks\n if (value.text || value.hyperlink) {\n return value.hyperlink || value.text || \"\";\n }\n\n // Handle formulas\n if (value.formula || value.result) {\n return value.result || \"\";\n }\n\n // Handle dates\n if (value instanceof Date) {\n return formatter.format(value);\n }\n\n // Handle errors\n if (value.error) {\n return value.error;\n }\n\n // Handle other objects\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n }\n return value;\n };\n}\n\n/**\n * Parse CSV content into a worksheet\n */\nexport function parseCsvToWorksheet(\n content: string,\n workbook: Workbook,\n options: CsvReadOptions = {}\n): Worksheet {\n const worksheet = workbook.addWorksheet(options.sheetName);\n\n const dateFormats: readonly DateFormat[] = options.dateFormats || [\n \"YYYY-MM-DD[T]HH:mm:ssZ\",\n \"YYYY-MM-DD[T]HH:mm:ss\",\n \"YYYY-MM-DD\"\n ];\n\n const map = options.map || createDefaultValueMapper(dateFormats);\n\n // Parse CSV\n const rows = parseCsv(content, options.parserOptions) as string[][];\n\n // Add rows to worksheet\n for (const row of rows) {\n worksheet.addRow(row.map(map));\n }\n\n return worksheet;\n}\n\n/**\n * Format worksheet as CSV string\n */\nexport function formatWorksheetToCsv(\n worksheet: Worksheet | undefined,\n options: CsvWriteOptions = {}\n): string {\n if (!worksheet) {\n return \"\";\n }\n\n const { dateFormat, dateUTC } = options;\n const map = options.map || createDefaultWriteMapper(dateFormat, dateUTC);\n const includeEmptyRows = options.includeEmptyRows !== false;\n\n const rows: any[][] = [];\n let lastRow = 1;\n\n worksheet.eachRow((row: any, rowNumber: number) => {\n // Add empty rows if needed\n if (includeEmptyRows) {\n while (lastRow++ < rowNumber - 1) {\n rows.push([]);\n }\n }\n\n const { values } = row;\n values.shift(); // Remove first empty element (1-indexed)\n rows.push(values.map(map));\n lastRow = rowNumber;\n });\n\n return formatCsv(rows, options.formatterOptions);\n}\n\n// Re-export core types\nexport { parseCsv, formatCsv, parseCsvStream } from \"./csv-core\";\nexport type { CsvParseOptions, CsvFormatOptions, CsvParseResult } from \"./csv-core\";\n","/**\n * CSV class for Browser - No file system dependencies\n *\n * Provides:\n * - load: Load from string or ArrayBuffer\n * - writeString: Write to string\n * - writeBuffer: Write to Uint8Array\n */\n\nimport {\n parseCsvToWorksheet,\n formatWorksheetToCsv,\n type CsvReadOptions,\n type CsvWriteOptions\n} from \"./csv.base\";\nimport type { Workbook } from \"../doc/workbook.browser\";\nimport type { Worksheet } from \"../doc/worksheet\";\n\nclass CSV {\n public workbook: Workbook;\n\n constructor(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n /**\n * Load CSV from string or ArrayBuffer\n */\n load(data: string | ArrayBuffer | Uint8Array, options?: CsvReadOptions): Worksheet {\n let content: string;\n\n if (typeof data === \"string\") {\n content = data;\n } else if (data instanceof ArrayBuffer) {\n content = new TextDecoder(\"utf-8\").decode(data);\n } else if (data instanceof Uint8Array) {\n content = new TextDecoder(\"utf-8\").decode(data);\n } else {\n throw new Error(\"Invalid data type. Expected string, ArrayBuffer, or Uint8Array.\");\n }\n\n return parseCsvToWorksheet(content, this.workbook as any, options);\n }\n\n /**\n * Write CSV to string\n */\n writeString(options?: CsvWriteOptions): string {\n const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);\n return formatWorksheetToCsv(worksheet, options);\n }\n\n /**\n * Write CSV to Uint8Array buffer\n */\n writeBuffer(options?: CsvWriteOptions): Uint8Array {\n const content = this.writeString(options);\n return new TextEncoder().encode(content);\n }\n\n // Stubs for unsupported methods - throw helpful errors\n async readFile(_filename: string, _options?: CsvReadOptions): Promise<never> {\n throw new Error(\n \"CSV.readFile() is not available in browser. \" +\n \"Use CSV.load() with string or ArrayBuffer instead.\"\n );\n }\n\n async read(_stream: any, _options?: CsvReadOptions): Promise<never> {\n throw new Error(\n \"CSV.read() stream is not available in browser. \" +\n \"Use CSV.load() with string or ArrayBuffer instead.\"\n );\n }\n\n async writeFile(_filename: string, _options?: CsvWriteOptions): Promise<never> {\n throw new Error(\n \"CSV.writeFile() is not available in browser. \" +\n \"Use CSV.writeString() or CSV.writeBuffer() and handle download manually.\"\n );\n }\n\n write(_stream: any, _options?: CsvWriteOptions): Promise<never> {\n throw new Error(\n \"CSV.write() stream is not available in browser. \" +\n \"Use CSV.writeString() or CSV.writeBuffer() instead.\"\n );\n }\n}\n\nexport { CSV };\nexport type { CsvReadOptions, CsvWriteOptions } from \"./csv.base\";\n","/**\n * Workbook Browser version - No Node.js dependencies\n *\n * Extends WorkbookBase with:\n * - xlsx: Buffer-based operations (load, writeBuffer)\n * - csv: Buffer-based operations (load, writeString, writeBuffer)\n * - streaming: NOT supported (throws error)\n */\n\nimport { WorkbookBase } from \"./workbook.base\";\nimport { XLSX } from \"../xlsx/xlsx.browser\";\nimport { CSV } from \"../csv/csv.browser\";\n\nclass Workbook extends WorkbookBase {\n private _xlsx?: XLSX;\n private _csv?: CSV;\n\n /**\n * xlsx file format operations\n * Supports: load (buffer), writeBuffer\n * NOT supported: readFile, writeFile, read (stream), write (stream)\n */\n get xlsx(): XLSX {\n if (!this._xlsx) {\n this._xlsx = new XLSX(this);\n }\n return this._xlsx;\n }\n\n /**\n * CSV file format operations\n * Supports: load (string/buffer), writeString, writeBuffer\n * NOT supported: readFile, writeFile, read (stream), write (stream)\n */\n get csv(): CSV {\n if (!this._csv) {\n this._csv = new CSV(this as any);\n }\n return this._csv;\n }\n\n // ===========================================================================\n // Static Factory Methods - NOT available in browser\n // TypeScript users: These methods don't exist on this type\n // JavaScript users: These methods throw helpful errors\n // ===========================================================================\n\n /**\n * @deprecated Streaming is not available in browser\n * @throws Error with helpful message\n */\n static createStreamWriter(_options?: unknown): never {\n throw new Error(\n \"Streaming workbook writer is not available in browser. \" +\n \"Use `new Workbook()` with `xlsx.writeBuffer()` instead, \" +\n \"or import from 'excelts' (Node.js) for streaming support.\"\n );\n }\n\n /**\n * @deprecated Streaming is not available in browser\n * @throws Error with helpful message\n */\n static createStreamReader(_input?: unknown, _options?: unknown): never {\n throw new Error(\n \"Streaming workbook reader is not available in browser. \" +\n \"Use `new Workbook()` with `xlsx.load()` instead, \" +\n \"or import from 'excelts' (Node.js) for streaming support.\"\n );\n }\n}\n\nexport { Workbook };\n","/**\n * Type definitions for ExcelTS\n * This file exports all public types used by the library\n */\n\n// ============================================================================\n// Buffer type for cross-platform compatibility\n// Node.js Buffer extends Uint8Array, so Uint8Array is the common interface\n// ============================================================================\nexport type Buffer = Uint8Array;\n\n// ============================================================================\n// Paper Size Enum\n// ============================================================================\nexport enum PaperSize {\n Legal = 5,\n Executive = 7,\n A4 = 9,\n A5 = 11,\n B5 = 13,\n Envelope_10 = 20,\n Envelope_DL = 27,\n Envelope_C5 = 28,\n Envelope_B5 = 34,\n Envelope_Monarch = 37,\n Double_Japan_Postcard_Rotated = 82,\n K16_197x273_mm = 119\n}\n\n// ============================================================================\n// Color Types\n// ============================================================================\nexport interface Color {\n argb: string;\n theme: number;\n}\n\n// ============================================================================\n// Font Types\n// ============================================================================\nexport interface Font {\n name: string;\n size: number;\n family: number;\n scheme: \"minor\" | \"major\" | \"none\";\n charset: number;\n color: Partial<Color>;\n bold: boolean;\n italic: boolean;\n underline: boolean | \"none\" | \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\";\n vertAlign: \"superscript\" | \"subscript\";\n strike: boolean;\n outline: boolean;\n}\n\n// ============================================================================\n// Alignment Types\n// ============================================================================\nexport interface Alignment {\n horizontal: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\" | \"centerContinuous\" | \"distributed\";\n vertical: \"top\" | \"middle\" | \"bottom\" | \"distributed\" | \"justify\";\n wrapText: boolean;\n shrinkToFit: boolean;\n indent: number;\n readingOrder: \"rtl\" | \"ltr\";\n textRotation: number | \"vertical\";\n}\n\n// ============================================================================\n// Protection Types\n// ============================================================================\nexport interface Protection {\n locked: boolean;\n hidden: boolean;\n}\n\n// ============================================================================\n// Border Types\n// ============================================================================\nexport type BorderStyle =\n | \"thin\"\n | \"dotted\"\n | \"hair\"\n | \"medium\"\n | \"double\"\n | \"thick\"\n | \"dashed\"\n | \"dashDot\"\n | \"dashDotDot\"\n | \"slantDashDot\"\n | \"mediumDashed\"\n | \"mediumDashDotDot\"\n | \"mediumDashDot\";\n\nexport interface Border {\n style: BorderStyle;\n color: Partial<Color>;\n}\n\nexport interface BorderDiagonal extends Border {\n up: boolean;\n down: boolean;\n}\n\nexport interface Borders {\n top: Partial<Border>;\n left: Partial<Border>;\n bottom: Partial<Border>;\n right: Partial<Border>;\n diagonal: Partial<BorderDiagonal>;\n}\n\n// ============================================================================\n// Fill Types\n// ============================================================================\nexport type FillPatterns =\n | \"none\"\n | \"solid\"\n | \"darkVertical\"\n | \"darkHorizontal\"\n | \"darkGrid\"\n | \"darkTrellis\"\n | \"darkDown\"\n | \"darkUp\"\n | \"lightVertical\"\n | \"lightHorizontal\"\n | \"lightGrid\"\n | \"lightTrellis\"\n | \"lightDown\"\n | \"lightUp\"\n | \"darkGray\"\n | \"mediumGray\"\n | \"lightGray\"\n | \"gray125\"\n | \"gray0625\";\n\nexport interface FillPattern {\n type: \"pattern\";\n pattern: FillPatterns;\n fgColor?: Partial<Color>;\n bgColor?: Partial<Color>;\n}\n\nexport interface GradientStop {\n position: number;\n color: Partial<Color>;\n}\n\nexport interface FillGradientAngle {\n type: \"gradient\";\n gradient: \"angle\";\n degree: number;\n stops: GradientStop[];\n}\n\nexport interface FillGradientPath {\n type: \"gradient\";\n gradient: \"path\";\n center: { left: number; top: number };\n stops: GradientStop[];\n}\n\nexport type Fill = FillPattern | FillGradientAngle | FillGradientPath;\n\n// ============================================================================\n// Style Type\n// ============================================================================\nexport interface NumFmt {\n id: number;\n formatCode: string;\n}\n\n// Base style properties shared between input and output\ninterface StyleBase {\n font: Partial<Font>;\n alignment: Partial<Alignment>;\n protection: Partial<Protection>;\n border: Partial<Borders>;\n fill: Fill;\n}\n\n// Input style - used when setting styles (accepts string for numFmt)\nexport interface StyleInput extends StyleBase {\n numFmt: string;\n}\n\n// Output style - returned when reading styles (numFmt is an object with id)\nexport interface StyleOutput extends StyleBase {\n numFmt: NumFmt;\n}\n\n// Combined style type for backwards compatibility\nexport interface Style extends StyleBase {\n numFmt: string | NumFmt;\n}\n\n// ============================================================================\n// Margins Types\n// ============================================================================\nexport interface Margins {\n top: number;\n left: number;\n bottom: number;\n right: number;\n header: number;\n footer: number;\n}\n\n// ============================================================================\n// Page Setup Types\n// ============================================================================\nexport interface PageSetup {\n margins: Margins;\n orientation: \"portrait\" | \"landscape\";\n horizontalDpi: number;\n verticalDpi: number;\n fitToPage: boolean;\n fitToWidth: number;\n fitToHeight: number;\n scale: number;\n pageOrder: \"downThenOver\" | \"overThenDown\";\n blackAndWhite: boolean;\n draft: boolean;\n cellComments: \"atEnd\" | \"asDisplayed\" | \"None\";\n errors: \"dash\" | \"blank\" | \"NA\" | \"displayed\";\n paperSize: PaperSize;\n showRowColHeaders: boolean;\n showGridLines: boolean;\n firstPageNumber: number;\n horizontalCentered: boolean;\n verticalCentered: boolean;\n printArea: string;\n printTitlesRow: string;\n printTitlesColumn: string;\n}\n\n// ============================================================================\n// Header Footer Types\n// ============================================================================\nexport interface HeaderFooter {\n differentFirst: boolean;\n differentOddEven: boolean;\n oddHeader: string;\n oddFooter: string;\n evenHeader: string;\n evenFooter: string;\n firstHeader: string;\n firstFooter: string;\n}\n\n// ============================================================================\n// Worksheet View Types\n// ============================================================================\nexport interface WorksheetViewCommon {\n rightToLeft?: boolean;\n activeCell?: string;\n showRuler?: boolean;\n showRowColHeaders?: boolean;\n showGridLines?: boolean;\n zoomScale?: number;\n zoomScaleNormal?: number;\n}\n\nexport interface WorksheetViewNormal {\n state: \"normal\";\n style: \"pageBreakPreview\" | \"pageLayout\";\n}\n\nexport interface WorksheetViewFrozen {\n state: \"frozen\";\n style?: \"pageBreakPreview\";\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n}\n\nexport interface WorksheetViewSplit {\n state: \"split\";\n style?: \"pageBreakPreview\" | \"pageLayout\";\n xSplit?: number;\n ySplit?: number;\n topLeftCell?: string;\n activePane?: \"topLeft\" | \"topRight\" | \"bottomLeft\" | \"bottomRight\";\n}\n\nexport type WorksheetView = WorksheetViewCommon &\n (WorksheetViewNormal | WorksheetViewFrozen | WorksheetViewSplit);\n\n// ============================================================================\n// Worksheet Properties Types\n// ============================================================================\nexport interface WorksheetProperties {\n tabColor: Partial<Color>;\n outlineLevelCol: number;\n outlineLevelRow: number;\n outlineProperties: {\n summaryBelow: boolean;\n summaryRight: boolean;\n };\n defaultRowHeight: number;\n defaultColWidth?: number;\n dyDescent: number;\n showGridLines: boolean;\n}\n\nexport type WorksheetState = \"visible\" | \"hidden\" | \"veryHidden\";\n\nexport type AutoFilter =\n | string\n | {\n from: string | { row: number; column: number };\n to: string | { row: number; column: number };\n };\n\nexport interface WorksheetProtection {\n objects: boolean;\n scenarios: boolean;\n selectLockedCells: boolean;\n selectUnlockedCells: boolean;\n formatCells: boolean;\n formatColumns: boolean;\n formatRows: boolean;\n insertColumns: boolean;\n insertRows: boolean;\n insertHyperlinks: boolean;\n deleteColumns: boolean;\n deleteRows: boolean;\n sort: boolean;\n autoFilter: boolean;\n pivotTables: boolean;\n spinCount: number;\n}\n\n// ============================================================================\n// Workbook View Types\n// ============================================================================\nexport interface WorkbookView {\n x: number;\n y: number;\n width: number;\n height: number;\n firstSheet: number;\n activeTab: number;\n visibility: string;\n}\n\n// ============================================================================\n// Workbook Properties Types\n// ============================================================================\nexport interface WorkbookProperties {\n date1904: boolean;\n}\n\nexport interface CalculationProperties {\n fullCalcOnLoad: boolean;\n}\n\n// ============================================================================\n// Cell Value Types\n// ============================================================================\nexport interface CellErrorValue {\n error: \"#N/A\" | \"#REF!\" | \"#NAME?\" | \"#DIV/0!\" | \"#NULL!\" | \"#VALUE!\" | \"#NUM!\";\n}\n\nexport interface RichText {\n text: string;\n font?: Partial<Font>;\n}\n\nexport interface CellRichTextValue {\n richText: RichText[];\n}\n\nexport interface CellHyperlinkValue {\n text: string;\n hyperlink: string;\n tooltip?: string;\n}\n\nexport interface CellFormulaValue {\n formula: string;\n result?: number | string | boolean | Date | CellErrorValue;\n date1904?: boolean;\n}\n\n/** Array formula that spans multiple cells */\nexport interface CellArrayFormulaValue {\n formula: string;\n result?: number | string | boolean | Date | CellErrorValue;\n /** Must be \"array\" for array formulas */\n shareType: \"array\";\n /** The range this array formula applies to, e.g. \"A1:B2\" */\n ref: string;\n}\n\nexport interface CellSharedFormulaValue {\n sharedFormula: string;\n readonly formula?: string;\n result?: number | string | boolean | Date | CellErrorValue;\n date1904?: boolean;\n}\n\nexport type CellValue =\n | null\n | number\n | string\n | boolean\n | Date\n | undefined\n | CellErrorValue\n | CellRichTextValue\n | CellHyperlinkValue\n | CellFormulaValue\n | CellArrayFormulaValue\n | CellSharedFormulaValue;\n\n// ============================================================================\n// Comment Types\n// ============================================================================\nexport interface CommentMargins {\n insetmode: \"auto\" | \"custom\";\n inset: number[];\n}\n\nexport interface CommentProtection {\n locked: \"True\" | \"False\";\n lockText: \"True\" | \"False\";\n}\n\nexport type CommentEditAs = \"twoCells\" | \"oneCells\" | \"absolute\";\n\nexport interface Comment {\n texts?: RichText[];\n margins?: Partial<CommentMargins>;\n protection?: Partial<CommentProtection>;\n editAs?: CommentEditAs;\n}\n\n// ============================================================================\n// Data Validation Types\n// ============================================================================\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\n/** Base properties shared by all data validation types */\ninterface DataValidationBase {\n allowBlank?: boolean;\n error?: string;\n errorTitle?: string;\n errorStyle?: string;\n prompt?: string;\n promptTitle?: string;\n showErrorMessage?: boolean;\n showInputMessage?: boolean;\n}\n\n/** Data validation that requires formulae and operator */\nexport interface DataValidationWithFormulae extends DataValidationBase {\n type: \"list\" | \"whole\" | \"decimal\" | \"date\" | \"textLength\" | \"custom\";\n formulae: any[];\n operator?: DataValidationOperator;\n}\n\n/** Data validation type 'any' - no formulae needed */\nexport interface DataValidationAny extends DataValidationBase {\n type: \"any\";\n}\n\nexport type DataValidation = DataValidationWithFormulae | DataValidationAny;\n\n// ============================================================================\n// Image Types\n// ============================================================================\nexport interface Image {\n extension: \"jpeg\" | \"png\" | \"gif\";\n base64?: string;\n filename?: string;\n buffer?: Buffer;\n}\n\nexport interface ImagePosition {\n tl: { col: number; row: number };\n ext: { width: number; height: number };\n}\n\n/** Anchor position for image placement */\nexport interface ImageAnchor {\n col: number;\n row: number;\n nativeCol?: number;\n nativeRow?: number;\n nativeColOff?: number;\n nativeRowOff?: number;\n}\n\n/** Range input for addImage - can be a string like \"A1:B2\" or an object */\nexport type AddImageRange =\n | string\n | {\n /** Top-left anchor position */\n tl: ImageAnchor | string;\n /** Bottom-right anchor position (optional if ext is provided) */\n br?: ImageAnchor | string;\n /** Image dimensions (alternative to br) */\n ext?: { width: number; height: number };\n /** How the image behaves when cells are resized */\n editAs?: \"oneCell\" | \"twoCell\" | \"absolute\";\n /** Hyperlink for the image */\n hyperlinks?: { hyperlink?: string; tooltip?: string };\n };\n\nexport interface ImageHyperlinkValue {\n hyperlink: string;\n tooltip?: string;\n}\n\n// ============================================================================\n// Location and Address Types\n// ============================================================================\nexport type Location = {\n top: number;\n left: number;\n bottom: number;\n right: number;\n};\n\nexport type Address = {\n sheetName?: string;\n address: string;\n col: number;\n row: number;\n $col$row?: string;\n};\n\n// ============================================================================\n// Row and Column Types\n// ============================================================================\nexport type RowValues = CellValue[] | { [key: string]: CellValue } | undefined | null;\n\n// ============================================================================\n// Conditional Formatting Types\n// ============================================================================\nexport type CellIsOperators = \"equal\" | \"greaterThan\" | \"lessThan\" | \"between\";\n\nexport type ContainsTextOperators =\n | \"containsText\"\n | \"containsBlanks\"\n | \"notContainsBlanks\"\n | \"containsErrors\"\n | \"notContainsErrors\";\n\nexport type TimePeriodTypes =\n | \"lastWeek\"\n | \"thisWeek\"\n | \"nextWeek\"\n | \"yesterday\"\n | \"today\"\n | \"tomorrow\"\n | \"last7Days\"\n | \"lastMonth\"\n | \"thisMonth\"\n | \"nextMonth\";\n\nexport type IconSetTypes =\n | \"5Arrows\"\n | \"5ArrowsGray\"\n | \"5Boxes\"\n | \"5Quarters\"\n | \"5Rating\"\n | \"4Arrows\"\n | \"4ArrowsGray\"\n | \"4Rating\"\n | \"4RedToBlack\"\n | \"4TrafficLights\"\n | \"NoIcons\"\n | \"3Arrows\"\n | \"3ArrowsGray\"\n | \"3Flags\"\n | \"3Signs\"\n | \"3Stars\"\n | \"3Symbols\"\n | \"3Symbols2\"\n | \"3TrafficLights1\"\n | \"3TrafficLights2\"\n | \"3Triangles\";\n\nexport type CfvoTypes =\n | \"percentile\"\n | \"percent\"\n | \"num\"\n | \"min\"\n | \"max\"\n | \"formula\"\n | \"autoMin\"\n | \"autoMax\";\n\nexport interface Cvfo {\n type: CfvoTypes;\n value?: number | string;\n}\n\nexport interface ConditionalFormattingBaseRule {\n priority?: number;\n style?: Partial<Style>;\n}\n\nexport interface ExpressionRuleType extends ConditionalFormattingBaseRule {\n type: \"expression\";\n formulae?: any[];\n}\n\nexport interface CellIsRuleType extends ConditionalFormattingBaseRule {\n type: \"cellIs\";\n formulae?: any[];\n operator?: CellIsOperators;\n}\n\nexport interface Top10RuleType extends ConditionalFormattingBaseRule {\n type: \"top10\";\n rank: number;\n percent: boolean;\n bottom?: boolean;\n}\n\nexport interface AboveAverageRuleType extends ConditionalFormattingBaseRule {\n type: \"aboveAverage\";\n aboveAverage?: boolean;\n}\n\nexport interface ColorScaleRuleType extends ConditionalFormattingBaseRule {\n type: \"colorScale\";\n cfvo?: Cvfo[];\n color?: Partial<Color>[];\n}\n\nexport interface IconSetRuleType extends ConditionalFormattingBaseRule {\n type: \"iconSet\";\n showValue?: boolean;\n reverse?: boolean;\n custom?: boolean;\n iconSet?: IconSetTypes;\n cfvo?: Cvfo[];\n}\n\nexport interface ContainsTextRuleType extends ConditionalFormattingBaseRule {\n type: \"containsText\";\n operator?: ContainsTextOperators;\n text?: string;\n}\n\nexport interface TimePeriodRuleType extends ConditionalFormattingBaseRule {\n type: \"timePeriod\";\n timePeriod?: TimePeriodTypes;\n}\n\nexport interface DataBarRuleType extends ConditionalFormattingBaseRule {\n type: \"dataBar\";\n gradient?: boolean;\n minLength?: number;\n maxLength?: number;\n showValue?: boolean;\n border?: boolean;\n negativeBarColorSameAsPositive?: boolean;\n negativeBarBorderColorSameAsPositive?: boolean;\n axisPosition?: \"auto\" | \"middle\" | \"none\";\n direction?: \"context\" | \"leftToRight\" | \"rightToLeft\";\n cfvo?: Cvfo[];\n color?: Partial<Color>;\n}\n\nexport type ConditionalFormattingRule =\n | ExpressionRuleType\n | CellIsRuleType\n | Top10RuleType\n | AboveAverageRuleType\n | ColorScaleRuleType\n | IconSetRuleType\n | ContainsTextRuleType\n | TimePeriodRuleType\n | DataBarRuleType;\n\nexport interface ConditionalFormattingOptions {\n ref: string;\n rules: ConditionalFormattingRule[];\n}\n\nexport interface ConditionalFormattingOptions {\n ref: string;\n rules: ConditionalFormattingRule[];\n}\n\n// ============================================================================\n// Table Types\n// ============================================================================\nexport interface TableStyleProperties {\n theme?: string;\n showFirstColumn?: boolean;\n showLastColumn?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n}\n\nexport interface TableColumnProperties {\n name: string;\n filterButton?: boolean;\n totalsRowLabel?: string;\n totalsRowFunction?:\n | \"none\"\n | \"average\"\n | \"countNums\"\n | \"count\"\n | \"max\"\n | \"min\"\n | \"stdDev\"\n | \"var\"\n | \"sum\"\n | \"custom\";\n totalsRowFormula?: string;\n totalsRowResult?: CellFormulaValue[\"result\"];\n style?: Partial<Style>;\n}\n\nexport interface TableProperties {\n name: string;\n displayName?: string;\n ref: string;\n headerRow?: boolean;\n totalsRow?: boolean;\n style?: TableStyleProperties;\n columns: TableColumnProperties[];\n rows: any[][];\n}\n\nexport type TableColumn = Required<TableColumnProperties>;\n\n// ============================================================================\n// Media Types\n// ============================================================================\nexport interface Media {\n type: string;\n name: string;\n extension: string;\n buffer: Buffer;\n}\n\n// ============================================================================\n// Worksheet Options\n// ============================================================================\nexport interface AddWorksheetOptions {\n properties?: Partial<WorksheetProperties>;\n pageSetup?: Partial<PageSetup>;\n headerFooter?: Partial<HeaderFooter>;\n views?: Array<Partial<WorksheetView>>;\n state?: WorksheetState;\n /** Specifies whether to use shared strings. Overrides workbook setting. */\n useSharedStrings?: boolean;\n /** Apply an auto filter to the worksheet */\n autoFilter?: AutoFilter;\n}\n\n// ============================================================================\n// Defined Names Types\n// ============================================================================\nexport interface DefinedNamesRanges {\n name: string;\n ranges: string[];\n}\n\nexport type DefinedNamesModel = DefinedNamesRanges[];\n\n// ============================================================================\n// Row Break Types\n// ============================================================================\nexport interface RowBreak {\n id: number;\n max: number;\n min?: number;\n man: number;\n}\n\n// ============================================================================\n// Column Break Types\n// ============================================================================\nexport interface ColBreak {\n id: number;\n max: number;\n min?: number;\n man: number;\n}\n","// oxlint-disable no-control-regex\n/**\n * Excel Cell Format Parser\n * A simplified implementation for formatting cell values according to Excel numFmt patterns\n * Supports: General, percentages, decimals, thousands separators, dates, currencies,\n * scientific notation, fractions, elapsed time, and more\n */\n\nimport { excelToDate } from \"./utils\";\n\n// =============================================================================\n// Built-in Format Table (Excel numFmtId to format string mapping)\n// =============================================================================\n\nconst TABLE_FMT: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"m/d/yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 41: '_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)',\n 42: '_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)',\n 43: '_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)',\n 44: '_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)',\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\"\n};\n\n/**\n * Default mapping for numFmtId that should map to other formats\n * Based on Excel's behavior for certain format IDs\n */\nconst DEFAULT_MAP: Record<number, number> = {\n // 5 -> 37 ... 8 -> 40\n 5: 37,\n 6: 38,\n 7: 39,\n 8: 40,\n // 23-26 -> 0\n 23: 0,\n 24: 0,\n 25: 0,\n 26: 0,\n // 27-31 -> 14\n 27: 14,\n 28: 14,\n 29: 14,\n 30: 14,\n 31: 14,\n // 50-58 -> 14\n 50: 14,\n 51: 14,\n 52: 14,\n 53: 14,\n 54: 14,\n 55: 14,\n 56: 14,\n 57: 14,\n 58: 14,\n // 59-62 -> 1-4\n 59: 1,\n 60: 2,\n 61: 3,\n 62: 4,\n // 67-68 -> 9-10\n 67: 9,\n 68: 10,\n // 72-75 -> 14-17\n 72: 14,\n 73: 15,\n 74: 16,\n 75: 17,\n // 76-78 -> 20-22\n 76: 20,\n 77: 21,\n 78: 22,\n // 79-81 -> 45-47\n 79: 45,\n 80: 46,\n 81: 47\n};\n\n/**\n * Get format string from numFmtId\n * Handles default mappings for certain format IDs\n */\nexport function getFormat(numFmtId: number): string {\n // Direct lookup first\n if (TABLE_FMT[numFmtId]) {\n return TABLE_FMT[numFmtId];\n }\n // Check default map\n if (DEFAULT_MAP[numFmtId] !== undefined) {\n return TABLE_FMT[DEFAULT_MAP[numFmtId]] || \"General\";\n }\n return \"General\";\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Pad number with leading zeros\n */\nfunction pad0(num: number, len: number): string {\n let s = Math.round(num).toString();\n while (s.length < len) {\n s = \"0\" + s;\n }\n return s;\n}\n\n/**\n * Add thousand separators to a number string\n */\nfunction commaify(s: string): string {\n const w = 3;\n if (s.length <= w) {\n return s;\n }\n const j = s.length % w;\n let o = s.substring(0, j);\n for (let i = j; i < s.length; i += w) {\n o += (o.length > 0 ? \",\" : \"\") + s.substring(i, i + w);\n }\n return o;\n}\n\n/**\n * Round a number to specified decimal places\n */\nfunction roundTo(val: number, decimals: number): number {\n const factor = Math.pow(10, decimals);\n return Math.round(val * factor) / factor;\n}\n\n/**\n * Process _ (underscore) placeholder - adds space with width of next character\n * Process * (asterisk) placeholder - repeats next character to fill width (simplified to single char)\n */\nfunction processPlaceholders(fmt: string): string {\n // Replace _X with a space (skip next character, add space)\n let result = fmt.replace(/_./g, \" \");\n // Replace *X with empty string (fill character, simplified)\n result = result.replace(/\\*./g, \"\");\n return result;\n}\n\n// =============================================================================\n// Format Detection\n// =============================================================================\n\n/**\n * Check if format is \"General\"\n */\nfunction isGeneral(fmt: string): boolean {\n return /^General$/i.test(fmt.trim());\n}\n\n/**\n * Check if format is a date format\n */\nfunction isDateFormat(fmt: string): boolean {\n // Remove color codes and conditions\n const cleaned = fmt.replace(/\\[[^\\]]*\\]/g, \"\");\n // Check for date/time tokens (but not if it's just a number format with brackets)\n return /[ymdhs]/i.test(cleaned) && !/^[#0.,E%$\\s()\\-+]+$/i.test(cleaned);\n}\n\n// =============================================================================\n// Date Formatting\n// =============================================================================\n\nconst MONTHS_SHORT = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n];\nconst MONTHS_LONG = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n];\n// Single letter month abbreviation (J, F, M, A, M, J, J, A, S, O, N, D)\nconst MONTHS_LETTER = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\nconst DAYS_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst DAYS_LONG = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\n/**\n * Format a date value using Excel date format\n * @param serial Excel serial number (days since 1900-01-01)\n * @param fmt Format string\n */\nfunction formatDate(serial: number, fmt: string): string {\n // Extract time components directly from serial number (timezone-agnostic)\n const totalSeconds = Math.round(serial * 86400);\n const timeOfDay = totalSeconds % 86400;\n const hours = Math.floor(timeOfDay / 3600);\n const minutes = Math.floor((timeOfDay % 3600) / 60);\n const seconds = timeOfDay % 60;\n\n // For date components, use excelToDate but only for date parts\n const date = excelToDate(serial, false);\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth(); // 0-indexed\n const day = date.getUTCDate();\n const dayOfWeek = date.getUTCDay();\n\n // Calculate fractional seconds from serial\n const fractionalSeconds = serial * 86400 - Math.floor(serial * 86400);\n\n // Check for AM/PM\n const hasAmPm = /AM\\/PM|A\\/P/i.test(fmt);\n const isPm = hours >= 12;\n // Standard 12-hour format: 0 and 12 both display as 12\n const hours12 = hours % 12 || 12;\n\n // Remove color codes like [Red], [Green], etc. but keep elapsed time brackets\n let result = fmt.replace(/\\[(Red|Green|Blue|Yellow|Magenta|Cyan|White|Black|Color\\d+)\\]/gi, \"\");\n\n // Process _ and * placeholders\n result = processPlaceholders(result);\n\n // Handle fractional seconds (ss.0, ss.00, ss.000)\n const fracSecMatch = result.match(/ss\\.(0+)/i);\n let fracSecStr = \"\";\n if (fracSecMatch) {\n const decPlaces = fracSecMatch[1].length;\n const fracPart = Math.round(fractionalSeconds * Math.pow(10, decPlaces));\n fracSecStr = fracPart.toString().padStart(decPlaces, \"0\");\n result = result.replace(/ss\\.0+/gi, \"\\x00SF\\x00\");\n }\n\n // Process tokens - order matters! Longer patterns first.\n // Use placeholder tokens to avoid re-matching\n // Important: Use unique markers that don't contain the original pattern letters\n\n // Year\n result = result.replace(/yyyy/gi, \"\\x00Y4\\x00\");\n result = result.replace(/yy/gi, \"\\x00Y2\\x00\");\n\n // Month names (before numeric month) - order matters: longer patterns first\n result = result.replace(/mmmmm/gi, \"\\x00MN5\\x00\"); // Single letter month\n result = result.replace(/mmmm/gi, \"\\x00MN4\\x00\");\n result = result.replace(/mmm/gi, \"\\x00MN3\\x00\");\n\n // Day names (must be before dd and d)\n result = result.replace(/dddd/gi, \"\\x00DN4\\x00\");\n result = result.replace(/ddd/gi, \"\\x00DN3\\x00\");\n\n // Day numbers\n result = result.replace(/dd/gi, \"\\x00D2\\x00\");\n result = result.replace(/\\bd\\b/gi, \"\\x00D1\\x00\");\n\n // Hours\n result = result.replace(/hh/gi, \"\\x00H2\\x00\");\n result = result.replace(/\\bh\\b/gi, \"\\x00H1\\x00\");\n\n // Seconds (before mm to avoid confusion)\n result = result.replace(/ss/gi, \"\\x00S2\\x00\");\n result = result.replace(/\\bs\\b/gi, \"\\x00S1\\x00\");\n\n // Minutes/Month mm - context dependent\n // If near h or s, it's minutes; otherwise month\n // For simplicity, check if we already have hour tokens nearby\n const hasTimeContext = /\\x00H[12]\\x00.*mm|mm.*\\x00S[12]\\x00/i.test(result);\n if (hasTimeContext) {\n result = result.replace(/mm/gi, \"\\x00MI2\\x00\");\n } else {\n result = result.replace(/mm/gi, \"\\x00M2\\x00\");\n }\n result = result.replace(/\\bm\\b/gi, \"\\x00M1\\x00\");\n\n // AM/PM\n result = result.replace(/AM\\/PM/gi, \"\\x00AMPM\\x00\");\n result = result.replace(/A\\/P/gi, \"\\x00AP\\x00\");\n\n // Now replace placeholders with actual values\n const hourVal = hasAmPm ? hours12 : hours;\n\n result = result\n .replace(/\\x00Y4\\x00/g, year.toString())\n .replace(/\\x00Y2\\x00/g, (year % 100).toString().padStart(2, \"0\"))\n .replace(/\\x00MN5\\x00/g, MONTHS_LETTER[month])\n .replace(/\\x00MN4\\x00/g, MONTHS_LONG[month])\n .replace(/\\x00MN3\\x00/g, MONTHS_SHORT[month])\n .replace(/\\x00M2\\x00/g, (month + 1).toString().padStart(2, \"0\"))\n .replace(/\\x00M1\\x00/g, (month + 1).toString())\n .replace(/\\x00DN4\\x00/g, DAYS_LONG[dayOfWeek])\n .replace(/\\x00DN3\\x00/g, DAYS_SHORT[dayOfWeek])\n .replace(/\\x00D2\\x00/g, day.toString().padStart(2, \"0\"))\n .replace(/\\x00D1\\x00/g, day.toString())\n .replace(/\\x00H2\\x00/g, hourVal.toString().padStart(2, \"0\"))\n .replace(/\\x00H1\\x00/g, hourVal.toString())\n .replace(/\\x00MI2\\x00/g, minutes.toString().padStart(2, \"0\"))\n .replace(/\\x00S2\\x00/g, seconds.toString().padStart(2, \"0\"))\n .replace(/\\x00S1\\x00/g, seconds.toString())\n .replace(/\\x00SF\\x00/g, seconds.toString().padStart(2, \"0\") + \".\" + fracSecStr)\n .replace(/\\x00AMPM\\x00/g, isPm ? \"PM\" : \"AM\")\n .replace(/\\x00AP\\x00/g, isPm ? \"P\" : \"A\");\n\n // Clean up escape characters\n result = result.replace(/\\\\/g, \"\");\n\n return result;\n}\n\n// =============================================================================\n// Number Formatting\n// =============================================================================\n\n/**\n * Format a number using \"General\" format\n */\nfunction formatGeneral(val: number | string | boolean): string {\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n if (typeof val === \"string\") {\n return val;\n }\n // Number formatting - up to 11 significant digits\n if (Number.isInteger(val)) {\n return val.toString();\n }\n // For decimals, show up to 11 significant figures\n const str = val.toPrecision(11);\n // Remove trailing zeros after decimal point\n return str.replace(/\\.?0+$/, \"\").replace(/\\.?0+e/, \"e\");\n}\n\n/**\n * Format a percentage value\n * @param val The decimal value (e.g., 0.25 for 25%)\n * @param fmt The format string containing %\n */\nfunction formatPercentage(val: number, fmt: string): string {\n // Count % signs\n const percentCount = (fmt.match(/%/g) || []).length;\n // Multiply value by 100 for each %\n const scaledVal = val * Math.pow(100, percentCount);\n\n // Remove % from format to process the number part\n const numFmt = fmt.replace(/%/g, \"\");\n\n // Format the number part\n const numStr = formatNumberPattern(scaledVal, numFmt || \"0\");\n\n // Add back the % signs\n return numStr + \"%\".repeat(percentCount);\n}\n\n/**\n * Format a number in scientific notation\n * @param val The number to format\n * @param fmt The format string (e.g., \"0.00E+00\")\n */\nfunction formatScientific(val: number, fmt: string): string {\n const sign = val < 0 ? \"-\" : \"\";\n const absVal = Math.abs(val);\n\n if (absVal === 0) {\n // Handle zero\n const decMatch = fmt.match(/\\.([0#]+)E/i);\n const decPlaces = decMatch ? decMatch[1].length : 2;\n return \"0.\" + \"0\".repeat(decPlaces) + \"E+00\";\n }\n\n // Find decimal places from format\n const decMatch = fmt.match(/\\.([0#]+)E/i);\n const decPlaces = decMatch ? decMatch[1].length : 2;\n\n // Check if format has explicit +\n const hasPlus = fmt.includes(\"E+\");\n\n // Calculate exponent\n const exp = Math.floor(Math.log10(absVal));\n const mantissa = absVal / Math.pow(10, exp);\n\n // Round mantissa to specified decimal places\n const roundedMantissa = roundTo(mantissa, decPlaces);\n\n // Format mantissa\n const mantissaStr = roundedMantissa.toFixed(decPlaces);\n\n // Format exponent\n const expSign = exp >= 0 ? (hasPlus ? \"+\" : \"\") : \"-\";\n const expStr = pad0(Math.abs(exp), 2);\n\n return sign + mantissaStr + \"E\" + expSign + expStr;\n}\n\n/**\n * Convert decimal to fraction using continued fraction algorithm\n */\nfunction toFraction(val: number, maxDenom: number): [number, number, number] {\n const sign = val < 0 ? -1 : 1;\n let absVal = Math.abs(val);\n const whole = Math.floor(absVal);\n absVal -= whole;\n\n if (absVal < 1e-10) {\n return [sign * whole, 0, 1];\n }\n\n let p0 = 0,\n p1 = 1;\n let q0 = 1,\n q1 = 0;\n let a = Math.floor(absVal);\n let p = a;\n let q = 1;\n\n while (q1 < maxDenom) {\n a = Math.floor(absVal);\n p = a * p1 + p0;\n q = a * q1 + q0;\n\n if (absVal - a < 1e-10) {\n break;\n }\n absVal = 1 / (absVal - a);\n\n p0 = p1;\n p1 = p;\n q0 = q1;\n q1 = q;\n }\n\n if (q > maxDenom) {\n q = q1;\n p = p1;\n }\n\n return [sign * whole, sign * p, q];\n}\n\n/**\n * Format a number as a fraction\n * @param val The number to format\n * @param fmt The format string (e.g., \"# ?/?\", \"# ??/??\")\n */\nfunction formatFraction(val: number, fmt: string): string {\n const sign = val < 0 ? \"-\" : \"\";\n const absVal = Math.abs(val);\n\n // Check for fixed denominator (e.g., \"# ?/8\")\n const fixedDenomMatch = fmt.match(/\\?+\\s*\\/\\s*(\\d+)/);\n if (fixedDenomMatch) {\n const denom = parseInt(fixedDenomMatch[1], 10);\n const whole = Math.floor(absVal);\n const frac = absVal - whole;\n const numer = Math.round(frac * denom);\n\n if (fmt.includes(\"#\") || fmt.includes(\"0\")) {\n // Mixed fraction\n if (numer === 0) {\n return sign + whole.toString();\n }\n return sign + (whole > 0 ? whole + \" \" : \"\") + numer + \"/\" + denom;\n }\n // Simple fraction\n return sign + (whole * denom + numer) + \"/\" + denom;\n }\n\n // Variable denominator - count ? to determine max digits\n const denomMatch = fmt.match(/\\/\\s*(\\?+)/);\n const maxDigits = denomMatch ? denomMatch[1].length : 2;\n const maxDenom = Math.pow(10, maxDigits) - 1;\n\n const [whole, numer, denom] = toFraction(absVal, maxDenom);\n\n // Format based on whether we want mixed or improper fraction\n if (fmt.includes(\"#\") && whole !== 0) {\n if (numer === 0) {\n return sign + Math.abs(whole).toString();\n }\n return sign + Math.abs(whole) + \" \" + Math.abs(numer) + \"/\" + denom;\n }\n\n if (numer === 0) {\n return whole === 0 ? \"0\" : sign + Math.abs(whole).toString();\n }\n\n // Improper fraction\n const totalNumer = Math.abs(whole) * denom + Math.abs(numer);\n return sign + totalNumer + \"/\" + denom;\n}\n\n/**\n * Format elapsed time (e.g., [h]:mm:ss for durations > 24 hours)\n */\nfunction formatElapsedTime(serial: number, fmt: string): string {\n // serial is in days, convert to components\n const totalSeconds = Math.round(serial * 86400);\n const totalMinutes = Math.floor(totalSeconds / 60);\n const totalHours = Math.floor(totalMinutes / 60);\n\n const seconds = totalSeconds % 60;\n const minutes = totalMinutes % 60;\n const hours = totalHours;\n\n let result = fmt;\n\n // Replace elapsed time tokens\n if (/\\[h+\\]/i.test(result)) {\n result = result.replace(/\\[h+\\]/gi, hours.toString());\n }\n if (/\\[m+\\]/i.test(result)) {\n result = result.replace(/\\[m+\\]/gi, totalMinutes.toString());\n }\n if (/\\[s+\\]/i.test(result)) {\n result = result.replace(/\\[s+\\]/gi, totalSeconds.toString());\n }\n\n // Replace regular time tokens\n result = result.replace(/mm/gi, minutes.toString().padStart(2, \"0\"));\n result = result.replace(/ss/gi, seconds.toString().padStart(2, \"0\"));\n\n return result;\n}\n\n/**\n * Format a number with the given pattern\n * Handles patterns like \"0\", \"00\", \"#,##0\", \"0-0\", \"000-0000\" etc.\n */\nfunction formatNumberPattern(val: number, fmt: string): string {\n const absVal = Math.abs(val);\n const sign = val < 0 ? \"-\" : \"\";\n\n // Handle trailing commas (divide by 1000 for each)\n let trailingCommas = 0;\n let workFmt = fmt;\n while (workFmt.endsWith(\",\")) {\n trailingCommas++;\n workFmt = workFmt.slice(0, -1);\n }\n const scaledVal = absVal / Math.pow(1000, trailingCommas);\n\n // Check for decimal point\n const decimalIdx = workFmt.indexOf(\".\");\n let intFmt = workFmt;\n let decFmt = \"\";\n\n if (decimalIdx !== -1) {\n intFmt = workFmt.substring(0, decimalIdx);\n decFmt = workFmt.substring(decimalIdx + 1);\n }\n\n // Count decimal places needed\n const decimalPlaces = decFmt.replace(/[^0#?]/g, \"\").length;\n\n // Round the value\n const roundedVal = roundTo(scaledVal, decimalPlaces);\n\n // Split into integer and decimal parts\n const [intPart, decPart = \"\"] = roundedVal.toString().split(\".\");\n\n // Check if format has literal characters mixed with digit placeholders (like \"0-0\", \"000-0000\")\n // This is used for phone numbers, SSN, etc.\n const hasLiteralInFormat = /[0#?][^0#?,.\\s][0#?]/.test(intFmt);\n\n let formattedInt: string;\n\n if (hasLiteralInFormat) {\n // Handle pattern with literals like \"0-0\", \"000-0000\", \"00-00-00\"\n // Count total digit placeholders\n const digitPlaceholders = intFmt.replace(/[^0#?]/g, \"\").length;\n\n // Pad the number to match the digit placeholder count\n let digits = intPart;\n if (digits.length < digitPlaceholders) {\n digits = \"0\".repeat(digitPlaceholders - digits.length) + digits;\n }\n\n // Build result by replacing placeholders with digits\n formattedInt = \"\";\n let digitIndex = digits.length - digitPlaceholders; // start position in digits string\n\n for (let i = 0; i < intFmt.length; i++) {\n const char = intFmt[i];\n if (char === \"0\" || char === \"#\" || char === \"?\") {\n if (digitIndex < digits.length) {\n formattedInt += digits[digitIndex];\n digitIndex++;\n }\n } else if (char !== \",\") {\n // Literal character (like -, /, space, etc.) - but not comma (thousand separator)\n formattedInt += char;\n }\n }\n } else {\n // Standard number formatting\n formattedInt = intPart;\n\n // Add thousand separators if format has them\n if (intFmt.includes(\",\")) {\n formattedInt = commaify(intPart);\n }\n\n // Pad integer with leading zeros if needed\n const minIntDigits = (intFmt.match(/0/g) || []).length;\n if (formattedInt.length < minIntDigits) {\n formattedInt = \"0\".repeat(minIntDigits - formattedInt.length) + formattedInt;\n }\n }\n\n // Format decimal part\n let formattedDec = \"\";\n if (decimalPlaces > 0) {\n formattedDec = \".\" + (decPart + \"0\".repeat(decimalPlaces)).substring(0, decimalPlaces);\n }\n\n return sign + formattedInt + formattedDec;\n}\n\n// =============================================================================\n// Main Format Function\n// =============================================================================\n\n/**\n * Remove quoted literal text markers and return the literal characters\n * Also handles backslash escape sequences\n */\nfunction processQuotedText(fmt: string): string {\n let result = \"\";\n let i = 0;\n while (i < fmt.length) {\n if (fmt[i] === '\"') {\n // Find closing quote\n i++;\n while (i < fmt.length && fmt[i] !== '\"') {\n result += fmt[i];\n i++;\n }\n i++; // skip closing quote\n } else if (fmt[i] === \"\\\\\" && i + 1 < fmt.length) {\n // Backslash escapes the next character\n i++;\n result += fmt[i];\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n return result;\n}\n\n/**\n * Check if a condition matches (e.g., [>100], [<=50])\n */\nfunction checkCondition(val: number, condition: string): boolean {\n const match = condition.match(/\\[(=|>|<|>=|<=|<>)(-?\\d+(?:\\.\\d*)?)\\]/);\n if (!match) {\n return false;\n }\n\n const op = match[1];\n const threshold = parseFloat(match[2]);\n\n switch (op) {\n case \"=\":\n return val === threshold;\n case \">\":\n return val > threshold;\n case \"<\":\n return val < threshold;\n case \">=\":\n return val >= threshold;\n case \"<=\":\n return val <= threshold;\n case \"<>\":\n return val !== threshold;\n default:\n return false;\n }\n}\n\n/**\n * Parse format string and handle positive/negative/zero/text sections\n * Excel format: positive;negative;zero;text\n * Also handles conditional formats like [>100]\n */\nfunction chooseFormat(fmt: string, val: number | string | boolean): string {\n if (typeof val === \"string\") {\n // For text, use the 4th section if available, or just return as-is\n const sections = splitFormat(fmt);\n if (sections.length >= 4 && sections[3]) {\n // Process quoted text and replace @ with the value\n const textFmt = processQuotedText(sections[3]);\n return textFmt.replace(/@/g, val);\n }\n return val;\n }\n\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n\n const sections = splitFormat(fmt);\n\n // Check for conditional format in sections\n const condRegex = /\\[(=|>|<|>=|<=|<>)-?\\d+(?:\\.\\d*)?\\]/;\n const hasCondition =\n (sections[0] && condRegex.test(sections[0])) || (sections[1] && condRegex.test(sections[1]));\n\n if (hasCondition && sections.length >= 2) {\n // Conditional format: check each section's condition\n for (let i = 0; i < Math.min(sections.length, 2); i++) {\n const condMatch = sections[i].match(/\\[(=|>|<|>=|<=|<>)-?\\d+(?:\\.\\d*)?\\]/);\n if (condMatch && checkCondition(val as number, condMatch[0])) {\n return sections[i];\n }\n }\n // No condition matched, use last section\n return sections[sections.length > 2 ? 2 : 1];\n }\n\n if (sections.length === 1) {\n return sections[0];\n }\n\n if (sections.length === 2) {\n // positive/zero; negative\n return val >= 0 ? sections[0] : sections[1];\n }\n\n // 3+ sections: positive; negative; zero\n if (val > 0) {\n return sections[0];\n }\n if (val < 0) {\n return sections[1];\n }\n return sections[2] || sections[0];\n}\n\n/**\n * Check if format section is for negative values (2nd section in multi-section format)\n */\nfunction isNegativeSection(fmt: string, selectedFmt: string): boolean {\n const sections = splitFormat(fmt);\n return sections.length >= 2 && sections[1] === selectedFmt;\n}\n\n/**\n * Split format string by semicolons, respecting quoted strings and brackets\n */\nfunction splitFormat(fmt: string): string[] {\n const sections: string[] = [];\n let current = \"\";\n let inQuote = false;\n let inBracket = false;\n\n for (let i = 0; i < fmt.length; i++) {\n const char = fmt[i];\n\n if (char === '\"' && !inBracket) {\n inQuote = !inQuote;\n current += char;\n } else if (char === \"[\" && !inQuote) {\n inBracket = true;\n current += char;\n } else if (char === \"]\" && !inQuote) {\n inBracket = false;\n current += char;\n } else if (char === \";\" && !inQuote && !inBracket) {\n sections.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n\n sections.push(current);\n return sections;\n}\n\n/**\n * Main format function - formats a value according to Excel numFmt\n * @param fmt The Excel number format string (e.g., \"0.00%\", \"#,##0\", \"yyyy-mm-dd\")\n * @param val The value to format\n */\nexport function format(fmt: string, val: number | string | boolean): string {\n // Handle null/undefined\n if (val == null) {\n return \"\";\n }\n\n // Handle General format\n if (isGeneral(fmt)) {\n return formatGeneral(val);\n }\n\n // Handle string values\n if (typeof val === \"string\") {\n return chooseFormat(fmt, val) as string;\n }\n\n // Handle boolean values\n if (typeof val === \"boolean\") {\n return val ? \"TRUE\" : \"FALSE\";\n }\n\n // Now val is a number\n let numVal = val as number;\n\n // Choose the right format section based on value\n const selectedFmt = chooseFormat(fmt, numVal) as string;\n\n // If negative section is selected, use absolute value (format handles display)\n if (numVal < 0 && isNegativeSection(fmt, selectedFmt)) {\n numVal = Math.abs(numVal);\n }\n\n // Remove color codes like [Red], [Green], [Blue], etc.\n let cleanFmt = selectedFmt.replace(\n /\\[(Red|Green|Blue|Yellow|Magenta|Cyan|White|Black|Color\\d+)\\]/gi,\n \"\"\n );\n\n // Remove condition codes like [>100], [<=50], etc.\n cleanFmt = cleanFmt.replace(/\\[(>|<|>=|<=|=|<>)-?\\d+(\\.\\d+)?\\]/g, \"\");\n\n // Remove locale codes like [$-804], [$€-407], etc.\n cleanFmt = cleanFmt.replace(/\\[\\$[^\\]]*\\]/g, \"\");\n\n // Process _ and * placeholders\n cleanFmt = processPlaceholders(cleanFmt);\n\n // Process quoted text\n cleanFmt = processQuotedText(cleanFmt);\n\n // Check for elapsed time format [h]:mm:ss, [m]:ss, [s]\n if (/\\[[hms]+\\]/i.test(cleanFmt)) {\n return formatElapsedTime(numVal, cleanFmt);\n }\n\n // Check if this is a date format\n if (isDateFormat(cleanFmt)) {\n return formatDate(numVal, cleanFmt);\n }\n\n // Check for percentage\n if (cleanFmt.includes(\"%\")) {\n return formatPercentage(numVal, cleanFmt);\n }\n\n // Check for scientific notation\n if (/E[+-]?/i.test(cleanFmt)) {\n return formatScientific(numVal, cleanFmt);\n }\n\n // Check for fraction format\n if (/\\?+\\s*\\/\\s*[\\d?]+/.test(cleanFmt)) {\n return formatFraction(numVal, cleanFmt);\n }\n\n // Handle negative numbers in parentheses format\n if (cleanFmt.includes(\"(\") && cleanFmt.includes(\")\") && numVal < 0) {\n const innerFmt = cleanFmt.replace(/\\(|\\)/g, \"\");\n return \"(\" + formatNumberPattern(-numVal, innerFmt) + \")\";\n }\n\n // Handle text placeholder @\n if (cleanFmt === \"@\") {\n return numVal.toString();\n }\n\n // Handle currency symbol and literal text prefix/suffix\n let prefix = \"\";\n let suffix = \"\";\n\n // Extract currency/text prefix (includes $, ¥, €, etc. and quoted text)\n const prefixMatch = cleanFmt.match(/^([^#0?.,]+)/);\n if (prefixMatch) {\n prefix = prefixMatch[1];\n cleanFmt = cleanFmt.substring(prefixMatch[0].length);\n }\n\n // Extract suffix\n const suffixMatch = cleanFmt.match(/([^#0?.,]+)$/);\n if (suffixMatch && !suffixMatch[1].includes(\"%\")) {\n suffix = suffixMatch[1];\n cleanFmt = cleanFmt.substring(0, cleanFmt.length - suffixMatch[0].length);\n }\n\n // Format the number\n const formattedNum = formatNumberPattern(numVal, cleanFmt);\n\n return prefix + formattedNum + suffix;\n}\n\n// =============================================================================\n// Export\n// =============================================================================\n\nexport const cellFormat = {\n format,\n getFormat,\n isDateFormat,\n isGeneral\n};\n","/**\n * Utility functions for ExcelTS\n * Provides convenient helper functions for common spreadsheet operations\n */\n\nimport { Workbook } from \"../doc/workbook\";\nimport type { Worksheet } from \"../doc/worksheet\";\nimport type { Cell } from \"../doc/cell\";\nimport { colCache } from \"./col-cache\";\nimport type { CellValue } from \"../types\";\nimport { format as cellFormat } from \"./cell-format\";\n\n/**\n * Convert a Date object back to Excel serial number without timezone issues.\n * This reverses the excelToDate conversion exactly.\n * excelToDate uses: new Date(Math.round((v - 25569) * 24 * 3600 * 1000))\n * So we reverse it: (date.getTime() / (24 * 3600 * 1000)) + 25569\n */\nfunction dateToExcelSerial(d: Date): number {\n return d.getTime() / (24 * 3600 * 1000) + 25569;\n}\n\n/**\n * Check if format is a pure time format (no date components like y, m for month, d)\n * Time formats only contain: h, m (minutes in time context), s, AM/PM\n * Excludes elapsed time formats like [h]:mm:ss which should keep full serial number\n */\nfunction isTimeOnlyFormat(fmt: string): boolean {\n // Remove quoted strings first\n const cleaned = fmt.replace(/\"[^\"]*\"/g, \"\");\n\n // Elapsed time formats [h], [m], [s] should NOT be treated as time-only\n // They need the full serial number to calculate total hours/minutes/seconds\n if (/\\[[hms]\\]/i.test(cleaned)) {\n return false;\n }\n\n // Remove color codes and conditions (but we already checked for [h], [m], [s])\n const withoutBrackets = cleaned.replace(/\\[[^\\]]*\\]/g, \"\");\n\n // Check if it has time components (h, s, or AM/PM)\n const hasTimeComponents = /[hs]/i.test(withoutBrackets) || /AM\\/PM|A\\/P/i.test(withoutBrackets);\n\n // Check if it has date components (y, d, or m not adjacent to h/s which would make it minutes)\n // In Excel: \"m\" after \"h\" or before \"s\" is minutes, otherwise it's month\n const hasDateComponents = /[yd]/i.test(withoutBrackets);\n\n // If it has time but no date components, it's a time-only format\n // Also check for standalone 'm' that's not minutes (not near h or s)\n if (hasDateComponents) {\n return false;\n }\n\n // Check for month 'm' - if 'm' exists but not in h:m or m:s context, it's a date format\n if (/m/i.test(withoutBrackets) && !hasTimeComponents) {\n return false;\n }\n\n return hasTimeComponents;\n}\n\n/**\n * Check if format is a date format (contains y, d, or month-m)\n * Used to determine if dateFormat override should be applied\n */\nfunction isDateFormat(fmt: string): boolean {\n // Remove quoted strings first\n const cleaned = fmt.replace(/\"[^\"]*\"/g, \"\");\n\n // Elapsed time formats [h], [m], [s] are NOT date formats\n if (/\\[[hms]\\]/i.test(cleaned)) {\n return false;\n }\n\n // Remove color codes and conditions\n const withoutBrackets = cleaned.replace(/\\[[^\\]]*\\]/g, \"\");\n\n // Check for year or day components\n if (/[yd]/i.test(withoutBrackets)) {\n return true;\n }\n\n // Check for month 'm' - only if it's NOT in time context (not near h or s)\n // In Excel: \"m\" after \"h\" or before \"s\" is minutes, otherwise it's month\n if (/m/i.test(withoutBrackets)) {\n const hasTimeComponents = /[hs]/i.test(withoutBrackets) || /AM\\/PM|A\\/P/i.test(withoutBrackets);\n // If no time components, 'm' is month\n if (!hasTimeComponents) {\n return true;\n }\n // If has time components, need to check if 'm' is month or minutes\n // Simplified: if format has both date-like and time-like patterns, consider it a date format\n // e.g., \"m/d/yy h:mm\" - has 'm' as month and 'mm' as minutes\n }\n\n return false;\n}\n\n/**\n * Format a value (Date, number, boolean, string) according to the given format\n * Handles timezone-independent conversion for Date objects\n * @param value - The value to format\n * @param fmt - The format string to use\n * @param dateFormat - Optional override format for date values (not applied to time or elapsed time formats)\n */\nfunction formatValue(\n value: Date | number | boolean | string,\n fmt: string,\n dateFormat?: string\n): string {\n // Date object - convert back to Excel serial number\n if (value instanceof Date) {\n let serial = dateToExcelSerial(value);\n\n // For time-only formats, use only the fractional part (time portion)\n if (isTimeOnlyFormat(fmt)) {\n serial = serial % 1;\n if (serial < 0) {\n serial += 1;\n }\n return cellFormat(fmt, serial);\n }\n\n // Only apply dateFormat override to actual date formats\n // (not elapsed time formats like [h]:mm:ss)\n const actualFmt = dateFormat && isDateFormat(fmt) ? dateFormat : fmt;\n return cellFormat(actualFmt, serial);\n }\n\n // Number/Boolean/String - let cellFormat handle it\n return cellFormat(fmt, value);\n}\n\n/**\n * Get formatted display text for a cell value\n * Returns the value formatted according to the cell's numFmt\n * This matches Excel's display exactly (timezone-independent)\n * @param cell - The cell to get display text for\n * @param dateFormat - Optional override format for date values\n */\nfunction getCellDisplayText(cell: Cell, dateFormat?: string): string {\n const value = cell.value;\n const numFmt = cell.numFmt;\n // Extract format code string from numFmt (which can be string or NumFmt object)\n const fmt = typeof numFmt === \"string\" ? numFmt : (numFmt?.formatCode ?? \"General\");\n\n // Null/undefined\n if (value == null) {\n return \"\";\n }\n\n // Date/Number/Boolean/String - format directly\n if (\n value instanceof Date ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return formatValue(value, fmt, dateFormat);\n }\n\n // Formula type - use the result value\n if (typeof value === \"object\" && \"formula\" in value) {\n const result = value.result;\n\n if (result == null) {\n return \"\";\n }\n\n if (\n result instanceof Date ||\n typeof result === \"number\" ||\n typeof result === \"boolean\" ||\n typeof result === \"string\"\n ) {\n return formatValue(result, fmt, dateFormat);\n }\n }\n\n // Fallback to cell.text for other types (rich text, hyperlink, error, etc.)\n return cell.text;\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Cell address object (0-indexed)\n */\nexport interface CellAddress {\n /** 0-indexed column number */\n c: number;\n /** 0-indexed row number */\n r: number;\n}\n\n/**\n * Range object with start and end addresses\n */\nexport interface Range {\n /** Start cell (top-left) */\n s: CellAddress;\n /** End cell (bottom-right) */\n e: CellAddress;\n}\n\n/**\n * Row data for JSON conversion\n */\nexport type JSONRow = Record<string, CellValue>;\n\n// =============================================================================\n// Cell Address Encoding/Decoding\n// =============================================================================\n\n/**\n * Decode column string to 0-indexed number\n * @example decodeCol(\"A\") => 0, decodeCol(\"Z\") => 25, decodeCol(\"AA\") => 26\n */\nexport function decodeCol(colstr: string): number {\n return colCache.l2n(colstr.toUpperCase()) - 1;\n}\n\n/**\n * Encode 0-indexed column number to string\n * @example encodeCol(0) => \"A\", encodeCol(25) => \"Z\", encodeCol(26) => \"AA\"\n */\nexport function encodeCol(col: number): string {\n return colCache.n2l(col + 1);\n}\n\n/**\n * Decode row string to 0-indexed number\n * @example decodeRow(\"1\") => 0, decodeRow(\"10\") => 9\n */\nexport function decodeRow(rowstr: string): number {\n return parseInt(rowstr, 10) - 1;\n}\n\n/**\n * Encode 0-indexed row number to string\n * @example encodeRow(0) => \"1\", encodeRow(9) => \"10\"\n */\nexport function encodeRow(row: number): string {\n return String(row + 1);\n}\n\n/**\n * Decode cell address string to CellAddress object\n * @example decodeCell(\"A1\") => {c: 0, r: 0}, decodeCell(\"B2\") => {c: 1, r: 1}\n */\nexport function decodeCell(cstr: string): CellAddress {\n const addr = colCache.decodeAddress(cstr.toUpperCase());\n return { c: addr.col - 1, r: addr.row - 1 };\n}\n\n/**\n * Encode CellAddress object to cell address string\n * @example encodeCell({c: 0, r: 0}) => \"A1\", encodeCell({c: 1, r: 1}) => \"B2\"\n */\nexport function encodeCell(cell: CellAddress): string {\n return colCache.encodeAddress(cell.r + 1, cell.c + 1);\n}\n\n/**\n * Decode range string to Range object\n * @example decodeRange(\"A1:B2\") => {s: {c: 0, r: 0}, e: {c: 1, r: 1}}\n */\nexport function decodeRange(range: string): Range {\n const idx = range.indexOf(\":\");\n if (idx === -1) {\n const cell = decodeCell(range);\n return { s: cell, e: { ...cell } };\n }\n return {\n s: decodeCell(range.slice(0, idx)),\n e: decodeCell(range.slice(idx + 1))\n };\n}\n\n/**\n * Encode Range object to range string\n */\nexport function encodeRange(range: Range): string;\nexport function encodeRange(start: CellAddress, end: CellAddress): string;\nexport function encodeRange(startOrRange: CellAddress | Range, end?: CellAddress): string {\n if (end === undefined) {\n const range = startOrRange as Range;\n return encodeRange(range.s, range.e);\n }\n const start = startOrRange as CellAddress;\n const startStr = encodeCell(start);\n const endStr = encodeCell(end);\n return startStr === endStr ? startStr : `${startStr}:${endStr}`;\n}\n\n// =============================================================================\n// Sheet/JSON Conversion\n// =============================================================================\n\n/** Origin can be cell address string, cell object, row number, or -1 to append */\nexport type Origin = string | CellAddress | number;\n\nexport interface JSON2SheetOpts {\n /** Use specified field order (default Object.keys) */\n header?: string[];\n /** Use specified date format in string output */\n dateFormat?: string;\n /** Store dates as type d (default is n) */\n cellDates?: boolean;\n /** If true, do not include header row in output */\n skipHeader?: boolean;\n /** If true, emit #NULL! error cells for null values */\n nullError?: boolean;\n}\n\nexport interface SheetAddJSONOpts extends JSON2SheetOpts {\n /** Use specified cell as starting point */\n origin?: Origin;\n}\n\n/**\n * Create a worksheet from an array of objects (xlsx compatible)\n * @example\n * const ws = jsonToSheet([{name: \"Alice\", age: 30}, {name: \"Bob\", age: 25}])\n */\nexport function jsonToSheet(data: JSONRow[], opts?: JSON2SheetOpts): Worksheet {\n const o = opts || {};\n // Create a temporary workbook to get a worksheet\n const tempWb = new Workbook();\n const worksheet = tempWb.addWorksheet(\"Sheet1\");\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine headers - use provided header or Object.keys from first object\n const allKeys = new Set<string>();\n data.forEach(row => Object.keys(row).forEach(k => allKeys.add(k)));\n const headers = o.header ? [...o.header] : [...allKeys];\n\n // Add any missing keys from data that weren't in header\n if (o.header) {\n allKeys.forEach(k => {\n if (!headers.includes(k)) {\n headers.push(k);\n }\n });\n }\n\n let rowNum = 1;\n\n // Write header row\n if (!o.skipHeader) {\n headers.forEach((h, colIdx) => {\n worksheet.getCell(rowNum, colIdx + 1).value = h;\n });\n rowNum++;\n }\n\n // Write data rows\n for (const row of data) {\n headers.forEach((key, colIdx) => {\n const val = row[key];\n if (val === null && o.nullError) {\n worksheet.getCell(rowNum, colIdx + 1).value = { error: \"#NULL!\" };\n } else if (val !== undefined && val !== null) {\n worksheet.getCell(rowNum, colIdx + 1).value = val;\n }\n });\n rowNum++;\n }\n\n return worksheet;\n}\n\n/**\n * Add data from an array of objects to an existing worksheet (xlsx compatible)\n */\nexport function sheetAddJson(\n worksheet: Worksheet,\n data: JSONRow[],\n opts?: SheetAddJSONOpts\n): Worksheet {\n const o = opts || {};\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (o.origin !== undefined) {\n if (typeof o.origin === \"string\") {\n const addr = decodeCell(o.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof o.origin === \"number\") {\n if (o.origin === -1) {\n // Append to bottom\n startRow = worksheet.rowCount + 1;\n } else {\n startRow = o.origin + 1; // 0-indexed row\n }\n } else {\n startRow = o.origin.r + 1;\n startCol = o.origin.c + 1;\n }\n }\n\n // Determine headers\n const allKeys = new Set<string>();\n data.forEach(row => Object.keys(row).forEach(k => allKeys.add(k)));\n const headers = o.header ? [...o.header] : [...allKeys];\n\n if (o.header) {\n allKeys.forEach(k => {\n if (!headers.includes(k)) {\n headers.push(k);\n }\n });\n }\n\n let rowNum = startRow;\n\n // Write header row\n if (!o.skipHeader) {\n headers.forEach((h, colIdx) => {\n worksheet.getCell(rowNum, startCol + colIdx).value = h;\n });\n rowNum++;\n }\n\n // Write data rows\n for (const row of data) {\n headers.forEach((key, colIdx) => {\n const val = row[key];\n if (val === null && o.nullError) {\n worksheet.getCell(rowNum, startCol + colIdx).value = { error: \"#NULL!\" };\n } else if (val !== undefined && val !== null) {\n worksheet.getCell(rowNum, startCol + colIdx).value = val;\n }\n });\n rowNum++;\n }\n\n return worksheet;\n}\n\nexport interface Sheet2JSONOpts {\n /**\n * Control output format:\n * - 1: Generate an array of arrays\n * - \"A\": Row object keys are literal column labels (A, B, C, ...)\n * - string[]: Use specified strings as keys in row objects\n * - undefined: Read and disambiguate first row as keys\n */\n header?: 1 | \"A\" | string[];\n /**\n * Override Range:\n * - number: Use worksheet range but set starting row to the value\n * - string: Use specified range (A1-Style bounded range string)\n * - undefined: Use worksheet range\n */\n range?: number | string;\n /** Use raw values (true, default) or formatted text strings with trim (false) */\n raw?: boolean;\n /** Default value for empty cells */\n defval?: CellValue;\n /** Include blank lines in the output */\n blankrows?: boolean;\n /**\n * Override format for date values (not applied to time-only formats).\n * When provided, Date values will be formatted using this format string.\n * @example \"dd/mm/yyyy\" or \"yyyy-mm-dd\"\n */\n dateFormat?: string;\n}\n\n/**\n * Convert worksheet to JSON array (xlsx compatible)\n * @example\n * // Default: array of objects with first row as headers\n * const data = sheetToJson(worksheet)\n * // => [{name: \"Alice\", age: 30}, {name: \"Bob\", age: 25}]\n *\n * // Array of arrays\n * const aoa = sheetToJson(worksheet, { header: 1 })\n * // => [[\"name\", \"age\"], [\"Alice\", 30], [\"Bob\", 25]]\n *\n * // Column letters as keys\n * const cols = sheetToJson(worksheet, { header: \"A\" })\n * // => [{A: \"name\", B: \"age\"}, {A: \"Alice\", B: 30}]\n */\nexport function sheetToJson<T = JSONRow>(worksheet: Worksheet, opts?: Sheet2JSONOpts): T[] {\n const o = opts || {};\n\n // Determine range\n let startRow = 1;\n let endRow = worksheet.rowCount;\n let startCol = 1;\n let endCol = worksheet.columnCount;\n\n if (o.range !== undefined) {\n if (typeof o.range === \"number\") {\n startRow = o.range + 1; // 0-indexed to 1-indexed\n } else if (typeof o.range === \"string\") {\n const r = decodeRange(o.range);\n startRow = r.s.r + 1;\n endRow = r.e.r + 1;\n startCol = r.s.c + 1;\n endCol = r.e.c + 1;\n }\n }\n\n if (endRow < startRow || endCol < startCol) {\n return [];\n }\n\n // Handle header option\n const headerOpt = o.header;\n\n // header: 1 - return array of arrays\n if (headerOpt === 1) {\n const result: CellValue[][] = [];\n // Default for header:1 is to include blank rows\n const includeBlank = o.blankrows !== false;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: CellValue[] = [];\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n\n if (val != null && val !== \"\") {\n rowData[col - startCol] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[col - startCol] = o.defval;\n } else {\n rowData[col - startCol] = null;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // header: \"A\" - use column letters as keys\n if (headerOpt === \"A\") {\n const result: Record<string, CellValue>[] = [];\n // Default for header:\"A\" is to skip blank rows\n const includeBlank = o.blankrows === true;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n const key = encodeCol(col - 1); // 0-indexed for encodeCol\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // header: string[] - use provided array as keys\n if (Array.isArray(headerOpt)) {\n const result: Record<string, CellValue>[] = [];\n const includeBlank = o.blankrows === true;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const colIdx = col - startCol;\n const key = headerOpt[colIdx] ?? `__EMPTY_${colIdx}`;\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n }\n\n // Default: first row as header, disambiguate duplicates\n const headers: string[] = [];\n const headerCounts: Record<string, number> = {};\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(startRow, col);\n const val = cell.value;\n let header = val != null ? String(val) : `__EMPTY_${col - startCol}`;\n\n // Disambiguate duplicate headers\n if (headerCounts[header] !== undefined) {\n headerCounts[header]++;\n header = `${header}_${headerCounts[header]}`;\n } else {\n headerCounts[header] = 0;\n }\n\n headers.push(header);\n }\n\n // Read data rows (skip header row)\n const result: Record<string, CellValue>[] = [];\n const dataStartRow = startRow + 1;\n // Default for objects is to skip blank rows\n const includeBlank = o.blankrows === true;\n\n for (let row = dataStartRow; row <= endRow; row++) {\n const rowData: Record<string, CellValue> = {};\n let isEmpty = true;\n\n for (let col = startCol; col <= endCol; col++) {\n const cell = worksheet.getCell(row, col);\n const val = o.raw === false ? getCellDisplayText(cell, o.dateFormat).trim() : cell.value;\n const key = headers[col - startCol];\n\n if (val != null && val !== \"\") {\n rowData[key] = val;\n isEmpty = false;\n } else if (o.defval !== undefined) {\n rowData[key] = o.defval;\n }\n }\n\n if (!isEmpty || includeBlank) {\n result.push(rowData);\n }\n }\n\n return result as T[];\n}\n\n// =============================================================================\n// Sheet to CSV\n// =============================================================================\n\nexport interface Sheet2CSVOpts {\n /** Field separator (default: \",\") */\n FS?: string;\n /** Record separator (default: \"\\n\") */\n RS?: string;\n /** Skip blank rows */\n blankrows?: boolean;\n /** Force quote all fields */\n forceQuotes?: boolean;\n}\n\n/**\n * Convert worksheet to CSV string\n */\nexport function sheetToCsv(worksheet: Worksheet, opts?: Sheet2CSVOpts): string {\n const o = opts || {};\n const FS = o.FS ?? \",\";\n const RS = o.RS ?? \"\\n\";\n const rows: string[] = [];\n\n worksheet.eachRow({ includeEmpty: o.blankrows !== false }, (row, rowNumber) => {\n const cells: string[] = [];\n let isEmpty = true;\n\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n let val = \"\";\n if (cell.value != null) {\n if (cell.value instanceof Date) {\n val = cell.value.toISOString();\n } else if (typeof cell.value === \"object\") {\n // Handle rich text, formula results, etc.\n if (\"result\" in cell.value) {\n val = String(cell.value.result ?? \"\");\n } else if (\"text\" in cell.value) {\n val = String(cell.value.text ?? \"\");\n } else if (\"richText\" in cell.value) {\n val = (cell.value.richText as Array<{ text: string }>).map(r => r.text).join(\"\");\n } else {\n val = String(cell.value);\n }\n } else {\n val = String(cell.value);\n }\n isEmpty = false;\n }\n\n // Quote if necessary\n const needsQuote =\n o.forceQuotes ||\n val.includes(FS) ||\n val.includes('\"') ||\n val.includes(\"\\n\") ||\n val.includes(\"\\r\");\n\n if (needsQuote) {\n val = `\"${val.replace(/\"/g, '\"\"')}\"`;\n }\n\n cells.push(val);\n });\n\n // Pad cells to match column count\n while (cells.length < worksheet.columnCount) {\n cells.push(\"\");\n }\n\n if (!isEmpty || o.blankrows !== false) {\n rows.push(cells.join(FS));\n }\n });\n\n return rows.join(RS);\n}\n\n// =============================================================================\n// Workbook Functions\n// =============================================================================\n\n/**\n * Create a new workbook\n */\nexport function bookNew(): Workbook {\n return new Workbook();\n}\n\n/**\n * Append worksheet to workbook (xlsx compatible)\n * @example\n * const wb = bookNew();\n * const ws = jsonToSheet([{a: 1, b: 2}]);\n * bookAppendSheet(wb, ws, \"Sheet1\");\n */\nexport function bookAppendSheet(workbook: Workbook, worksheet: Worksheet, name?: string): void {\n // Copy the worksheet data to a new sheet in the workbook\n const newWs = workbook.addWorksheet(name);\n\n // Copy all cells from source worksheet\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n const newCell = newWs.getCell(rowNumber, colNumber);\n newCell.value = cell.value;\n if (cell.style) {\n newCell.style = cell.style;\n }\n });\n });\n\n // Copy column properties\n worksheet.columns?.forEach((col, idx) => {\n if (col && newWs.columns[idx]) {\n if (col.width) {\n newWs.getColumn(idx + 1).width = col.width;\n }\n }\n });\n}\n\n// =============================================================================\n// Array of Arrays Conversion\n// =============================================================================\n\nexport interface AOA2SheetOpts {\n /** Use specified cell as starting point */\n origin?: Origin;\n /** Use specified date format in string output */\n dateFormat?: string;\n /** Store dates as type d (default is n) */\n cellDates?: boolean;\n}\n\n/**\n * Create a worksheet from an array of arrays (xlsx compatible)\n * @example\n * const ws = aoaToSheet([[\"Name\", \"Age\"], [\"Alice\", 30], [\"Bob\", 25]])\n */\nexport function aoaToSheet(data: CellValue[][], opts?: AOA2SheetOpts): Worksheet {\n const tempWb = new Workbook();\n const worksheet = tempWb.addWorksheet(\"Sheet1\");\n\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (opts?.origin !== undefined) {\n if (typeof opts.origin === \"string\") {\n const addr = decodeCell(opts.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof opts.origin === \"number\") {\n startRow = opts.origin + 1; // 0-indexed row\n } else {\n startRow = opts.origin.r + 1;\n startCol = opts.origin.c + 1;\n }\n }\n\n data.forEach((row, rowIdx) => {\n if (!row) {\n return;\n }\n row.forEach((val, colIdx) => {\n if (val !== undefined && val !== null) {\n worksheet.getCell(startRow + rowIdx, startCol + colIdx).value = val;\n }\n });\n });\n\n return worksheet;\n}\n\n/**\n * Add data from an array of arrays to an existing worksheet (xlsx compatible)\n */\nexport function sheetAddAoa(\n worksheet: Worksheet,\n data: CellValue[][],\n opts?: AOA2SheetOpts\n): Worksheet {\n if (data.length === 0) {\n return worksheet;\n }\n\n // Determine starting position\n let startRow = 1;\n let startCol = 1;\n\n if (opts?.origin !== undefined) {\n if (typeof opts.origin === \"string\") {\n const addr = decodeCell(opts.origin);\n startRow = addr.r + 1;\n startCol = addr.c + 1;\n } else if (typeof opts.origin === \"number\") {\n if (opts.origin === -1) {\n // Append to bottom\n startRow = worksheet.rowCount + 1;\n } else {\n startRow = opts.origin + 1; // 0-indexed row\n }\n } else {\n startRow = opts.origin.r + 1;\n startCol = opts.origin.c + 1;\n }\n }\n\n data.forEach((row, rowIdx) => {\n if (!row) {\n return;\n }\n row.forEach((val, colIdx) => {\n if (val !== undefined && val !== null) {\n worksheet.getCell(startRow + rowIdx, startCol + colIdx).value = val;\n }\n });\n });\n\n return worksheet;\n}\n\n/**\n * Convert worksheet to array of arrays\n */\nexport function sheetToAoa(worksheet: Worksheet): CellValue[][] {\n const result: CellValue[][] = [];\n\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n const rowData: CellValue[] = [];\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n rowData[colNumber - 1] = cell.value;\n });\n result[rowNumber - 1] = rowData;\n });\n\n return result;\n}\n\n// =============================================================================\n// Export utils object\n// =============================================================================\n\nexport const utils = {\n // Cell encoding/decoding (camelCase)\n decodeCol,\n encodeCol,\n decodeRow,\n encodeRow,\n decodeCell,\n encodeCell,\n decodeRange,\n encodeRange,\n\n // Sheet/JSON conversion (camelCase)\n jsonToSheet,\n sheetAddJson,\n sheetToJson,\n sheetToCsv,\n aoaToSheet,\n sheetAddAoa,\n sheetToAoa,\n\n // Workbook functions (camelCase)\n bookNew,\n bookAppendSheet\n};\n"],"mappings":"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"}