@cj-tech-master/excelts 1.6.2 → 1.6.3-canary.20251224124621.73c5d94

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 (382) hide show
  1. package/README.md +36 -4
  2. package/README_zh.md +37 -6
  3. package/dist/browser/excelts.esm.js +19115 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +127 -0
  6. package/dist/browser/excelts.iife.js +13576 -46968
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +25 -105
  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 +154 -0
  12. package/dist/cjs/csv/csv.browser.js +68 -0
  13. package/dist/cjs/csv/csv.js +226 -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 +7 -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 +41 -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 +29 -26
  35. package/dist/cjs/stream/xlsx/workbook-writer.js +71 -57
  36. package/dist/cjs/stream/xlsx/worksheet-reader.js +27 -23
  37. package/dist/cjs/stream/xlsx/worksheet-writer.js +72 -66
  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/encryptor.browser.js +240 -0
  42. package/dist/cjs/utils/parse-sax.js +2 -2
  43. package/dist/cjs/utils/shared-formula.js +5 -5
  44. package/dist/cjs/utils/sheet-utils.js +13 -13
  45. package/dist/cjs/utils/stream-buf.browser.js +355 -0
  46. package/dist/cjs/utils/stream-buf.js +5 -5
  47. package/dist/cjs/utils/unzip/extract.js +11 -11
  48. package/dist/cjs/utils/unzip/index.js +21 -21
  49. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  50. package/dist/cjs/utils/unzip/parse.js +16 -16
  51. package/dist/cjs/utils/unzip/zip-parser.js +3 -3
  52. package/dist/cjs/utils/utils.base.js +161 -0
  53. package/dist/cjs/utils/utils.browser.js +89 -0
  54. package/dist/cjs/utils/utils.js +46 -154
  55. package/dist/cjs/utils/xml-stream.js +3 -3
  56. package/dist/cjs/utils/zip/compress.base.js +85 -0
  57. package/dist/cjs/utils/zip/compress.browser.js +83 -0
  58. package/dist/cjs/utils/zip/compress.js +18 -198
  59. package/dist/cjs/utils/zip/crc32.browser.js +88 -0
  60. package/dist/cjs/utils/zip/index.js +17 -17
  61. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  62. package/dist/cjs/utils/zip-stream.browser.js +135 -0
  63. package/dist/cjs/utils/zip-stream.js +4 -4
  64. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  65. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  66. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  67. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  68. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  69. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  70. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  71. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  72. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  73. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  74. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  75. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  76. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  77. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  78. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  79. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  80. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  81. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  82. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  83. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  84. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  85. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  86. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  87. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  88. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  89. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  90. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  91. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  92. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  93. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  94. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  95. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  96. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  97. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  98. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  99. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  100. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  101. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  102. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  103. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  104. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  105. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  106. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  107. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  108. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
  109. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  110. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  111. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  112. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  113. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  114. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  115. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  116. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  117. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  118. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  119. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  120. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  121. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
  122. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  123. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  124. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  125. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  126. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  127. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  128. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  129. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  130. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  131. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  133. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  134. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  135. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  138. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  141. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  142. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  143. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  144. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  145. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +4 -4
  146. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  147. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  148. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  149. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  150. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  151. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  152. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +68 -68
  153. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  155. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  156. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  157. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  158. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  159. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  160. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  161. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  162. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  163. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  164. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  165. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  166. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  167. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  168. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  169. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  170. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  171. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  172. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  173. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  174. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  175. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  176. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  177. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  178. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  179. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  180. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  181. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  182. package/dist/cjs/xlsx/xlsx.base.js +742 -0
  183. package/dist/cjs/xlsx/xlsx.browser.js +205 -0
  184. package/dist/cjs/xlsx/xlsx.js +91 -833
  185. package/dist/esm/csv/csv-core.js +694 -0
  186. package/dist/esm/csv/csv-stream.js +638 -0
  187. package/dist/esm/csv/csv.base.js +141 -0
  188. package/dist/esm/csv/csv.browser.js +65 -0
  189. package/dist/esm/csv/csv.js +189 -159
  190. package/dist/esm/doc/workbook.base.js +207 -0
  191. package/dist/esm/doc/workbook.browser.js +59 -0
  192. package/dist/esm/doc/workbook.js +64 -175
  193. package/dist/esm/index.browser.js +33 -1
  194. package/dist/esm/index.js +23 -8
  195. package/dist/esm/local.js +0 -1
  196. package/dist/esm/stream/xlsx/hyperlink-reader.js +1 -1
  197. package/dist/esm/stream/xlsx/workbook-reader.js +7 -4
  198. package/dist/esm/stream/xlsx/workbook-writer.js +37 -23
  199. package/dist/esm/stream/xlsx/worksheet-reader.js +12 -8
  200. package/dist/esm/stream/xlsx/worksheet-writer.js +12 -6
  201. package/dist/esm/utils/browser-buffer.js +67 -0
  202. package/dist/esm/utils/encryptor.browser.js +237 -0
  203. package/dist/esm/utils/stream-buf.browser.js +352 -0
  204. package/dist/esm/utils/utils.base.js +142 -0
  205. package/dist/esm/utils/utils.browser.js +68 -0
  206. package/dist/esm/utils/utils.js +15 -123
  207. package/dist/esm/utils/zip/compress.base.js +80 -0
  208. package/dist/esm/utils/zip/compress.browser.js +76 -0
  209. package/dist/esm/utils/zip/compress.js +16 -164
  210. package/dist/esm/utils/zip/crc32.browser.js +82 -0
  211. package/dist/esm/utils/zip-stream.browser.js +132 -0
  212. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
  213. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  214. package/dist/esm/xlsx/xlsx.base.js +739 -0
  215. package/dist/esm/xlsx/xlsx.browser.js +202 -0
  216. package/dist/esm/xlsx/xlsx.js +87 -829
  217. package/dist/types/csv/csv-core.d.ts +207 -0
  218. package/dist/types/csv/csv-stream.d.ts +114 -0
  219. package/dist/types/csv/csv.base.d.ts +61 -0
  220. package/dist/types/csv/csv.browser.d.ts +33 -0
  221. package/dist/types/csv/csv.d.ts +97 -71
  222. package/dist/types/doc/anchor.d.ts +1 -1
  223. package/dist/types/doc/cell.d.ts +7 -7
  224. package/dist/types/doc/column.d.ts +3 -3
  225. package/dist/types/doc/defined-names.d.ts +4 -4
  226. package/dist/types/doc/image.d.ts +2 -2
  227. package/dist/types/doc/modelcontainer.d.ts +1 -1
  228. package/dist/types/doc/pivot-table.d.ts +1 -1
  229. package/dist/types/doc/range.d.ts +1 -1
  230. package/dist/types/doc/row.d.ts +3 -3
  231. package/dist/types/doc/table.d.ts +4 -4
  232. package/dist/types/doc/workbook.base.d.ts +111 -0
  233. package/dist/types/doc/workbook.browser.d.ts +38 -0
  234. package/dist/types/doc/workbook.d.ts +62 -92
  235. package/dist/types/doc/worksheet.d.ts +10 -10
  236. package/dist/types/index.browser.d.ts +19 -5
  237. package/dist/types/index.d.ts +24 -20
  238. package/dist/types/local.d.ts +0 -1
  239. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +11 -11
  240. package/dist/types/stream/xlsx/workbook-reader.d.ts +125 -36
  241. package/dist/types/stream/xlsx/workbook-writer.d.ts +105 -22
  242. package/dist/types/stream/xlsx/worksheet-reader.d.ts +40 -22
  243. package/dist/types/stream/xlsx/worksheet-writer.d.ts +83 -49
  244. package/dist/types/types.d.ts +4 -16
  245. package/dist/types/utils/browser-buffer.d.ts +28 -0
  246. package/dist/types/utils/col-cache.d.ts +1 -1
  247. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  248. package/dist/types/utils/sheet-utils.d.ts +3 -3
  249. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  250. package/dist/types/utils/unzip/extract.d.ts +6 -6
  251. package/dist/types/utils/unzip/index.d.ts +8 -8
  252. package/dist/types/utils/unzip/parse.d.ts +3 -3
  253. package/dist/types/utils/utils.base.d.ts +29 -0
  254. package/dist/types/utils/utils.browser.d.ts +29 -0
  255. package/dist/types/utils/utils.d.ts +6 -25
  256. package/dist/types/utils/zip/compress.base.d.ts +42 -0
  257. package/dist/types/utils/zip/compress.browser.d.ts +54 -0
  258. package/dist/types/utils/zip/compress.d.ts +13 -45
  259. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  260. package/dist/types/utils/zip/index.d.ts +5 -5
  261. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  262. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  263. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  264. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  265. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  266. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  267. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  268. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  269. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  270. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  271. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  272. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  273. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  274. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  275. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  276. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  277. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  278. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  279. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  280. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  288. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  289. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  294. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  305. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  306. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  307. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  308. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  310. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  311. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  312. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  314. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  315. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  318. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  320. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  321. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  322. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  323. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  324. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  326. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  327. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  328. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  329. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  330. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  331. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  332. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  333. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  335. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  336. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +1 -1
  337. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  338. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  339. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  340. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  341. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  342. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +1 -1
  343. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  344. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  345. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  346. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  355. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  356. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  358. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  360. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  361. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  362. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  363. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  366. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  370. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  371. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  373. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  375. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  376. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  377. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  378. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  379. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  380. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  381. package/dist/types/xlsx/xlsx.d.ts +20 -80
  382. package/package.json +13 -15
@@ -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","i","address: CachedAddress","result: DecodedRange","range","keys: string[]","i","target: any","src: any","clone: any","copyIsArray: boolean","value: NoteModel | null","copy: FormulaValueData","ErrorValue","colNum: number","i: number","cSrc: Cell | undefined","cDst: Cell | undefined","i","options: { includeEmpty?: boolean } | null","callback: (cell: Cell, colNumber: number) => void","pb: RowBreak","values: CellValue[]","max","cells: CellModel[]","previousAddress: CellAddress | undefined","address: CellAddress | undefined","options: { includeEmpty?: boolean }","callback: (cell: Cell, rowNumber: number) => void","v: CellValueType[]","cols: ColumnModel[]","col: ColumnModel | null","columns: Column[]","range","Column","assign","i","validation","i","base64ToUint8Array","concatUint8Arrays","x","i","concatUint8Arrays","base64ToUint8Array","xmlDecodingMap: Record<string, string>","i","xmlEncodingMap: Record<string, string>","values: any[]","i","result: any[][]","result: CacheField[]","copied: StyleObject","columns: Column[]","colNum: number","i","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[]","i","inserts: (Cell | null)[]","range","x: number","y: number","cells: DefinedNameCell[]","i","x","i","i","l","Inflate","_a","UnzipPassThrough","UnzipInflate","Unzip","err","dat","final","i","chunks: Uint8Array[]","processedEntry: ProcessedEntry","chunks: Uint8Array[]","buf","chunk: Chunk","buffers: Uint8Array[]","i","buffer: Uint8Array","tmp: string[]","_a","err","i","_b","SaxesParser","error: Error | undefined","err","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[]","i","worksheets: any[]","worksheet: any","definedNames: any[]","range: any","range","range","dimensions: any","i","model: RowModel","model: ColModel","rangeValidations: any[]","regularModel: any","i","addr: any","dataValidation: any","range","formula: any","attributes: any","VIEW_STATES: { [key: string]: string }","booleanToXml","attributes: any","booleanToXml","AutoFilterXform","DrawingXform","ExtXform","extIcons","i","ExtXform","ExtLstXform","AutoFilterXform","DrawingXform","ExtLstXform","anchor: any","sheetFormatPropertiesModel: any","parts: string[]","i","attrs: any","attributes: any","drawingOptions: any","loadedPivotTables: any[]","pivotTablesIndexed: Record<string, any>","err","model: any","match: RegExpMatchArray | null","relationships: any[]","xml","worksheetOptions: any","buffer: Uint8Array","base64ToUint8Array","allFiles: Record<string, Uint8Array>","fileChunks: Uint8Array[]","err","i","e","n","t","r","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","i","e","t","n","r","o","a","f","h","u","d","l","s","c","m","M","i","t","e","n","s","f","u","r","o","duplicates: string[]","rows: string[][]","invalidRows: { row: string[]; reason: string }[]","currentRow: string[]","i","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","dayjs","customParseFormat","utc","SpecialValues: Record<string, boolean | CellErrorValue>","rows: any[][]","content: string","i","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","../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/browser.js","../../src/utils/zip/crc32.browser.ts","../../src/utils/zip/compress.base.ts","../../src/utils/zip/compress.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","../../node_modules/.pnpm/xmlchars@2.2.0/node_modules/xmlchars/xml/1.0/ed5.js","../../node_modules/.pnpm/xmlchars@2.2.0/node_modules/xmlchars/xml/1.1/ed2.js","../../node_modules/.pnpm/xmlchars@2.2.0/node_modules/xmlchars/xmlns/1.0/ed3.js","../../node_modules/.pnpm/saxes@6.0.0/node_modules/saxes/saxes.js","../../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/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","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/dayjs.min.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/customParseFormat.js","../../node_modules/.pnpm/dayjs@1.11.19/node_modules/dayjs/plugin/utc.js","../../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} 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 // 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 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 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 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\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 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.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","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([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, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([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, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\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 * 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\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 * Browser compression utilities using Web Streams API\n *\n * Uses CompressionStream API (Chrome 80+, Firefox 113+, Safari 16.4+)\n * with \"deflate-raw\" format (required for ZIP files)\n */\n\nimport {\n type CompressOptions,\n hasCompressionStream,\n compressWithStream,\n decompressWithStream\n} from \"./compress.base\";\n\n// Re-export shared types and utilities\nexport { type CompressOptions, hasCompressionStream };\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\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\n if (level === 0) {\n return data;\n }\n\n // Use CompressionStream\n if (typeof CompressionStream !== \"undefined\") {\n return compressWithStream(data);\n }\n\n // No compression available - return original data\n console.warn(\"No native compression available, returning uncompressed data\");\n return data;\n}\n\n/**\n * Compress data synchronously\n * Not available in browser - throws error\n *\n * @param _data - Data to compress\n * @param _options - Compression options\n * @throws Error always - sync compression not available in browser\n */\nexport function compressSync(_data: Uint8Array, _options: { level?: number } = {}): Uint8Array {\n throw new Error(\"Synchronous compression is not available in browser environment\");\n}\n\n/**\n * Decompress data using browser's native DecompressionStream\n *\n * @param data - Compressed data (deflate-raw format)\n * @returns Decompressed data\n */\nexport async function decompress(data: Uint8Array): Promise<Uint8Array> {\n // Use DecompressionStream\n if (typeof DecompressionStream !== \"undefined\") {\n return decompressWithStream(data);\n }\n\n throw new Error(\"No native decompression available in browser\");\n}\n\n/**\n * Decompress data synchronously\n * Not available in browser - throws error\n *\n * @param _data - Compressed data\n * @throws Error always - sync decompression not available in browser\n */\nexport function decompressSync(_data: Uint8Array): Uint8Array {\n throw new Error(\"Synchronous decompression is not available in browser environment\");\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","\"use strict\";\n/**\n * Character classes and associated utilities for the 5th edition of XML 1.0.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//\n// Fragments.\n//\nexports.CHAR = \"\\t\\n\\r -\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\";\nexports.S = \" \\t\\r\\n\";\n// tslint:disable-next-line:max-line-length\nexports.NAME_START_CHAR = \":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\uD800\\uDC00-\\uDB7F\\uDFFF\";\nexports.NAME_CHAR = \"-\" + exports.NAME_START_CHAR + \".0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040\";\n//\n// Regular expressions.\n//\nexports.CHAR_RE = new RegExp(\"^[\" + exports.CHAR + \"]$\", \"u\");\nexports.S_RE = new RegExp(\"^[\" + exports.S + \"]+$\", \"u\");\nexports.NAME_START_CHAR_RE = new RegExp(\"^[\" + exports.NAME_START_CHAR + \"]$\", \"u\");\nexports.NAME_CHAR_RE = new RegExp(\"^[\" + exports.NAME_CHAR + \"]$\", \"u\");\nexports.NAME_RE = new RegExp(\"^[\" + exports.NAME_START_CHAR + \"][\" + exports.NAME_CHAR + \"]*$\", \"u\");\nexports.NMTOKEN_RE = new RegExp(\"^[\" + exports.NAME_CHAR + \"]+$\", \"u\");\nvar TAB = 9;\nvar NL = 0xA;\nvar CR = 0xD;\nvar SPACE = 0x20;\n//\n// Lists.\n//\n/** All characters in the ``S`` production. */\nexports.S_LIST = [SPACE, NL, CR, TAB];\n/**\n * Determines whether a codepoint matches the ``CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``CHAR``.\n */\nfunction isChar(c) {\n return (c >= SPACE && c <= 0xD7FF) ||\n c === NL || c === CR || c === TAB ||\n (c >= 0xE000 && c <= 0xFFFD) ||\n (c >= 0x10000 && c <= 0x10FFFF);\n}\nexports.isChar = isChar;\n/**\n * Determines whether a codepoint matches the ``S`` (space) production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``S``.\n */\nfunction isS(c) {\n return c === SPACE || c === NL || c === CR || c === TAB;\n}\nexports.isS = isS;\n/**\n * Determines whether a codepoint matches the ``NAME_START_CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``NAME_START_CHAR``.\n */\nfunction isNameStartChar(c) {\n return ((c >= 0x41 && c <= 0x5A) ||\n (c >= 0x61 && c <= 0x7A) ||\n c === 0x3A ||\n c === 0x5F ||\n c === 0x200C ||\n c === 0x200D ||\n (c >= 0xC0 && c <= 0xD6) ||\n (c >= 0xD8 && c <= 0xF6) ||\n (c >= 0x00F8 && c <= 0x02FF) ||\n (c >= 0x0370 && c <= 0x037D) ||\n (c >= 0x037F && c <= 0x1FFF) ||\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}\nexports.isNameStartChar = isNameStartChar;\n/**\n * Determines whether a codepoint matches the ``NAME_CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``NAME_CHAR``.\n */\nfunction isNameChar(c) {\n return isNameStartChar(c) ||\n (c >= 0x30 && c <= 0x39) ||\n c === 0x2D ||\n c === 0x2E ||\n c === 0xB7 ||\n (c >= 0x0300 && c <= 0x036F) ||\n (c >= 0x203F && c <= 0x2040);\n}\nexports.isNameChar = isNameChar;\n//# sourceMappingURL=ed5.js.map","\"use strict\";\n/**\n * Character classes and associated utilities for the 2nd edition of XML 1.1.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//\n// Fragments.\n//\nexports.CHAR = \"\\u0001-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\";\nexports.RESTRICTED_CHAR = \"\\u0001-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F-\\u0084\\u0086-\\u009F\";\nexports.S = \" \\t\\r\\n\";\n// tslint:disable-next-line:max-line-length\nexports.NAME_START_CHAR = \":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\uD800\\uDC00-\\uDB7F\\uDFFF\";\nexports.NAME_CHAR = \"-\" + exports.NAME_START_CHAR + \".0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040\";\n//\n// Regular expressions.\n//\nexports.CHAR_RE = new RegExp(\"^[\" + exports.CHAR + \"]$\", \"u\");\nexports.RESTRICTED_CHAR_RE = new RegExp(\"^[\" + exports.RESTRICTED_CHAR + \"]$\", \"u\");\nexports.S_RE = new RegExp(\"^[\" + exports.S + \"]+$\", \"u\");\nexports.NAME_START_CHAR_RE = new RegExp(\"^[\" + exports.NAME_START_CHAR + \"]$\", \"u\");\nexports.NAME_CHAR_RE = new RegExp(\"^[\" + exports.NAME_CHAR + \"]$\", \"u\");\nexports.NAME_RE = new RegExp(\"^[\" + exports.NAME_START_CHAR + \"][\" + exports.NAME_CHAR + \"]*$\", \"u\");\nexports.NMTOKEN_RE = new RegExp(\"^[\" + exports.NAME_CHAR + \"]+$\", \"u\");\nvar TAB = 9;\nvar NL = 0xA;\nvar CR = 0xD;\nvar SPACE = 0x20;\n//\n// Lists.\n//\n/** All characters in the ``S`` production. */\nexports.S_LIST = [SPACE, NL, CR, TAB];\n/**\n * Determines whether a codepoint matches the ``CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``CHAR``.\n */\nfunction isChar(c) {\n return (c >= 0x0001 && c <= 0xD7FF) ||\n (c >= 0xE000 && c <= 0xFFFD) ||\n (c >= 0x10000 && c <= 0x10FFFF);\n}\nexports.isChar = isChar;\n/**\n * Determines whether a codepoint matches the ``RESTRICTED_CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``RESTRICTED_CHAR``.\n */\nfunction isRestrictedChar(c) {\n return (c >= 0x1 && c <= 0x8) ||\n c === 0xB ||\n c === 0xC ||\n (c >= 0xE && c <= 0x1F) ||\n (c >= 0x7F && c <= 0x84) ||\n (c >= 0x86 && c <= 0x9F);\n}\nexports.isRestrictedChar = isRestrictedChar;\n/**\n * Determines whether a codepoint matches the ``CHAR`` production and does not\n * match the ``RESTRICTED_CHAR`` production. ``isCharAndNotRestricted(x)`` is\n * equivalent to ``isChar(x) && !isRestrictedChar(x)``. This function is faster\n * than running the two-call equivalent.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``CHAR`` and does not match\n * ``RESTRICTED_CHAR``.\n */\nfunction isCharAndNotRestricted(c) {\n return (c === 0x9) ||\n (c === 0xA) ||\n (c === 0xD) ||\n (c > 0x1F && c < 0x7F) ||\n (c === 0x85) ||\n (c > 0x9F && c <= 0xD7FF) ||\n (c >= 0xE000 && c <= 0xFFFD) ||\n (c >= 0x10000 && c <= 0x10FFFF);\n}\nexports.isCharAndNotRestricted = isCharAndNotRestricted;\n/**\n * Determines whether a codepoint matches the ``S`` (space) production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``S``.\n */\nfunction isS(c) {\n return c === SPACE || c === NL || c === CR || c === TAB;\n}\nexports.isS = isS;\n/**\n * Determines whether a codepoint matches the ``NAME_START_CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``NAME_START_CHAR``.\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction isNameStartChar(c) {\n return ((c >= 0x41 && c <= 0x5A) ||\n (c >= 0x61 && c <= 0x7A) ||\n c === 0x3A ||\n c === 0x5F ||\n c === 0x200C ||\n c === 0x200D ||\n (c >= 0xC0 && c <= 0xD6) ||\n (c >= 0xD8 && c <= 0xF6) ||\n (c >= 0x00F8 && c <= 0x02FF) ||\n (c >= 0x0370 && c <= 0x037D) ||\n (c >= 0x037F && c <= 0x1FFF) ||\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}\nexports.isNameStartChar = isNameStartChar;\n/**\n * Determines whether a codepoint matches the ``NAME_CHAR`` production.\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches ``NAME_CHAR``.\n */\nfunction isNameChar(c) {\n return isNameStartChar(c) ||\n (c >= 0x30 && c <= 0x39) ||\n c === 0x2D ||\n c === 0x2E ||\n c === 0xB7 ||\n (c >= 0x0300 && c <= 0x036F) ||\n (c >= 0x203F && c <= 0x2040);\n}\nexports.isNameChar = isNameChar;\n//# sourceMappingURL=ed2.js.map","\"use strict\";\n/**\n * Character class utilities for XML NS 1.0 edition 3.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//\n// Fragments.\n//\n// tslint:disable-next-line:max-line-length\nexports.NC_NAME_START_CHAR = \"A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\uD800\\uDC00-\\uDB7F\\uDFFF\";\nexports.NC_NAME_CHAR = \"-\" + exports.NC_NAME_START_CHAR + \".0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040\";\n//\n// Regular expressions.\n//\nexports.NC_NAME_START_CHAR_RE = new RegExp(\"^[\" + exports.NC_NAME_START_CHAR + \"]$\", \"u\");\nexports.NC_NAME_CHAR_RE = new RegExp(\"^[\" + exports.NC_NAME_CHAR + \"]$\", \"u\");\nexports.NC_NAME_RE = new RegExp(\"^[\" + exports.NC_NAME_START_CHAR + \"][\" + exports.NC_NAME_CHAR + \"]*$\", \"u\");\n/**\n * Determines whether a codepoint matches [[NC_NAME_START_CHAR]].\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches.\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction isNCNameStartChar(c) {\n return ((c >= 0x41 && c <= 0x5A) ||\n c === 0x5F ||\n (c >= 0x61 && c <= 0x7A) ||\n (c >= 0xC0 && c <= 0xD6) ||\n (c >= 0xD8 && c <= 0xF6) ||\n (c >= 0x00F8 && c <= 0x02FF) ||\n (c >= 0x0370 && c <= 0x037D) ||\n (c >= 0x037F && c <= 0x1FFF) ||\n (c >= 0x200C && 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}\nexports.isNCNameStartChar = isNCNameStartChar;\n/**\n * Determines whether a codepoint matches [[NC_NAME_CHAR]].\n *\n * @param c The code point.\n *\n * @returns ``true`` if the codepoint matches.\n */\nfunction isNCNameChar(c) {\n return isNCNameStartChar(c) ||\n (c === 0x2D ||\n c === 0x2E ||\n (c >= 0x30 && c <= 0x39) ||\n c === 0x00B7 ||\n (c >= 0x0300 && c <= 0x036F) ||\n (c >= 0x203F && c <= 0x2040));\n}\nexports.isNCNameChar = isNCNameChar;\n//# sourceMappingURL=ed3.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SaxesParser = exports.EVENTS = void 0;\nconst ed5 = require(\"xmlchars/xml/1.0/ed5\");\nconst ed2 = require(\"xmlchars/xml/1.1/ed2\");\nconst NSed3 = require(\"xmlchars/xmlns/1.0/ed3\");\nvar isS = ed5.isS;\nvar isChar10 = ed5.isChar;\nvar isNameStartChar = ed5.isNameStartChar;\nvar isNameChar = ed5.isNameChar;\nvar S_LIST = ed5.S_LIST;\nvar NAME_RE = ed5.NAME_RE;\nvar isChar11 = ed2.isChar;\nvar isNCNameStartChar = NSed3.isNCNameStartChar;\nvar isNCNameChar = NSed3.isNCNameChar;\nvar NC_NAME_RE = NSed3.NC_NAME_RE;\nconst XML_NAMESPACE = \"http://www.w3.org/XML/1998/namespace\";\nconst XMLNS_NAMESPACE = \"http://www.w3.org/2000/xmlns/\";\nconst rootNS = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n __proto__: null,\n xml: XML_NAMESPACE,\n xmlns: XMLNS_NAMESPACE,\n};\nconst XML_ENTITIES = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n __proto__: null,\n amp: \"&\",\n gt: \">\",\n lt: \"<\",\n quot: \"\\\"\",\n apos: \"'\",\n};\n// EOC: end-of-chunk\nconst EOC = -1;\nconst NL_LIKE = -2;\nconst S_BEGIN = 0; // Initial state.\nconst S_BEGIN_WHITESPACE = 1; // leading whitespace\nconst S_DOCTYPE = 2; // <!DOCTYPE\nconst S_DOCTYPE_QUOTE = 3; // <!DOCTYPE \"//blah\nconst S_DTD = 4; // <!DOCTYPE \"//blah\" [ ...\nconst S_DTD_QUOTED = 5; // <!DOCTYPE \"//blah\" [ \"foo\nconst S_DTD_OPEN_WAKA = 6;\nconst S_DTD_OPEN_WAKA_BANG = 7;\nconst S_DTD_COMMENT = 8; // <!--\nconst S_DTD_COMMENT_ENDING = 9; // <!-- blah -\nconst S_DTD_COMMENT_ENDED = 10; // <!-- blah --\nconst S_DTD_PI = 11; // <?\nconst S_DTD_PI_ENDING = 12; // <?hi \"there\" ?\nconst S_TEXT = 13; // general stuff\nconst S_ENTITY = 14; // &amp and such\nconst S_OPEN_WAKA = 15; // <\nconst S_OPEN_WAKA_BANG = 16; // <!...\nconst S_COMMENT = 17; // <!--\nconst S_COMMENT_ENDING = 18; // <!-- blah -\nconst S_COMMENT_ENDED = 19; // <!-- blah --\nconst S_CDATA = 20; // <![CDATA[ something\nconst S_CDATA_ENDING = 21; // ]\nconst S_CDATA_ENDING_2 = 22; // ]]\nconst S_PI_FIRST_CHAR = 23; // <?hi, first char\nconst S_PI_REST = 24; // <?hi, rest of the name\nconst S_PI_BODY = 25; // <?hi there\nconst S_PI_ENDING = 26; // <?hi \"there\" ?\nconst S_XML_DECL_NAME_START = 27; // <?xml\nconst S_XML_DECL_NAME = 28; // <?xml foo\nconst S_XML_DECL_EQ = 29; // <?xml foo=\nconst S_XML_DECL_VALUE_START = 30; // <?xml foo=\nconst S_XML_DECL_VALUE = 31; // <?xml foo=\"bar\"\nconst S_XML_DECL_SEPARATOR = 32; // <?xml foo=\"bar\"\nconst S_XML_DECL_ENDING = 33; // <?xml ... ?\nconst S_OPEN_TAG = 34; // <strong\nconst S_OPEN_TAG_SLASH = 35; // <strong /\nconst S_ATTRIB = 36; // <a\nconst S_ATTRIB_NAME = 37; // <a foo\nconst S_ATTRIB_NAME_SAW_WHITE = 38; // <a foo _\nconst S_ATTRIB_VALUE = 39; // <a foo=\nconst S_ATTRIB_VALUE_QUOTED = 40; // <a foo=\"bar\nconst S_ATTRIB_VALUE_CLOSED = 41; // <a foo=\"bar\"\nconst S_ATTRIB_VALUE_UNQUOTED = 42; // <a foo=bar\nconst S_CLOSE_TAG = 43; // </a\nconst S_CLOSE_TAG_SAW_WHITE = 44; // </a >\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 NEL = 0x85;\nconst LS = 0x2028; // Line Separator\nconst isQuote = (c) => c === DQUOTE || c === SQUOTE;\nconst QUOTES = [DQUOTE, SQUOTE];\nconst DOCTYPE_TERMINATOR = [...QUOTES, OPEN_BRACKET, GREATER];\nconst DTD_TERMINATOR = [...QUOTES, LESS, CLOSE_BRACKET];\nconst XML_DECL_NAME_TERMINATOR = [EQUAL, QUESTION, ...S_LIST];\nconst ATTRIB_VALUE_UNQUOTED_TERMINATOR = [...S_LIST, GREATER, AMP, LESS];\nfunction nsPairCheck(parser, prefix, uri) {\n switch (prefix) {\n case \"xml\":\n if (uri !== XML_NAMESPACE) {\n parser.fail(`xml prefix must be bound to ${XML_NAMESPACE}.`);\n }\n break;\n case \"xmlns\":\n if (uri !== XMLNS_NAMESPACE) {\n parser.fail(`xmlns prefix must be bound to ${XMLNS_NAMESPACE}.`);\n }\n break;\n default:\n }\n switch (uri) {\n case XMLNS_NAMESPACE:\n parser.fail(prefix === \"\" ?\n `the default namespace may not be set to ${uri}.` :\n `may not assign a prefix (even \"xmlns\") to the URI \\\n${XMLNS_NAMESPACE}.`);\n break;\n case XML_NAMESPACE:\n switch (prefix) {\n case \"xml\":\n // Assinging the XML namespace to \"xml\" is fine.\n break;\n case \"\":\n parser.fail(`the default namespace may not be set to ${uri}.`);\n break;\n default:\n parser.fail(\"may not assign the xml namespace to another prefix.\");\n }\n break;\n default:\n }\n}\nfunction nsMappingCheck(parser, mapping) {\n for (const local of Object.keys(mapping)) {\n nsPairCheck(parser, local, mapping[local]);\n }\n}\nconst isNCName = (name) => NC_NAME_RE.test(name);\nconst isName = (name) => NAME_RE.test(name);\nconst FORBIDDEN_START = 0;\nconst FORBIDDEN_BRACKET = 1;\nconst FORBIDDEN_BRACKET_BRACKET = 2;\n/**\n * The list of supported events.\n */\nexports.EVENTS = [\n \"xmldecl\",\n \"text\",\n \"processinginstruction\",\n \"doctype\",\n \"comment\",\n \"opentagstart\",\n \"attribute\",\n \"opentag\",\n \"closetag\",\n \"cdata\",\n \"error\",\n \"end\",\n \"ready\",\n];\nconst EVENT_NAME_TO_HANDLER_NAME = {\n xmldecl: \"xmldeclHandler\",\n text: \"textHandler\",\n processinginstruction: \"piHandler\",\n doctype: \"doctypeHandler\",\n comment: \"commentHandler\",\n opentagstart: \"openTagStartHandler\",\n attribute: \"attributeHandler\",\n opentag: \"openTagHandler\",\n closetag: \"closeTagHandler\",\n cdata: \"cdataHandler\",\n error: \"errorHandler\",\n end: \"endHandler\",\n ready: \"readyHandler\",\n};\n// eslint-disable-next-line @typescript-eslint/ban-types\nclass SaxesParser {\n /**\n * @param opt The parser options.\n */\n constructor(opt) {\n this.opt = opt !== null && opt !== void 0 ? opt : {};\n this.fragmentOpt = !!this.opt.fragment;\n const xmlnsOpt = this.xmlnsOpt = !!this.opt.xmlns;\n this.trackPosition = this.opt.position !== false;\n this.fileName = this.opt.fileName;\n if (xmlnsOpt) {\n // This is the function we use to perform name checks on PIs and entities.\n // When namespaces are used, colons are not allowed in PI target names or\n // entity names. So the check depends on whether namespaces are used. See:\n //\n // https://www.w3.org/XML/xml-names-19990114-errata.html\n // NE08\n //\n this.nameStartCheck = isNCNameStartChar;\n this.nameCheck = isNCNameChar;\n this.isName = isNCName;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.processAttribs = this.processAttribsNS;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.pushAttrib = this.pushAttribNS;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n this.ns = Object.assign({ __proto__: null }, rootNS);\n const additional = this.opt.additionalNamespaces;\n if (additional != null) {\n nsMappingCheck(this, additional);\n Object.assign(this.ns, additional);\n }\n }\n else {\n this.nameStartCheck = isNameStartChar;\n this.nameCheck = isNameChar;\n this.isName = isName;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.processAttribs = this.processAttribsPlain;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.pushAttrib = this.pushAttribPlain;\n }\n //\n // The order of the members in this table needs to correspond to the state\n // numbers given to the states that correspond to the methods being recorded\n // here.\n //\n this.stateTable = [\n /* eslint-disable @typescript-eslint/unbound-method */\n this.sBegin,\n this.sBeginWhitespace,\n this.sDoctype,\n this.sDoctypeQuote,\n this.sDTD,\n this.sDTDQuoted,\n this.sDTDOpenWaka,\n this.sDTDOpenWakaBang,\n this.sDTDComment,\n this.sDTDCommentEnding,\n this.sDTDCommentEnded,\n this.sDTDPI,\n this.sDTDPIEnding,\n this.sText,\n this.sEntity,\n this.sOpenWaka,\n this.sOpenWakaBang,\n this.sComment,\n this.sCommentEnding,\n this.sCommentEnded,\n this.sCData,\n this.sCDataEnding,\n this.sCDataEnding2,\n this.sPIFirstChar,\n this.sPIRest,\n this.sPIBody,\n this.sPIEnding,\n this.sXMLDeclNameStart,\n this.sXMLDeclName,\n this.sXMLDeclEq,\n this.sXMLDeclValueStart,\n this.sXMLDeclValue,\n this.sXMLDeclSeparator,\n this.sXMLDeclEnding,\n this.sOpenTag,\n this.sOpenTagSlash,\n this.sAttrib,\n this.sAttribName,\n this.sAttribNameSawWhite,\n this.sAttribValue,\n this.sAttribValueQuoted,\n this.sAttribValueClosed,\n this.sAttribValueUnquoted,\n this.sCloseTag,\n this.sCloseTagSawWhite,\n /* eslint-enable @typescript-eslint/unbound-method */\n ];\n this._init();\n }\n /**\n * Indicates whether or not the parser is closed. If ``true``, wait for\n * the ``ready`` event to write again.\n */\n get closed() {\n return this._closed;\n }\n _init() {\n var _a;\n this.openWakaBang = \"\";\n this.text = \"\";\n this.name = \"\";\n this.piTarget = \"\";\n this.entity = \"\";\n this.q = null;\n this.tags = [];\n this.tag = null;\n this.topNS = null;\n this.chunk = \"\";\n this.chunkPosition = 0;\n this.i = 0;\n this.prevI = 0;\n this.carriedFromPrevious = undefined;\n this.forbiddenState = FORBIDDEN_START;\n this.attribList = [];\n // The logic is organized so as to minimize the need to check\n // this.opt.fragment while parsing.\n const { fragmentOpt } = this;\n this.state = fragmentOpt ? S_TEXT : S_BEGIN;\n // We want these to be all true if we are dealing with a fragment.\n this.reportedTextBeforeRoot = this.reportedTextAfterRoot = this.closedRoot =\n this.sawRoot = fragmentOpt;\n // An XML declaration is intially possible only when parsing whole\n // documents.\n this.xmlDeclPossible = !fragmentOpt;\n this.xmlDeclExpects = [\"version\"];\n this.entityReturnState = undefined;\n let { defaultXMLVersion } = this.opt;\n if (defaultXMLVersion === undefined) {\n if (this.opt.forceXMLVersion === true) {\n throw new Error(\"forceXMLVersion set but defaultXMLVersion is not set\");\n }\n defaultXMLVersion = \"1.0\";\n }\n this.setXMLVersion(defaultXMLVersion);\n this.positionAtNewLine = 0;\n this.doctype = false;\n this._closed = false;\n this.xmlDecl = {\n version: undefined,\n encoding: undefined,\n standalone: undefined,\n };\n this.line = 1;\n this.column = 0;\n this.ENTITIES = Object.create(XML_ENTITIES);\n (_a = this.readyHandler) === null || _a === void 0 ? void 0 : _a.call(this);\n }\n /**\n * The stream position the parser is currently looking at. This field is\n * zero-based.\n *\n * This field is not based on counting Unicode characters but is to be\n * interpreted as a plain index into a JavaScript string.\n */\n get position() {\n return this.chunkPosition + this.i;\n }\n /**\n * The column number of the next character to be read by the parser. *\n * This field is zero-based. (The first column in a line is 0.)\n *\n * This field reports the index at which the next character would be in the\n * line if the line were represented as a JavaScript string. Note that this\n * *can* be different to a count based on the number of *Unicode characters*\n * due to how JavaScript handles astral plane characters.\n *\n * See [[column]] for a number that corresponds to a count of Unicode\n * characters.\n */\n get columnIndex() {\n return this.position - this.positionAtNewLine;\n }\n /**\n * Set an event listener on an event. The parser supports one handler per\n * event type. If you try to set an event handler over an existing handler,\n * the old handler is silently overwritten.\n *\n * @param name The event to listen to.\n *\n * @param handler The handler to set.\n */\n on(name, handler) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n this[EVENT_NAME_TO_HANDLER_NAME[name]] = handler;\n }\n /**\n * Unset an event handler.\n *\n * @parma name The event to stop listening to.\n */\n off(name) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n this[EVENT_NAME_TO_HANDLER_NAME[name]] = undefined;\n }\n /**\n * Make an error object. The error object will have a message that contains\n * the ``fileName`` option passed at the creation of the parser. If position\n * tracking was turned on, it will also have line and column number\n * information.\n *\n * @param message The message describing the error to report.\n *\n * @returns An error object with a properly formatted message.\n */\n makeError(message) {\n var _a;\n let msg = (_a = this.fileName) !== null && _a !== void 0 ? _a : \"\";\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 * Report a parsing error. This method is made public so that client code may\n * check for issues that are outside the scope of this project and can report\n * errors.\n *\n * @param message The error to report.\n *\n * @returns this\n */\n fail(message) {\n const err = this.makeError(message);\n const handler = this.errorHandler;\n if (handler === undefined) {\n throw err;\n }\n else {\n handler(err);\n }\n return this;\n }\n /**\n * Write a XML data to the parser.\n *\n * @param chunk The XML data to write.\n *\n * @returns this\n */\n // We do need object for the type here. Yes, it often causes problems\n // but not in this case.\n write(chunk) {\n if (this.closed) {\n return this.fail(\"cannot write after close; assign an onready handler.\");\n }\n let end = false;\n if (chunk === null) {\n // We cannot return immediately because carriedFromPrevious may need\n // processing.\n end = true;\n chunk = \"\";\n }\n else if (typeof chunk === \"object\") {\n chunk = chunk.toString();\n }\n // We checked if performing a pre-decomposition of the string into an array\n // of single complete characters (``Array.from(chunk)``) would be faster\n // than the current repeated calls to ``charCodeAt``. As of August 2018, it\n // isn't. (There may be Node-specific code that would perform faster than\n // ``Array.from`` but don't want to be dependent on Node.)\n if (this.carriedFromPrevious !== undefined) {\n // The previous chunk had char we must carry over.\n chunk = `${this.carriedFromPrevious}${chunk}`;\n this.carriedFromPrevious = undefined;\n }\n let limit = chunk.length;\n const lastCode = chunk.charCodeAt(limit - 1);\n if (!end &&\n // A trailing CR or surrogate must be carried over to the next\n // chunk.\n (lastCode === CR || (lastCode >= 0xD800 && lastCode <= 0xDBFF))) {\n // The chunk ends with a character that must be carried over. We cannot\n // know how to handle it until we get the next chunk or the end of the\n // stream. So save it for later.\n this.carriedFromPrevious = chunk[limit - 1];\n limit--;\n chunk = chunk.slice(0, limit);\n }\n const { stateTable } = this;\n this.chunk = chunk;\n this.i = 0;\n while (this.i < limit) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n stateTable[this.state].call(this);\n }\n this.chunkPosition += limit;\n return end ? this.end() : this;\n }\n /**\n * Close the current stream. Perform final well-formedness checks and reset\n * the parser tstate.\n *\n * @returns this\n */\n close() {\n return this.write(null);\n }\n /**\n * Get a single code point out of the current chunk. This updates the current\n * position if we do position tracking.\n *\n * This is the algorithm to use for XML 1.0.\n *\n * @returns The character read.\n */\n getCode10() {\n const { chunk, i } = this;\n this.prevI = i;\n // Yes, we do this instead of doing this.i++. Doing it this way, we do not\n // read this.i again, which is a bit faster.\n this.i = i + 1;\n if (i >= chunk.length) {\n return EOC;\n }\n // Using charCodeAt and handling the surrogates ourselves is faster\n // than using codePointAt.\n const code = chunk.charCodeAt(i);\n this.column++;\n if (code < 0xD800) {\n if (code >= SPACE || code === TAB) {\n return code;\n }\n switch (code) {\n case NL:\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n return NL;\n case CR:\n // We may get NaN if we read past the end of the chunk, which is fine.\n if (chunk.charCodeAt(i + 1) === NL) {\n // A \\r\\n sequence is converted to \\n so we have to skip over the\n // next character. We already know it has a size of 1 so ++ is fine\n // here.\n this.i = i + 2;\n }\n // Otherwise, a \\r is just converted to \\n, so we don't have to skip\n // ahead.\n // In either case, \\r becomes \\n.\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n return NL_LIKE;\n default:\n // If we get here, then code < SPACE and it is not NL CR or TAB.\n this.fail(\"disallowed character.\");\n return code;\n }\n }\n if (code > 0xDBFF) {\n // This is a specialized version of isChar10 that takes into account\n // that in this context code > 0xDBFF and code <= 0xFFFF. So it does not\n // test cases that don't need testing.\n if (!(code >= 0xE000 && code <= 0xFFFD)) {\n this.fail(\"disallowed character.\");\n }\n return code;\n }\n const final = 0x10000 + ((code - 0xD800) * 0x400) +\n (chunk.charCodeAt(i + 1) - 0xDC00);\n this.i = i + 2;\n // This is a specialized version of isChar10 that takes into account that in\n // this context necessarily final >= 0x10000.\n if (final > 0x10FFFF) {\n this.fail(\"disallowed character.\");\n }\n return final;\n }\n /**\n * Get a single code point out of the current chunk. This updates the current\n * position if we do position tracking.\n *\n * This is the algorithm to use for XML 1.1.\n *\n * @returns {number} The character read.\n */\n getCode11() {\n const { chunk, i } = this;\n this.prevI = i;\n // Yes, we do this instead of doing this.i++. Doing it this way, we do not\n // read this.i again, which is a bit faster.\n this.i = i + 1;\n if (i >= chunk.length) {\n return EOC;\n }\n // Using charCodeAt and handling the surrogates ourselves is faster\n // than using codePointAt.\n const code = chunk.charCodeAt(i);\n this.column++;\n if (code < 0xD800) {\n if ((code > 0x1F && code < 0x7F) || (code > 0x9F && code !== LS) ||\n code === TAB) {\n return code;\n }\n switch (code) {\n case NL: // 0xA\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n return NL;\n case CR: { // 0xD\n // We may get NaN if we read past the end of the chunk, which is\n // fine.\n const next = chunk.charCodeAt(i + 1);\n if (next === NL || next === NEL) {\n // A CR NL or CR NEL sequence is converted to NL so we have to skip\n // over the next character. We already know it has a size of 1.\n this.i = i + 2;\n }\n // Otherwise, a CR is just converted to NL, no skip.\n }\n /* yes, fall through */\n case NEL: // 0x85\n case LS: // Ox2028\n this.line++;\n this.column = 0;\n this.positionAtNewLine = this.position;\n return NL_LIKE;\n default:\n this.fail(\"disallowed character.\");\n return code;\n }\n }\n if (code > 0xDBFF) {\n // This is a specialized version of isCharAndNotRestricted that takes into\n // account that in this context code > 0xDBFF and code <= 0xFFFF. So it\n // does not test cases that don't need testing.\n if (!(code >= 0xE000 && code <= 0xFFFD)) {\n this.fail(\"disallowed character.\");\n }\n return code;\n }\n const final = 0x10000 + ((code - 0xD800) * 0x400) +\n (chunk.charCodeAt(i + 1) - 0xDC00);\n this.i = i + 2;\n // This is a specialized version of isCharAndNotRestricted that takes into\n // account that in this context necessarily final >= 0x10000.\n if (final > 0x10FFFF) {\n this.fail(\"disallowed character.\");\n }\n return final;\n }\n /**\n * Like ``getCode`` but with the return value normalized so that ``NL`` is\n * returned for ``NL_LIKE``.\n */\n getCodeNorm() {\n const c = this.getCode();\n return c === NL_LIKE ? NL : c;\n }\n unget() {\n this.i = this.prevI;\n this.column--;\n }\n /**\n * Capture characters into a buffer until encountering one of a set of\n * characters.\n *\n * @param chars An array of codepoints. Encountering a character in the array\n * ends the capture. (``chars`` may safely contain ``NL``.)\n *\n * @return The character code that made the capture end, or ``EOC`` if we hit\n * the end of the chunk. The return value cannot be NL_LIKE: NL is returned\n * instead.\n */\n captureTo(chars) {\n let { i: start } = this;\n const { chunk } = this;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = this.getCode();\n const isNLLike = c === NL_LIKE;\n const final = isNLLike ? NL : c;\n if (final === EOC || chars.includes(final)) {\n this.text += chunk.slice(start, this.prevI);\n return final;\n }\n if (isNLLike) {\n this.text += `${chunk.slice(start, this.prevI)}\\n`;\n start = this.i;\n }\n }\n }\n /**\n * Capture characters into a buffer until encountering a character.\n *\n * @param char The codepoint that ends the capture. **NOTE ``char`` MAY NOT\n * CONTAIN ``NL``.** Passing ``NL`` will result in buggy behavior.\n *\n * @return ``true`` if we ran into the character. Otherwise, we ran into the\n * end of the current chunk.\n */\n captureToChar(char) {\n let { i: start } = this;\n const { chunk } = this;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let c = this.getCode();\n switch (c) {\n case NL_LIKE:\n this.text += `${chunk.slice(start, this.prevI)}\\n`;\n start = this.i;\n c = NL;\n break;\n case EOC:\n this.text += chunk.slice(start);\n return false;\n default:\n }\n if (c === char) {\n this.text += chunk.slice(start, this.prevI);\n return true;\n }\n }\n }\n /**\n * Capture characters that satisfy ``isNameChar`` into the ``name`` field of\n * this parser.\n *\n * @return The character code that made the test fail, or ``EOC`` if we hit\n * the end of the chunk. The return value cannot be NL_LIKE: NL is returned\n * instead.\n */\n captureNameChars() {\n const { chunk, i: start } = this;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = this.getCode();\n if (c === EOC) {\n this.name += chunk.slice(start);\n return EOC;\n }\n // NL is not a name char so we don't have to test specifically for it.\n if (!isNameChar(c)) {\n this.name += chunk.slice(start, this.prevI);\n return c === NL_LIKE ? NL : c;\n }\n }\n }\n /**\n * Skip white spaces.\n *\n * @return The character that ended the skip, or ``EOC`` if we hit\n * the end of the chunk. The return value cannot be NL_LIKE: NL is returned\n * instead.\n */\n skipSpaces() {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = this.getCodeNorm();\n if (c === EOC || !isS(c)) {\n return c;\n }\n }\n }\n setXMLVersion(version) {\n this.currentXMLVersion = version;\n /* eslint-disable @typescript-eslint/unbound-method */\n if (version === \"1.0\") {\n this.isChar = isChar10;\n this.getCode = this.getCode10;\n }\n else {\n this.isChar = isChar11;\n this.getCode = this.getCode11;\n }\n /* eslint-enable @typescript-eslint/unbound-method */\n }\n // STATE ENGINE METHODS\n // This needs to be a state separate from S_BEGIN_WHITESPACE because we want\n // to be sure never to come back to this state later.\n sBegin() {\n // We are essentially peeking at the first character of the chunk. Since\n // S_BEGIN can be in effect only when we start working on the first chunk,\n // the index at which we must look is necessarily 0. Note also that the\n // following test does not depend on decoding surrogates.\n // If the initial character is 0xFEFF, ignore it.\n if (this.chunk.charCodeAt(0) === 0xFEFF) {\n this.i++;\n this.column++;\n }\n this.state = S_BEGIN_WHITESPACE;\n }\n sBeginWhitespace() {\n // We need to know whether we've encountered spaces or not because as soon\n // as we run into a space, an XML declaration is no longer possible. Rather\n // than slow down skipSpaces even in places where we don't care whether it\n // skipped anything or not, we check whether prevI is equal to the value of\n // i from before we skip spaces.\n const iBefore = this.i;\n const c = this.skipSpaces();\n if (this.prevI !== iBefore) {\n this.xmlDeclPossible = false;\n }\n switch (c) {\n case LESS:\n this.state = S_OPEN_WAKA;\n // We could naively call closeText but in this state, it is not normal\n // to have text be filled with any data.\n if (this.text.length !== 0) {\n throw new Error(\"no-empty text at start\");\n }\n break;\n case EOC:\n break;\n default:\n this.unget();\n this.state = S_TEXT;\n this.xmlDeclPossible = false;\n }\n }\n sDoctype() {\n var _a;\n const c = this.captureTo(DOCTYPE_TERMINATOR);\n switch (c) {\n case GREATER: {\n (_a = this.doctypeHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.text);\n this.text = \"\";\n this.state = S_TEXT;\n this.doctype = true; // just remember that we saw it.\n break;\n }\n case EOC:\n break;\n default:\n this.text += String.fromCodePoint(c);\n if (c === OPEN_BRACKET) {\n this.state = S_DTD;\n }\n else if (isQuote(c)) {\n this.state = S_DOCTYPE_QUOTE;\n this.q = c;\n }\n }\n }\n sDoctypeQuote() {\n const q = this.q;\n if (this.captureToChar(q)) {\n this.text += String.fromCodePoint(q);\n this.q = null;\n this.state = S_DOCTYPE;\n }\n }\n sDTD() {\n const c = this.captureTo(DTD_TERMINATOR);\n if (c === EOC) {\n return;\n }\n this.text += String.fromCodePoint(c);\n if (c === CLOSE_BRACKET) {\n this.state = S_DOCTYPE;\n }\n else if (c === LESS) {\n this.state = S_DTD_OPEN_WAKA;\n }\n else if (isQuote(c)) {\n this.state = S_DTD_QUOTED;\n this.q = c;\n }\n }\n sDTDQuoted() {\n const q = this.q;\n if (this.captureToChar(q)) {\n this.text += String.fromCodePoint(q);\n this.state = S_DTD;\n this.q = null;\n }\n }\n sDTDOpenWaka() {\n const c = this.getCodeNorm();\n this.text += String.fromCodePoint(c);\n switch (c) {\n case BANG:\n this.state = S_DTD_OPEN_WAKA_BANG;\n this.openWakaBang = \"\";\n break;\n case QUESTION:\n this.state = S_DTD_PI;\n break;\n default:\n this.state = S_DTD;\n }\n }\n sDTDOpenWakaBang() {\n const char = String.fromCodePoint(this.getCodeNorm());\n const owb = this.openWakaBang += char;\n this.text += char;\n if (owb !== \"-\") {\n this.state = owb === \"--\" ? S_DTD_COMMENT : S_DTD;\n this.openWakaBang = \"\";\n }\n }\n sDTDComment() {\n if (this.captureToChar(MINUS)) {\n this.text += \"-\";\n this.state = S_DTD_COMMENT_ENDING;\n }\n }\n sDTDCommentEnding() {\n const c = this.getCodeNorm();\n this.text += String.fromCodePoint(c);\n this.state = c === MINUS ? S_DTD_COMMENT_ENDED : S_DTD_COMMENT;\n }\n sDTDCommentEnded() {\n const c = this.getCodeNorm();\n this.text += String.fromCodePoint(c);\n if (c === GREATER) {\n this.state = S_DTD;\n }\n else {\n this.fail(\"malformed comment.\");\n // <!-- blah -- bloo --> will be recorded as\n // a comment of \" blah -- bloo \"\n this.state = S_DTD_COMMENT;\n }\n }\n sDTDPI() {\n if (this.captureToChar(QUESTION)) {\n this.text += \"?\";\n this.state = S_DTD_PI_ENDING;\n }\n }\n sDTDPIEnding() {\n const c = this.getCodeNorm();\n this.text += String.fromCodePoint(c);\n if (c === GREATER) {\n this.state = S_DTD;\n }\n }\n sText() {\n //\n // We did try a version of saxes where the S_TEXT state was split in two\n // states: one for text inside the root element, and one for text\n // outside. This was avoiding having to test this.tags.length to decide\n // what implementation to actually use.\n //\n // Peformance testing on gigabyte-size files did not show any advantage to\n // using the two states solution instead of the current one. Conversely, it\n // made the code a bit more complicated elsewhere. For instance, a comment\n // can appear before the root element so when a comment ended it was\n // necessary to determine whether to return to the S_TEXT state or to the\n // new text-outside-root state.\n //\n if (this.tags.length !== 0) {\n this.handleTextInRoot();\n }\n else {\n this.handleTextOutsideRoot();\n }\n }\n sEntity() {\n // This is essentially a specialized version of captureToChar(SEMICOLON...)\n let { i: start } = this;\n const { chunk } = this;\n // eslint-disable-next-line no-labels, no-restricted-syntax\n loop: \n // eslint-disable-next-line no-constant-condition\n while (true) {\n switch (this.getCode()) {\n case NL_LIKE:\n this.entity += `${chunk.slice(start, this.prevI)}\\n`;\n start = this.i;\n break;\n case SEMICOLON: {\n const { entityReturnState } = this;\n const entity = this.entity + chunk.slice(start, this.prevI);\n this.state = entityReturnState;\n let parsed;\n if (entity === \"\") {\n this.fail(\"empty entity name.\");\n parsed = \"&;\";\n }\n else {\n parsed = this.parseEntity(entity);\n this.entity = \"\";\n }\n if (entityReturnState !== S_TEXT || this.textHandler !== undefined) {\n this.text += parsed;\n }\n // eslint-disable-next-line no-labels\n break loop;\n }\n case EOC:\n this.entity += chunk.slice(start);\n // eslint-disable-next-line no-labels\n break loop;\n default:\n }\n }\n }\n sOpenWaka() {\n // Reminder: a state handler is called with at least one character\n // available in the current chunk. So the first call to get code inside of\n // a state handler cannot return ``EOC``. That's why we don't test\n // for it.\n const c = this.getCode();\n // either a /, ?, !, or text is coming next.\n if (isNameStartChar(c)) {\n this.state = S_OPEN_TAG;\n this.unget();\n this.xmlDeclPossible = false;\n }\n else {\n switch (c) {\n case FORWARD_SLASH:\n this.state = S_CLOSE_TAG;\n this.xmlDeclPossible = false;\n break;\n case BANG:\n this.state = S_OPEN_WAKA_BANG;\n this.openWakaBang = \"\";\n this.xmlDeclPossible = false;\n break;\n case QUESTION:\n this.state = S_PI_FIRST_CHAR;\n break;\n default:\n this.fail(\"disallowed character in tag name\");\n this.state = S_TEXT;\n this.xmlDeclPossible = false;\n }\n }\n }\n sOpenWakaBang() {\n this.openWakaBang += String.fromCodePoint(this.getCodeNorm());\n switch (this.openWakaBang) {\n case \"[CDATA[\":\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 this.state = S_CDATA;\n this.openWakaBang = \"\";\n break;\n case \"--\":\n this.state = S_COMMENT;\n this.openWakaBang = \"\";\n break;\n case \"DOCTYPE\":\n this.state = S_DOCTYPE;\n if (this.doctype || this.sawRoot) {\n this.fail(\"inappropriately located doctype declaration.\");\n }\n this.openWakaBang = \"\";\n break;\n default:\n // 7 happens to be the maximum length of the string that can possibly\n // match one of the cases above.\n if (this.openWakaBang.length >= 7) {\n this.fail(\"incorrect syntax.\");\n }\n }\n }\n sComment() {\n if (this.captureToChar(MINUS)) {\n this.state = S_COMMENT_ENDING;\n }\n }\n sCommentEnding() {\n var _a;\n const c = this.getCodeNorm();\n if (c === MINUS) {\n this.state = S_COMMENT_ENDED;\n (_a = this.commentHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.text);\n this.text = \"\";\n }\n else {\n this.text += `-${String.fromCodePoint(c)}`;\n this.state = S_COMMENT;\n }\n }\n sCommentEnded() {\n const c = this.getCodeNorm();\n if (c !== GREATER) {\n this.fail(\"malformed comment.\");\n // <!-- blah -- bloo --> will be recorded as\n // a comment of \" blah -- bloo \"\n this.text += `--${String.fromCodePoint(c)}`;\n this.state = S_COMMENT;\n }\n else {\n this.state = S_TEXT;\n }\n }\n sCData() {\n if (this.captureToChar(CLOSE_BRACKET)) {\n this.state = S_CDATA_ENDING;\n }\n }\n sCDataEnding() {\n const c = this.getCodeNorm();\n if (c === CLOSE_BRACKET) {\n this.state = S_CDATA_ENDING_2;\n }\n else {\n this.text += `]${String.fromCodePoint(c)}`;\n this.state = S_CDATA;\n }\n }\n sCDataEnding2() {\n var _a;\n const c = this.getCodeNorm();\n switch (c) {\n case GREATER: {\n (_a = this.cdataHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.text);\n this.text = \"\";\n this.state = S_TEXT;\n break;\n }\n case CLOSE_BRACKET:\n this.text += \"]\";\n break;\n default:\n this.text += `]]${String.fromCodePoint(c)}`;\n this.state = S_CDATA;\n }\n }\n // We need this separate state to check the first character fo the pi target\n // with this.nameStartCheck which allows less characters than this.nameCheck.\n sPIFirstChar() {\n const c = this.getCodeNorm();\n // This is first because in the case where the file is well-formed this is\n // the branch taken. We optimize for well-formedness.\n if (this.nameStartCheck(c)) {\n this.piTarget += String.fromCodePoint(c);\n this.state = S_PI_REST;\n }\n else if (c === QUESTION || isS(c)) {\n this.fail(\"processing instruction without a target.\");\n this.state = c === QUESTION ? S_PI_ENDING : S_PI_BODY;\n }\n else {\n this.fail(\"disallowed character in processing instruction name.\");\n this.piTarget += String.fromCodePoint(c);\n this.state = S_PI_REST;\n }\n }\n sPIRest() {\n // Capture characters into a piTarget while ``this.nameCheck`` run on the\n // character read returns true.\n const { chunk, i: start } = this;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = this.getCodeNorm();\n if (c === EOC) {\n this.piTarget += chunk.slice(start);\n return;\n }\n // NL cannot satisfy this.nameCheck so we don't have to test specifically\n // for it.\n if (!this.nameCheck(c)) {\n this.piTarget += chunk.slice(start, this.prevI);\n const isQuestion = c === QUESTION;\n if (isQuestion || isS(c)) {\n if (this.piTarget === \"xml\") {\n if (!this.xmlDeclPossible) {\n this.fail(\"an XML declaration must be at the start of the document.\");\n }\n this.state = isQuestion ? S_XML_DECL_ENDING : S_XML_DECL_NAME_START;\n }\n else {\n this.state = isQuestion ? S_PI_ENDING : S_PI_BODY;\n }\n }\n else {\n this.fail(\"disallowed character in processing instruction name.\");\n this.piTarget += String.fromCodePoint(c);\n }\n break;\n }\n }\n }\n sPIBody() {\n if (this.text.length === 0) {\n const c = this.getCodeNorm();\n if (c === QUESTION) {\n this.state = S_PI_ENDING;\n }\n else if (!isS(c)) {\n this.text = String.fromCodePoint(c);\n }\n }\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n else if (this.captureToChar(QUESTION)) {\n this.state = S_PI_ENDING;\n }\n }\n sPIEnding() {\n var _a;\n const c = this.getCodeNorm();\n if (c === GREATER) {\n const { piTarget } = this;\n if (piTarget.toLowerCase() === \"xml\") {\n this.fail(\"the XML declaration must appear at the start of the document.\");\n }\n (_a = this.piHandler) === null || _a === void 0 ? void 0 : _a.call(this, {\n target: piTarget,\n body: this.text,\n });\n this.piTarget = this.text = \"\";\n this.state = S_TEXT;\n }\n else if (c === QUESTION) {\n // We ran into ?? as part of a processing instruction. We initially took\n // the first ? as a sign that the PI was ending, but it is not. So we have\n // to add it to the body but we take the new ? as a sign that the PI is\n // ending.\n this.text += \"?\";\n }\n else {\n this.text += `?${String.fromCodePoint(c)}`;\n this.state = S_PI_BODY;\n }\n this.xmlDeclPossible = false;\n }\n sXMLDeclNameStart() {\n const c = this.skipSpaces();\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n // It is valid to go to S_XML_DECL_ENDING from this state.\n this.state = S_XML_DECL_ENDING;\n return;\n }\n if (c !== EOC) {\n this.state = S_XML_DECL_NAME;\n this.name = String.fromCodePoint(c);\n }\n }\n sXMLDeclName() {\n const c = this.captureTo(XML_DECL_NAME_TERMINATOR);\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n this.state = S_XML_DECL_ENDING;\n this.name += this.text;\n this.text = \"\";\n this.fail(\"XML declaration is incomplete.\");\n return;\n }\n if (!(isS(c) || c === EQUAL)) {\n return;\n }\n this.name += this.text;\n this.text = \"\";\n if (!this.xmlDeclExpects.includes(this.name)) {\n switch (this.name.length) {\n case 0:\n this.fail(\"did not expect any more name/value pairs.\");\n break;\n case 1:\n this.fail(`expected the name ${this.xmlDeclExpects[0]}.`);\n break;\n default:\n this.fail(`expected one of ${this.xmlDeclExpects.join(\", \")}`);\n }\n }\n this.state = c === EQUAL ? S_XML_DECL_VALUE_START : S_XML_DECL_EQ;\n }\n sXMLDeclEq() {\n const c = this.getCodeNorm();\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n this.state = S_XML_DECL_ENDING;\n this.fail(\"XML declaration is incomplete.\");\n return;\n }\n if (isS(c)) {\n return;\n }\n if (c !== EQUAL) {\n this.fail(\"value required.\");\n }\n this.state = S_XML_DECL_VALUE_START;\n }\n sXMLDeclValueStart() {\n const c = this.getCodeNorm();\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n this.state = S_XML_DECL_ENDING;\n this.fail(\"XML declaration is incomplete.\");\n return;\n }\n if (isS(c)) {\n return;\n }\n if (!isQuote(c)) {\n this.fail(\"value must be quoted.\");\n this.q = SPACE;\n }\n else {\n this.q = c;\n }\n this.state = S_XML_DECL_VALUE;\n }\n sXMLDeclValue() {\n const c = this.captureTo([this.q, QUESTION]);\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n this.state = S_XML_DECL_ENDING;\n this.text = \"\";\n this.fail(\"XML declaration is incomplete.\");\n return;\n }\n if (c === EOC) {\n return;\n }\n const value = this.text;\n this.text = \"\";\n switch (this.name) {\n case \"version\": {\n this.xmlDeclExpects = [\"encoding\", \"standalone\"];\n const version = value;\n this.xmlDecl.version = version;\n // This is the test specified by XML 1.0 but it is fine for XML 1.1.\n if (!/^1\\.[0-9]+$/.test(version)) {\n this.fail(\"version number must match /^1\\\\.[0-9]+$/.\");\n }\n // When forceXMLVersion is set, the XML declaration is ignored.\n else if (!this.opt.forceXMLVersion) {\n this.setXMLVersion(version);\n }\n break;\n }\n case \"encoding\":\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(value)) {\n this.fail(\"encoding value must match \\\n/^[A-Za-z0-9][A-Za-z0-9._-]*$/.\");\n }\n this.xmlDeclExpects = [\"standalone\"];\n this.xmlDecl.encoding = value;\n break;\n case \"standalone\":\n if (value !== \"yes\" && value !== \"no\") {\n this.fail(\"standalone value must match \\\"yes\\\" or \\\"no\\\".\");\n }\n this.xmlDeclExpects = [];\n this.xmlDecl.standalone = value;\n break;\n default:\n // We don't need to raise an error here since we've already raised one\n // when checking what name was expected.\n }\n this.name = \"\";\n this.state = S_XML_DECL_SEPARATOR;\n }\n sXMLDeclSeparator() {\n const c = this.getCodeNorm();\n // The question mark character is not valid inside any of the XML\n // declaration name/value pairs.\n if (c === QUESTION) {\n // It is valid to go to S_XML_DECL_ENDING from this state.\n this.state = S_XML_DECL_ENDING;\n return;\n }\n if (!isS(c)) {\n this.fail(\"whitespace required.\");\n this.unget();\n }\n this.state = S_XML_DECL_NAME_START;\n }\n sXMLDeclEnding() {\n var _a;\n const c = this.getCodeNorm();\n if (c === GREATER) {\n if (this.piTarget !== \"xml\") {\n this.fail(\"processing instructions are not allowed before root.\");\n }\n else if (this.name !== \"version\" &&\n this.xmlDeclExpects.includes(\"version\")) {\n this.fail(\"XML declaration must contain a version.\");\n }\n (_a = this.xmldeclHandler) === null || _a === void 0 ? void 0 : _a.call(this, this.xmlDecl);\n this.name = \"\";\n this.piTarget = this.text = \"\";\n this.state = S_TEXT;\n }\n else {\n // We got here because the previous character was a ?, but the question\n // mark character is not valid inside any of the XML declaration\n // name/value pairs.\n this.fail(\"The character ? is disallowed anywhere in XML declarations.\");\n }\n this.xmlDeclPossible = false;\n }\n sOpenTag() {\n var _a;\n const c = this.captureNameChars();\n if (c === EOC) {\n return;\n }\n const tag = this.tag = {\n name: this.name,\n attributes: Object.create(null),\n };\n this.name = \"\";\n if (this.xmlnsOpt) {\n this.topNS = tag.ns = Object.create(null);\n }\n (_a = this.openTagStartHandler) === null || _a === void 0 ? void 0 : _a.call(this, tag);\n this.sawRoot = true;\n if (!this.fragmentOpt && this.closedRoot) {\n this.fail(\"documents may contain only one root.\");\n }\n switch (c) {\n case GREATER:\n this.openTag();\n break;\n case FORWARD_SLASH:\n this.state = S_OPEN_TAG_SLASH;\n break;\n default:\n if (!isS(c)) {\n this.fail(\"disallowed character in tag name.\");\n }\n this.state = S_ATTRIB;\n }\n }\n sOpenTagSlash() {\n if (this.getCode() === GREATER) {\n this.openSelfClosingTag();\n }\n else {\n this.fail(\"forward-slash in opening tag not followed by >.\");\n this.state = S_ATTRIB;\n }\n }\n sAttrib() {\n const c = this.skipSpaces();\n if (c === EOC) {\n return;\n }\n if (isNameStartChar(c)) {\n this.unget();\n this.state = S_ATTRIB_NAME;\n }\n else if (c === GREATER) {\n this.openTag();\n }\n else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n }\n else {\n this.fail(\"disallowed character in attribute name.\");\n }\n }\n sAttribName() {\n const c = this.captureNameChars();\n if (c === EQUAL) {\n this.state = S_ATTRIB_VALUE;\n }\n else if (isS(c)) {\n this.state = S_ATTRIB_NAME_SAW_WHITE;\n }\n else if (c === GREATER) {\n this.fail(\"attribute without value.\");\n this.pushAttrib(this.name, this.name);\n this.name = this.text = \"\";\n this.openTag();\n }\n else if (c !== EOC) {\n this.fail(\"disallowed character in attribute name.\");\n }\n }\n sAttribNameSawWhite() {\n const c = this.skipSpaces();\n switch (c) {\n case EOC:\n return;\n case EQUAL:\n this.state = S_ATTRIB_VALUE;\n break;\n default:\n this.fail(\"attribute without value.\");\n // Should we do this???\n // this.tag.attributes[this.name] = \"\";\n this.text = \"\";\n this.name = \"\";\n if (c === GREATER) {\n this.openTag();\n }\n else if (isNameStartChar(c)) {\n this.unget();\n this.state = S_ATTRIB_NAME;\n }\n else {\n this.fail(\"disallowed character in attribute name.\");\n this.state = S_ATTRIB;\n }\n }\n }\n sAttribValue() {\n const c = this.getCodeNorm();\n if (isQuote(c)) {\n this.q = c;\n this.state = S_ATTRIB_VALUE_QUOTED;\n }\n else if (!isS(c)) {\n this.fail(\"unquoted attribute value.\");\n this.state = S_ATTRIB_VALUE_UNQUOTED;\n this.unget();\n }\n }\n sAttribValueQuoted() {\n // We deliberately do not use captureTo here. The specialized code we use\n // here is faster than using captureTo.\n const { q, chunk } = this;\n let { i: start } = this;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n switch (this.getCode()) {\n case q:\n this.pushAttrib(this.name, this.text + chunk.slice(start, this.prevI));\n this.name = this.text = \"\";\n this.q = null;\n this.state = S_ATTRIB_VALUE_CLOSED;\n return;\n case AMP:\n this.text += chunk.slice(start, this.prevI);\n this.state = S_ENTITY;\n this.entityReturnState = S_ATTRIB_VALUE_QUOTED;\n return;\n case NL:\n case NL_LIKE:\n case TAB:\n this.text += `${chunk.slice(start, this.prevI)} `;\n start = this.i;\n break;\n case LESS:\n this.text += chunk.slice(start, this.prevI);\n this.fail(\"disallowed character.\");\n return;\n case EOC:\n this.text += chunk.slice(start);\n return;\n default:\n }\n }\n }\n sAttribValueClosed() {\n const c = this.getCodeNorm();\n if (isS(c)) {\n this.state = S_ATTRIB;\n }\n else if (c === GREATER) {\n this.openTag();\n }\n else if (c === FORWARD_SLASH) {\n this.state = S_OPEN_TAG_SLASH;\n }\n else if (isNameStartChar(c)) {\n this.fail(\"no whitespace between attributes.\");\n this.unget();\n this.state = S_ATTRIB_NAME;\n }\n else {\n this.fail(\"disallowed character in attribute name.\");\n }\n }\n sAttribValueUnquoted() {\n // We don't do anything regarding EOL or space handling for unquoted\n // attributes. We already have failed by the time we get here, and the\n // contract that saxes upholds states that upon failure, it is not safe to\n // rely on the data passed to event handlers (other than\n // ``onerror``). Passing \"bad\" data is not a problem.\n const c = this.captureTo(ATTRIB_VALUE_UNQUOTED_TERMINATOR);\n switch (c) {\n case AMP:\n this.state = S_ENTITY;\n this.entityReturnState = S_ATTRIB_VALUE_UNQUOTED;\n break;\n case LESS:\n this.fail(\"disallowed character.\");\n break;\n case EOC:\n break;\n default:\n if (this.text.includes(\"]]>\")) {\n this.fail(\"the string \\\"]]>\\\" is disallowed in char data.\");\n }\n this.pushAttrib(this.name, this.text);\n this.name = this.text = \"\";\n if (c === GREATER) {\n this.openTag();\n }\n else {\n this.state = S_ATTRIB;\n }\n }\n }\n sCloseTag() {\n const c = this.captureNameChars();\n if (c === GREATER) {\n this.closeTag();\n }\n else if (isS(c)) {\n this.state = S_CLOSE_TAG_SAW_WHITE;\n }\n else if (c !== EOC) {\n this.fail(\"disallowed character in closing tag.\");\n }\n }\n sCloseTagSawWhite() {\n switch (this.skipSpaces()) {\n case GREATER:\n this.closeTag();\n break;\n case EOC:\n break;\n default:\n this.fail(\"disallowed character in closing tag.\");\n }\n }\n // END OF STATE ENGINE METHODS\n handleTextInRoot() {\n // This is essentially a specialized version of captureTo which is optimized\n // for performing the ]]> check. A previous version of this code, checked\n // ``this.text`` for the presence of ]]>. It simplified the code but was\n // very costly when character data contained a lot of entities to be parsed.\n //\n // Since we are using a specialized loop, we also keep track of the presence\n // of ]]> in text data. The sequence ]]> is forbidden to appear as-is.\n //\n let { i: start, forbiddenState } = this;\n const { chunk, textHandler: handler } = this;\n // eslint-disable-next-line no-labels, no-restricted-syntax\n scanLoop: \n // eslint-disable-next-line no-constant-condition\n while (true) {\n switch (this.getCode()) {\n case LESS: {\n this.state = S_OPEN_WAKA;\n if (handler !== undefined) {\n const { text } = this;\n const slice = chunk.slice(start, this.prevI);\n if (text.length !== 0) {\n handler(text + slice);\n this.text = \"\";\n }\n else if (slice.length !== 0) {\n handler(slice);\n }\n }\n forbiddenState = FORBIDDEN_START;\n // eslint-disable-next-line no-labels\n break scanLoop;\n }\n case AMP:\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n if (handler !== undefined) {\n this.text += chunk.slice(start, this.prevI);\n }\n forbiddenState = FORBIDDEN_START;\n // eslint-disable-next-line no-labels\n break scanLoop;\n case CLOSE_BRACKET:\n switch (forbiddenState) {\n case FORBIDDEN_START:\n forbiddenState = FORBIDDEN_BRACKET;\n break;\n case FORBIDDEN_BRACKET:\n forbiddenState = FORBIDDEN_BRACKET_BRACKET;\n break;\n case FORBIDDEN_BRACKET_BRACKET:\n break;\n default:\n throw new Error(\"impossible state\");\n }\n break;\n case GREATER:\n if (forbiddenState === FORBIDDEN_BRACKET_BRACKET) {\n this.fail(\"the string \\\"]]>\\\" is disallowed in char data.\");\n }\n forbiddenState = FORBIDDEN_START;\n break;\n case NL_LIKE:\n if (handler !== undefined) {\n this.text += `${chunk.slice(start, this.prevI)}\\n`;\n }\n start = this.i;\n forbiddenState = FORBIDDEN_START;\n break;\n case EOC:\n if (handler !== undefined) {\n this.text += chunk.slice(start);\n }\n // eslint-disable-next-line no-labels\n break scanLoop;\n default:\n forbiddenState = FORBIDDEN_START;\n }\n }\n this.forbiddenState = forbiddenState;\n }\n handleTextOutsideRoot() {\n // This is essentially a specialized version of captureTo which is optimized\n // for a specialized task. We keep track of the presence of non-space\n // characters in the text since these are errors when appearing outside the\n // document root element.\n let { i: start } = this;\n const { chunk, textHandler: handler } = this;\n let nonSpace = false;\n // eslint-disable-next-line no-labels, no-restricted-syntax\n outRootLoop: \n // eslint-disable-next-line no-constant-condition\n while (true) {\n const code = this.getCode();\n switch (code) {\n case LESS: {\n this.state = S_OPEN_WAKA;\n if (handler !== undefined) {\n const { text } = this;\n const slice = chunk.slice(start, this.prevI);\n if (text.length !== 0) {\n handler(text + slice);\n this.text = \"\";\n }\n else if (slice.length !== 0) {\n handler(slice);\n }\n }\n // eslint-disable-next-line no-labels\n break outRootLoop;\n }\n case AMP:\n this.state = S_ENTITY;\n this.entityReturnState = S_TEXT;\n if (handler !== undefined) {\n this.text += chunk.slice(start, this.prevI);\n }\n nonSpace = true;\n // eslint-disable-next-line no-labels\n break outRootLoop;\n case NL_LIKE:\n if (handler !== undefined) {\n this.text += `${chunk.slice(start, this.prevI)}\\n`;\n }\n start = this.i;\n break;\n case EOC:\n if (handler !== undefined) {\n this.text += chunk.slice(start);\n }\n // eslint-disable-next-line no-labels\n break outRootLoop;\n default:\n if (!isS(code)) {\n nonSpace = true;\n }\n }\n }\n if (!nonSpace) {\n return;\n }\n // We use the reportedTextBeforeRoot and reportedTextAfterRoot flags\n // to avoid reporting errors for every single character that is out of\n // place.\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 pushAttribNS(name, value) {\n var _a;\n const { prefix, local } = this.qname(name);\n const attr = { name, prefix, local, value };\n this.attribList.push(attr);\n (_a = this.attributeHandler) === null || _a === void 0 ? void 0 : _a.call(this, attr);\n if (prefix === \"xmlns\") {\n const trimmed = value.trim();\n if (this.currentXMLVersion === \"1.0\" && trimmed === \"\") {\n this.fail(\"invalid attempt to undefine prefix in XML 1.0\");\n }\n this.topNS[local] = trimmed;\n nsPairCheck(this, local, trimmed);\n }\n else if (name === \"xmlns\") {\n const trimmed = value.trim();\n this.topNS[\"\"] = trimmed;\n nsPairCheck(this, \"\", trimmed);\n }\n }\n pushAttribPlain(name, value) {\n var _a;\n const attr = { name, value };\n this.attribList.push(attr);\n (_a = this.attributeHandler) === null || _a === void 0 ? void 0 : _a.call(this, attr);\n }\n /**\n * End parsing. This performs final well-formedness checks and resets the\n * parser to a clean state.\n *\n * @returns this\n */\n end() {\n var _a, _b;\n if (!this.sawRoot) {\n this.fail(\"document must contain a root element.\");\n }\n const { tags } = this;\n while (tags.length > 0) {\n const tag = tags.pop();\n this.fail(`unclosed tag: ${tag.name}`);\n }\n if ((this.state !== S_BEGIN) && (this.state !== S_TEXT)) {\n this.fail(\"unexpected end.\");\n }\n const { text } = this;\n if (text.length !== 0) {\n (_a = this.textHandler) === null || _a === void 0 ? void 0 : _a.call(this, text);\n this.text = \"\";\n }\n this._closed = true;\n (_b = this.endHandler) === null || _b === void 0 ? void 0 : _b.call(this);\n this._init();\n return this;\n }\n /**\n * Resolve a namespace prefix.\n *\n * @param prefix The prefix to resolve.\n *\n * @returns The namespace URI or ``undefined`` if the prefix is not defined.\n */\n resolve(prefix) {\n var _a, _b;\n let uri = this.topNS[prefix];\n if (uri !== undefined) {\n return uri;\n }\n const { tags } = this;\n for (let index = tags.length - 1; index >= 0; index--) {\n uri = tags[index].ns[prefix];\n if (uri !== undefined) {\n return uri;\n }\n }\n uri = this.ns[prefix];\n if (uri !== undefined) {\n return uri;\n }\n return (_b = (_a = this.opt).resolvePrefix) === null || _b === void 0 ? void 0 : _b.call(_a, prefix);\n }\n /**\n * Parse a qname into its prefix and local name parts.\n *\n * @param name The name to parse\n *\n * @returns\n */\n qname(name) {\n // This is faster than using name.split(\":\").\n const colon = name.indexOf(\":\");\n if (colon === -1) {\n return { prefix: \"\", local: name };\n }\n const local = name.slice(colon + 1);\n const prefix = name.slice(0, colon);\n if (prefix === \"\" || local === \"\" || local.includes(\":\")) {\n this.fail(`malformed name: ${name}.`);\n }\n return { prefix, local };\n }\n processAttribsNS() {\n var _a;\n const { attribList } = this;\n const tag = this.tag;\n {\n // add namespace info to tag\n const { prefix, local } = this.qname(tag.name);\n tag.prefix = prefix;\n tag.local = local;\n const uri = tag.uri = (_a = this.resolve(prefix)) !== null && _a !== void 0 ? _a : \"\";\n if (prefix !== \"\") {\n if (prefix === \"xmlns\") {\n this.fail(\"tags may not have \\\"xmlns\\\" as prefix.\");\n }\n if (uri === \"\") {\n this.fail(`unbound namespace prefix: ${JSON.stringify(prefix)}.`);\n tag.uri = prefix;\n }\n }\n }\n if (attribList.length === 0) {\n return;\n }\n const { attributes } = tag;\n const seen = new Set();\n // Note: do not apply default ns to attributes:\n // http://www.w3.org/TR/REC-xml-names/#defaulting\n for (const attr of attribList) {\n const { name, prefix, local } = attr;\n let uri;\n let eqname;\n if (prefix === \"\") {\n uri = name === \"xmlns\" ? XMLNS_NAMESPACE : \"\";\n eqname = name;\n }\n else {\n uri = this.resolve(prefix);\n // if there's any attributes with an undefined namespace,\n // then fail on them now.\n if (uri === undefined) {\n this.fail(`unbound namespace prefix: ${JSON.stringify(prefix)}.`);\n uri = prefix;\n }\n eqname = `{${uri}}${local}`;\n }\n if (seen.has(eqname)) {\n this.fail(`duplicate attribute: ${eqname}.`);\n }\n seen.add(eqname);\n attr.uri = uri;\n attributes[name] = attr;\n }\n this.attribList = [];\n }\n processAttribsPlain() {\n const { attribList } = this;\n // eslint-disable-next-line prefer-destructuring\n const attributes = this.tag.attributes;\n for (const { name, value } of attribList) {\n if (attributes[name] !== undefined) {\n this.fail(`duplicate attribute: ${name}.`);\n }\n attributes[name] = value;\n }\n this.attribList = [];\n }\n /**\n * Handle a complete open tag. This parser code calls this once it has seen\n * the whole tag. This method checks for well-formeness and then emits\n * ``onopentag``.\n */\n openTag() {\n var _a;\n this.processAttribs();\n const { tags } = this;\n const tag = this.tag;\n tag.isSelfClosing = false;\n // There cannot be any pending text here due to the onopentagstart that was\n // necessarily emitted before we get here. So we do not check text.\n (_a = this.openTagHandler) === null || _a === void 0 ? void 0 : _a.call(this, tag);\n tags.push(tag);\n this.state = S_TEXT;\n this.name = \"\";\n }\n /**\n * Handle a complete self-closing tag. This parser code calls this once it has\n * seen the whole tag. This method checks for well-formeness and then emits\n * ``onopentag`` and ``onclosetag``.\n */\n openSelfClosingTag() {\n var _a, _b, _c;\n this.processAttribs();\n const { tags } = this;\n const tag = this.tag;\n tag.isSelfClosing = true;\n // There cannot be any pending text here due to the onopentagstart that was\n // necessarily emitted before we get here. So we do not check text.\n (_a = this.openTagHandler) === null || _a === void 0 ? void 0 : _a.call(this, tag);\n (_b = this.closeTagHandler) === null || _b === void 0 ? void 0 : _b.call(this, tag);\n const top = this.tag = (_c = tags[tags.length - 1]) !== null && _c !== void 0 ? _c : null;\n if (top === null) {\n this.closedRoot = true;\n }\n this.state = S_TEXT;\n this.name = \"\";\n }\n /**\n * Handle a complete close tag. This parser code calls this once it has seen\n * the whole tag. This method checks for well-formeness and then emits\n * ``onclosetag``.\n */\n closeTag() {\n const { tags, name } = this;\n // Our state after this will be S_TEXT, no matter what, and we can clear\n // tagName now.\n this.state = S_TEXT;\n this.name = \"\";\n if (name === \"\") {\n this.fail(\"weird empty close tag.\");\n this.text += \"</>\";\n return;\n }\n const handler = this.closeTagHandler;\n let l = tags.length;\n while (l-- > 0) {\n const tag = this.tag = tags.pop();\n this.topNS = tag.ns;\n handler === null || handler === void 0 ? void 0 : handler(tag);\n if (tag.name === name) {\n break;\n }\n this.fail(\"unexpected close tag.\");\n }\n if (l === 0) {\n this.closedRoot = true;\n }\n else if (l < 0) {\n this.fail(`unmatched closing tag: ${name}.`);\n this.text += `</${name}>`;\n }\n }\n /**\n * Resolves an entity. Makes any necessary well-formedness checks.\n *\n * @param entity The entity to resolve.\n *\n * @returns The parsed entity.\n */\n parseEntity(entity) {\n // startsWith would be significantly slower for this test.\n if (entity[0] !== \"#\") {\n const defined = this.ENTITIES[entity];\n if (defined !== undefined) {\n return defined;\n }\n this.fail(this.isName(entity) ? \"undefined entity.\" :\n \"disallowed character in entity name.\");\n return `&${entity};`;\n }\n let num = NaN;\n if (entity[1] === \"x\" && /^#x[0-9a-f]+$/i.test(entity)) {\n num = parseInt(entity.slice(2), 16);\n }\n else if (/^#[0-9]+$/.test(entity)) {\n num = parseInt(entity.slice(1), 10);\n }\n // The character reference is required to match the CHAR production.\n if (!this.isChar(num)) {\n this.fail(\"malformed character entity.\");\n return `&${entity};`;\n }\n return String.fromCodePoint(num);\n }\n}\nexports.SaxesParser = SaxesParser;\n//# sourceMappingURL=saxes.js.map","import { SaxesParser } from \"saxes\";\nimport { bufferToString } from \"./utils\";\n\ninterface SaxEvent {\n eventType: \"opentag\" | \"text\" | \"closetag\";\n value: any;\n}\n\nasync function* parseSax(iterable: any): AsyncGenerator<SaxEvent[]> {\n const saxesParser = new SaxesParser({\n xmlns: false,\n defaultXMLVersion: \"1.0\"\n });\n let error: Error | undefined;\n saxesParser.on(\"error\", (err: Error) => {\n error = err;\n });\n let events: SaxEvent[] = [];\n saxesParser.on(\"opentag\", (value: any) => events.push({ eventType: \"opentag\", value }));\n saxesParser.on(\"text\", (value: any) => events.push({ eventType: \"text\", value }));\n saxesParser.on(\"closetag\", (value: any) => events.push({ eventType: \"closetag\", value }));\n for await (const chunk of iterable) {\n saxesParser.write(bufferToString(chunk));\n // saxesParser.write and saxesParser.on() are synchronous,\n // so we can only reach the below line once all events have been emitted\n if (error) {\n throw error;\n }\n // As a performance optimization, we gather all events instead of passing\n // them one by one, which would cause each event to go through the event queue\n yield events;\n 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\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 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 { PageBreaksXform };\n","import { PageBreaksXform } from \"./page-breaks-xform\";\nimport { ListXform } from \"../list-xform\";\n\nclass RowBreaksXform extends ListXform {\n constructor() {\n const options = {\n tag: \"rowBreaks\",\n count: true,\n childXform: new PageBreaksXform()\n };\n super(options);\n }\n\n // get tag() { return 'rowBreaks'; }\n\n render(xmlStream: any, model: any): void {\n if (model && model.length) {\n xmlStream.openNode(this.tag, this.$);\n if (this.count) {\n xmlStream.addAttribute(this.$count, model.length);\n xmlStream.addAttribute(\"manualBreakCount\", model.length);\n }\n\n const { childXform } = this;\n model.forEach((childModel: any) => {\n childXform.render(xmlStream, childModel);\n });\n\n xmlStream.closeNode();\n } else if (this.empty) {\n xmlStream.leafNode(this.tag);\n }\n }\n}\n\nexport { RowBreaksXform };\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 { 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 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.drawing.render(xmlStream, model.drawing); // Note: must be after rowBreaks\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 };\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 type { UnzipFile } from \"fflate\";\nimport { Unzip, UnzipInflate } from \"fflate\";\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 const allFiles: Record<string, Uint8Array> = {};\n\n await new Promise<void>((resolve, reject) => {\n let filesProcessed = 0;\n let zipEnded = false;\n let filesStarted = 0;\n\n const checkCompletion = () => {\n if (zipEnded && filesProcessed === filesStarted) {\n resolve();\n }\n };\n\n const unzipper = new Unzip((file: UnzipFile) => {\n filesStarted++;\n const fileChunks: Uint8Array[] = [];\n let totalLength = 0;\n\n file.ondata = (err, fileData, final) => {\n if (err) {\n reject(err);\n return;\n }\n if (fileData) {\n fileChunks.push(fileData);\n totalLength += fileData.length;\n }\n if (final) {\n if (fileChunks.length === 1) {\n allFiles[file.name] = fileChunks[0];\n } else if (fileChunks.length > 1) {\n const fullData = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of fileChunks) {\n fullData.set(chunk, offset);\n offset += chunk.length;\n }\n allFiles[file.name] = fullData;\n } else {\n allFiles[file.name] = new Uint8Array(0);\n }\n filesProcessed++;\n fileChunks.length = 0;\n checkCompletion();\n }\n };\n file.start();\n });\n\n unzipper.register(UnzipInflate);\n unzipper.push(buffer, true);\n zipEnded = true;\n checkCompletion();\n });\n\n return this.loadFromFiles(allFiles, 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","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","/**\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 * Compatible with fast-csv API for drop-in replacement.\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 - compatible with fast-csv\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) - same as fast-csv ignoreEmpty */\n skipEmptyLines?: boolean;\n /** Alias for skipEmptyLines for fast-csv compatibility */\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 - compatible with fast-csv\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\" for fast-csv compatibility) */\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 (matches fast-csv default behavior)\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 dayjs for format flexibility.\n */\n\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\nimport utc from \"dayjs/plugin/utc.js\";\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// Initialize dayjs plugins\ndayjs.extend(customParseFormat);\ndayjs.extend(utc);\n\n/**\n * CSV read options\n */\nexport interface CsvReadOptions {\n /** Date format strings to try when parsing (default: ISO formats) */\n dateFormats?: string[];\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: string[]) {\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 dt = dateFormats.reduce((matchingDate: dayjs.Dayjs | null, currentDateFormat: string) => {\n if (matchingDate) {\n return matchingDate;\n }\n const dayjsObj = dayjs(datum, currentDateFormat, true);\n if (dayjsObj.isValid()) {\n return dayjsObj;\n }\n return null;\n }, null);\n\n if (dt) {\n return new Date(dt.valueOf());\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 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 if (dateFormat) {\n return dateUTC ? dayjs.utc(value).format(dateFormat) : dayjs(value).format(dateFormat);\n }\n return dateUTC ? dayjs.utc(value).format() : dayjs(value).format();\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 = options.dateFormats || [\n \"YYYY-MM-DD[T]HH:mm:ssZ\",\n \"YYYY-MM-DD[T]HH:mm:ss\",\n \"MM-DD-YYYY\",\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","// 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"],"x_google_ignoreList":[23,32,33,34,35,160,161,162],"mappings":"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"}