@cj-tech-master/excelts 5.0.6 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/dist/browser/index.browser.d.ts +1 -1
  2. package/dist/browser/index.d.ts +1 -1
  3. package/dist/browser/modules/archive/unzip/stream.base.js +19 -19
  4. package/dist/browser/modules/archive/unzip/stream.browser.js +3 -3
  5. package/dist/browser/modules/csv/csv-core.js +6 -3
  6. package/dist/browser/modules/csv/csv.browser.js +2 -2
  7. package/dist/browser/modules/csv/csv.js +1 -1
  8. package/dist/browser/modules/excel/anchor.js +4 -4
  9. package/dist/browser/modules/excel/cell.js +5 -5
  10. package/dist/browser/modules/excel/column.js +4 -4
  11. package/dist/browser/modules/excel/defined-names.js +1 -1
  12. package/dist/browser/modules/excel/form-control.js +1 -1
  13. package/dist/browser/modules/excel/pivot-table.d.ts +168 -17
  14. package/dist/browser/modules/excel/pivot-table.js +278 -70
  15. package/dist/browser/modules/excel/row.js +4 -4
  16. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +4 -4
  17. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +4 -4
  18. package/dist/browser/modules/excel/stream/worksheet-reader.js +1 -1
  19. package/dist/browser/modules/excel/stream/worksheet-writer.js +4 -4
  20. package/dist/browser/modules/excel/table.js +2 -2
  21. package/dist/browser/modules/excel/types.d.ts +0 -4
  22. package/dist/browser/modules/excel/utils/cell-format.js +3 -3
  23. package/dist/browser/modules/excel/utils/shared-formula.js +1 -1
  24. package/dist/browser/modules/excel/utils/stream-buf.js +2 -2
  25. package/dist/browser/modules/excel/utils/string-buf.js +1 -1
  26. package/dist/browser/modules/excel/workbook.d.ts +0 -2
  27. package/dist/browser/modules/excel/workbook.js +4 -5
  28. package/dist/browser/modules/excel/worksheet.js +9 -9
  29. package/dist/browser/modules/excel/xlsx/xform/base-xform.d.ts +5 -5
  30. package/dist/browser/modules/excel/xlsx/xform/base-xform.js +1 -1
  31. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
  32. package/dist/browser/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
  33. package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
  34. package/dist/browser/modules/excel/xlsx/xform/comment/comment-xform.d.ts +1 -2
  35. package/dist/browser/modules/excel/xlsx/xform/comment/comments-xform.d.ts +1 -2
  36. package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +3 -4
  37. package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
  38. package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
  39. package/dist/browser/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -2
  40. package/dist/browser/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +1 -2
  41. package/dist/browser/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
  42. package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -2
  43. package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
  44. package/dist/browser/modules/excel/xlsx/xform/composite-xform.d.ts +1 -1
  45. package/dist/browser/modules/excel/xlsx/xform/core/app-xform.js +1 -1
  46. package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
  47. package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
  48. package/dist/browser/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +1 -2
  49. package/dist/browser/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +1 -2
  50. package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -2
  51. package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +1 -2
  52. package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +1 -2
  53. package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
  54. package/dist/browser/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
  55. package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
  56. package/dist/browser/modules/excel/xlsx/xform/drawing/vml-drawing-xform.d.ts +1 -2
  57. package/dist/browser/modules/excel/xlsx/xform/list-xform.d.ts +1 -2
  58. package/dist/browser/modules/excel/xlsx/xform/list-xform.js +3 -3
  59. package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +5 -15
  60. package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +134 -52
  61. package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.d.ts +14 -15
  62. package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.js +244 -70
  63. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +13 -29
  64. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +213 -37
  65. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +7 -34
  66. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +143 -41
  67. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +101 -27
  68. package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
  69. package/dist/browser/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.d.ts +78 -0
  70. package/dist/browser/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +149 -0
  71. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
  72. package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
  73. package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
  74. package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
  75. package/dist/browser/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
  76. package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
  77. package/dist/browser/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
  78. package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
  79. package/dist/browser/modules/excel/xlsx/xform/sheet/row-xform.d.ts +1 -2
  80. package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
  81. package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -2
  82. package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
  83. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
  84. package/dist/browser/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
  85. package/dist/browser/modules/excel/xlsx/xform/style/color-xform.js +1 -1
  86. package/dist/browser/modules/excel/xlsx/xform/style/style-xform.js +5 -5
  87. package/dist/browser/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +1 -2
  88. package/dist/browser/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +1 -2
  89. package/dist/browser/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +1 -2
  90. package/dist/browser/modules/excel/xlsx/xform/table/filter-xform.d.ts +1 -2
  91. package/dist/browser/modules/excel/xlsx/xform/table/table-column-xform.d.ts +1 -2
  92. package/dist/browser/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +1 -2
  93. package/dist/browser/modules/excel/xlsx/xform/table/table-xform.d.ts +1 -2
  94. package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +5 -2
  95. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +88 -54
  96. package/dist/browser/utils/env.d.ts +0 -5
  97. package/dist/browser/utils/env.js +0 -7
  98. package/dist/browser/utils/utils.base.d.ts +8 -13
  99. package/dist/browser/utils/utils.base.js +40 -47
  100. package/dist/browser/utils/utils.browser.d.ts +1 -1
  101. package/dist/browser/utils/utils.browser.js +1 -1
  102. package/dist/browser/utils/utils.d.ts +1 -1
  103. package/dist/browser/utils/utils.js +1 -1
  104. package/dist/cjs/modules/archive/unzip/stream.base.js +19 -19
  105. package/dist/cjs/modules/archive/unzip/stream.browser.js +3 -3
  106. package/dist/cjs/modules/csv/csv-core.js +6 -3
  107. package/dist/cjs/modules/csv/csv.browser.js +2 -2
  108. package/dist/cjs/modules/csv/csv.js +1 -1
  109. package/dist/cjs/modules/excel/anchor.js +4 -4
  110. package/dist/cjs/modules/excel/cell.js +5 -5
  111. package/dist/cjs/modules/excel/column.js +4 -4
  112. package/dist/cjs/modules/excel/defined-names.js +1 -1
  113. package/dist/cjs/modules/excel/form-control.js +1 -1
  114. package/dist/cjs/modules/excel/pivot-table.js +280 -70
  115. package/dist/cjs/modules/excel/row.js +4 -4
  116. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +4 -4
  117. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
  118. package/dist/cjs/modules/excel/stream/worksheet-reader.js +1 -1
  119. package/dist/cjs/modules/excel/stream/worksheet-writer.js +4 -4
  120. package/dist/cjs/modules/excel/table.js +2 -2
  121. package/dist/cjs/modules/excel/utils/cell-format.js +3 -3
  122. package/dist/cjs/modules/excel/utils/shared-formula.js +1 -1
  123. package/dist/cjs/modules/excel/utils/stream-buf.js +2 -2
  124. package/dist/cjs/modules/excel/utils/string-buf.js +1 -1
  125. package/dist/cjs/modules/excel/workbook.js +4 -5
  126. package/dist/cjs/modules/excel/worksheet.js +9 -9
  127. package/dist/cjs/modules/excel/xlsx/xform/base-xform.js +1 -1
  128. package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
  129. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
  130. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
  131. package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
  132. package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
  133. package/dist/cjs/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
  134. package/dist/cjs/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
  135. package/dist/cjs/modules/excel/xlsx/xform/core/app-xform.js +1 -1
  136. package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
  137. package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
  138. package/dist/cjs/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
  139. package/dist/cjs/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
  140. package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
  141. package/dist/cjs/modules/excel/xlsx/xform/list-xform.js +3 -3
  142. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +133 -51
  143. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field.js +245 -71
  144. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +212 -36
  145. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +142 -40
  146. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
  147. package/dist/cjs/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +153 -0
  148. package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
  149. package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
  150. package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
  151. package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
  152. package/dist/cjs/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
  153. package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
  154. package/dist/cjs/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
  155. package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
  156. package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
  157. package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
  158. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
  159. package/dist/cjs/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
  160. package/dist/cjs/modules/excel/xlsx/xform/style/color-xform.js +1 -1
  161. package/dist/cjs/modules/excel/xlsx/xform/style/style-xform.js +5 -5
  162. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +88 -54
  163. package/dist/cjs/utils/env.js +0 -8
  164. package/dist/cjs/utils/utils.base.js +41 -54
  165. package/dist/cjs/utils/utils.browser.js +2 -7
  166. package/dist/cjs/utils/utils.js +2 -7
  167. package/dist/esm/modules/archive/unzip/stream.base.js +19 -19
  168. package/dist/esm/modules/archive/unzip/stream.browser.js +3 -3
  169. package/dist/esm/modules/csv/csv-core.js +6 -3
  170. package/dist/esm/modules/csv/csv.browser.js +2 -2
  171. package/dist/esm/modules/csv/csv.js +1 -1
  172. package/dist/esm/modules/excel/anchor.js +4 -4
  173. package/dist/esm/modules/excel/cell.js +5 -5
  174. package/dist/esm/modules/excel/column.js +4 -4
  175. package/dist/esm/modules/excel/defined-names.js +1 -1
  176. package/dist/esm/modules/excel/form-control.js +1 -1
  177. package/dist/esm/modules/excel/pivot-table.js +278 -70
  178. package/dist/esm/modules/excel/row.js +4 -4
  179. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +4 -4
  180. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +4 -4
  181. package/dist/esm/modules/excel/stream/worksheet-reader.js +1 -1
  182. package/dist/esm/modules/excel/stream/worksheet-writer.js +4 -4
  183. package/dist/esm/modules/excel/table.js +2 -2
  184. package/dist/esm/modules/excel/utils/cell-format.js +3 -3
  185. package/dist/esm/modules/excel/utils/shared-formula.js +1 -1
  186. package/dist/esm/modules/excel/utils/stream-buf.js +2 -2
  187. package/dist/esm/modules/excel/utils/string-buf.js +1 -1
  188. package/dist/esm/modules/excel/workbook.js +4 -5
  189. package/dist/esm/modules/excel/worksheet.js +9 -9
  190. package/dist/esm/modules/excel/xlsx/xform/base-xform.js +1 -1
  191. package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
  192. package/dist/esm/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
  193. package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
  194. package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
  195. package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
  196. package/dist/esm/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
  197. package/dist/esm/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
  198. package/dist/esm/modules/excel/xlsx/xform/core/app-xform.js +1 -1
  199. package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
  200. package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
  201. package/dist/esm/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
  202. package/dist/esm/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
  203. package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
  204. package/dist/esm/modules/excel/xlsx/xform/list-xform.js +3 -3
  205. package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +134 -52
  206. package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field.js +244 -70
  207. package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +213 -37
  208. package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +143 -41
  209. package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
  210. package/dist/esm/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +149 -0
  211. package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
  212. package/dist/esm/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
  213. package/dist/esm/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
  214. package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
  215. package/dist/esm/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
  216. package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
  217. package/dist/esm/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
  218. package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
  219. package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
  220. package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
  221. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
  222. package/dist/esm/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
  223. package/dist/esm/modules/excel/xlsx/xform/style/color-xform.js +1 -1
  224. package/dist/esm/modules/excel/xlsx/xform/style/style-xform.js +5 -5
  225. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +88 -54
  226. package/dist/esm/utils/env.js +0 -7
  227. package/dist/esm/utils/utils.base.js +40 -47
  228. package/dist/esm/utils/utils.browser.js +1 -1
  229. package/dist/esm/utils/utils.js +1 -1
  230. package/dist/iife/excelts.iife.js +1553 -718
  231. package/dist/iife/excelts.iife.js.map +1 -1
  232. package/dist/iife/excelts.iife.min.js +36 -105
  233. package/dist/types/index.browser.d.ts +1 -1
  234. package/dist/types/index.d.ts +1 -1
  235. package/dist/types/modules/excel/pivot-table.d.ts +168 -17
  236. package/dist/types/modules/excel/types.d.ts +0 -4
  237. package/dist/types/modules/excel/workbook.d.ts +0 -2
  238. package/dist/types/modules/excel/xlsx/xform/base-xform.d.ts +5 -5
  239. package/dist/types/modules/excel/xlsx/xform/comment/comment-xform.d.ts +1 -2
  240. package/dist/types/modules/excel/xlsx/xform/comment/comments-xform.d.ts +1 -2
  241. package/dist/types/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +3 -4
  242. package/dist/types/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -2
  243. package/dist/types/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +1 -2
  244. package/dist/types/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -2
  245. package/dist/types/modules/excel/xlsx/xform/composite-xform.d.ts +1 -1
  246. package/dist/types/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +1 -2
  247. package/dist/types/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +1 -2
  248. package/dist/types/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -2
  249. package/dist/types/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +1 -2
  250. package/dist/types/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +1 -2
  251. package/dist/types/modules/excel/xlsx/xform/drawing/vml-drawing-xform.d.ts +1 -2
  252. package/dist/types/modules/excel/xlsx/xform/list-xform.d.ts +1 -2
  253. package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +5 -15
  254. package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field.d.ts +14 -15
  255. package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +13 -29
  256. package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +7 -34
  257. package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +101 -27
  258. package/dist/types/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.d.ts +78 -0
  259. package/dist/types/modules/excel/xlsx/xform/sheet/row-xform.d.ts +1 -2
  260. package/dist/types/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -2
  261. package/dist/types/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +1 -2
  262. package/dist/types/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +1 -2
  263. package/dist/types/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +1 -2
  264. package/dist/types/modules/excel/xlsx/xform/table/filter-xform.d.ts +1 -2
  265. package/dist/types/modules/excel/xlsx/xform/table/table-column-xform.d.ts +1 -2
  266. package/dist/types/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +1 -2
  267. package/dist/types/modules/excel/xlsx/xform/table/table-xform.d.ts +1 -2
  268. package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +5 -2
  269. package/dist/types/utils/env.d.ts +0 -5
  270. package/dist/types/utils/utils.base.d.ts +8 -13
  271. package/dist/types/utils/utils.browser.d.ts +1 -1
  272. package/dist/types/utils/utils.d.ts +1 -1
  273. package/package.json +1 -1
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Reusable utility for collecting raw XML fragments during SAX parsing.
3
+ *
4
+ * Many pivot-table xforms need to capture entire sub-trees (extLst, formats,
5
+ * conditionalFormats, filters, fieldGroup, unknown elements, …) as raw strings
6
+ * for roundtrip preservation. The pattern — `active` flag, `depth` counter,
7
+ * `buffer` of string fragments, plus identical `feedOpen` / `feedClose` /
8
+ * `feedText` logic — was previously copy-pasted across multiple files.
9
+ *
10
+ * Usage:
11
+ * ```ts
12
+ * const collector = new RawXmlCollector("extLst");
13
+ * // In parseOpen, when you see <extLst>:
14
+ * collector.start(); // opens with <extLst>
15
+ * // For every child open tag while active:
16
+ * collector.feedOpen(name, attributes);
17
+ * // For every text node while active:
18
+ * collector.feedText(text);
19
+ * // For every close tag while active:
20
+ * if (collector.feedClose(name)) { ... } // returns true when root tag closed
21
+ * // Retrieve result:
22
+ * collector.result; // joined XML string
23
+ * ```
24
+ */
25
+ declare class RawXmlCollector {
26
+ /** Tag name that this collector captures (e.g. "extLst", "formats"). */
27
+ rootTag: string;
28
+ /** Whether the collector is currently capturing. */
29
+ active: boolean;
30
+ /** Nesting depth *within* the root element (0 = direct children). */
31
+ private depth;
32
+ /** String fragments being accumulated. */
33
+ private buffer;
34
+ /** Index of the last open-tag entry in the buffer (for self-closing collapse). */
35
+ private lastOpenIndex;
36
+ constructor(rootTag: string);
37
+ /**
38
+ * Begin collecting. Pushes the opening root tag (with optional attributes)
39
+ * and resets depth.
40
+ *
41
+ * @param attributes - Attributes on the root element (may be undefined/null).
42
+ */
43
+ start(attributes?: Record<string, unknown> | null): void;
44
+ /**
45
+ * Begin collecting with a dynamically determined root tag.
46
+ * Used for catch-all unknown element collectors where the tag name
47
+ * is not known at construction time.
48
+ */
49
+ startAs(rootTag: string, attributes?: Record<string, unknown> | null): void;
50
+ /**
51
+ * Reset the collector to its initial idle state.
52
+ */
53
+ reset(): void;
54
+ /**
55
+ * Feed an open-tag event. Must only be called while `active` is true.
56
+ */
57
+ feedOpen(name: string, attributes?: Record<string, unknown> | null): void;
58
+ /**
59
+ * Feed a text-node event. Must only be called while `active` is true.
60
+ */
61
+ feedText(text: string): void;
62
+ /**
63
+ * Feed a close-tag event.
64
+ *
65
+ * @returns `true` when the **root** close tag has been received (collector
66
+ * deactivates itself and the result is ready). `false` for any
67
+ * nested close tag.
68
+ */
69
+ feedClose(name: string): boolean;
70
+ /** The collected XML string. Only meaningful after `feedClose` returns true. */
71
+ get result(): string;
72
+ }
73
+ /**
74
+ * Serialize an attributes object to an XML attribute string.
75
+ * `null`, `undefined`, and empty objects produce an empty string.
76
+ */
77
+ declare function serializeAttributes(attributes?: Record<string, unknown> | null): string;
78
+ export { RawXmlCollector, serializeAttributes };
@@ -0,0 +1,149 @@
1
+ import { xmlEncode } from "../../../../../utils/utils.browser.js";
2
+ /**
3
+ * Reusable utility for collecting raw XML fragments during SAX parsing.
4
+ *
5
+ * Many pivot-table xforms need to capture entire sub-trees (extLst, formats,
6
+ * conditionalFormats, filters, fieldGroup, unknown elements, …) as raw strings
7
+ * for roundtrip preservation. The pattern — `active` flag, `depth` counter,
8
+ * `buffer` of string fragments, plus identical `feedOpen` / `feedClose` /
9
+ * `feedText` logic — was previously copy-pasted across multiple files.
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * const collector = new RawXmlCollector("extLst");
14
+ * // In parseOpen, when you see <extLst>:
15
+ * collector.start(); // opens with <extLst>
16
+ * // For every child open tag while active:
17
+ * collector.feedOpen(name, attributes);
18
+ * // For every text node while active:
19
+ * collector.feedText(text);
20
+ * // For every close tag while active:
21
+ * if (collector.feedClose(name)) { ... } // returns true when root tag closed
22
+ * // Retrieve result:
23
+ * collector.result; // joined XML string
24
+ * ```
25
+ */
26
+ class RawXmlCollector {
27
+ constructor(rootTag) {
28
+ /** Whether the collector is currently capturing. */
29
+ this.active = false;
30
+ /** Nesting depth *within* the root element (0 = direct children). */
31
+ this.depth = 0;
32
+ /** String fragments being accumulated. */
33
+ this.buffer = [];
34
+ /** Index of the last open-tag entry in the buffer (for self-closing collapse). */
35
+ this.lastOpenIndex = -1;
36
+ this.rootTag = rootTag;
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Lifecycle
40
+ // ---------------------------------------------------------------------------
41
+ /**
42
+ * Begin collecting. Pushes the opening root tag (with optional attributes)
43
+ * and resets depth.
44
+ *
45
+ * @param attributes - Attributes on the root element (may be undefined/null).
46
+ */
47
+ start(attributes) {
48
+ this.active = true;
49
+ this.depth = 0;
50
+ const attrsStr = serializeAttributes(attributes);
51
+ this.buffer = [`<${this.rootTag}${attrsStr ? " " + attrsStr : ""}>`];
52
+ }
53
+ /**
54
+ * Begin collecting with a dynamically determined root tag.
55
+ * Used for catch-all unknown element collectors where the tag name
56
+ * is not known at construction time.
57
+ */
58
+ startAs(rootTag, attributes) {
59
+ this.rootTag = rootTag;
60
+ this.start(attributes);
61
+ }
62
+ /**
63
+ * Reset the collector to its initial idle state.
64
+ */
65
+ reset() {
66
+ this.active = false;
67
+ this.depth = 0;
68
+ this.buffer.length = 0;
69
+ this.lastOpenIndex = -1;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Feed methods — call these from parseOpen / parseText / parseClose
73
+ // ---------------------------------------------------------------------------
74
+ /**
75
+ * Feed an open-tag event. Must only be called while `active` is true.
76
+ */
77
+ feedOpen(name, attributes) {
78
+ const attrsStr = serializeAttributes(attributes);
79
+ this.buffer.push(`<${name}${attrsStr ? " " + attrsStr : ""}>`);
80
+ this.depth++;
81
+ this.lastOpenIndex = this.buffer.length - 1;
82
+ }
83
+ /**
84
+ * Feed a text-node event. Must only be called while `active` is true.
85
+ */
86
+ feedText(text) {
87
+ this.buffer.push(xmlEncode(text));
88
+ this.lastOpenIndex = -1;
89
+ }
90
+ /**
91
+ * Feed a close-tag event.
92
+ *
93
+ * @returns `true` when the **root** close tag has been received (collector
94
+ * deactivates itself and the result is ready). `false` for any
95
+ * nested close tag.
96
+ */
97
+ feedClose(name) {
98
+ if (name === this.rootTag && this.depth === 0) {
99
+ this.buffer.push(`</${name}>`);
100
+ this.active = false;
101
+ this.lastOpenIndex = -1;
102
+ return true;
103
+ }
104
+ // Guard against depth going negative (e.g. mismatched close tags)
105
+ if (this.depth > 0) {
106
+ this.depth--;
107
+ }
108
+ // Collapse self-closing: if the close tag matches the last open tag and
109
+ // nothing was written between them, rewrite `<tag ...>` → `<tag ... />`
110
+ if (this.lastOpenIndex >= 0 && this.lastOpenIndex === this.buffer.length - 1) {
111
+ const openTag = this.buffer[this.lastOpenIndex];
112
+ // openTag ends with ">" — replace with " />"
113
+ this.buffer[this.lastOpenIndex] = openTag.slice(0, -1) + " />";
114
+ this.lastOpenIndex = -1;
115
+ return false;
116
+ }
117
+ this.lastOpenIndex = -1;
118
+ this.buffer.push(`</${name}>`);
119
+ return false;
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // Result
123
+ // ---------------------------------------------------------------------------
124
+ /** The collected XML string. Only meaningful after `feedClose` returns true. */
125
+ get result() {
126
+ return this.buffer.join("");
127
+ }
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Helpers
131
+ // ---------------------------------------------------------------------------
132
+ /**
133
+ * Serialize an attributes object to an XML attribute string.
134
+ * `null`, `undefined`, and empty objects produce an empty string.
135
+ */
136
+ function serializeAttributes(attributes) {
137
+ if (!attributes) {
138
+ return "";
139
+ }
140
+ const entries = Object.entries(attributes);
141
+ if (entries.length === 0) {
142
+ return "";
143
+ }
144
+ return entries
145
+ .filter(([, v]) => v != null)
146
+ .map(([k, v]) => `${k}="${xmlEncode(String(v))}"`)
147
+ .join(" ");
148
+ }
149
+ export { RawXmlCollector, serializeAttributes };
@@ -379,7 +379,7 @@ class CellXform extends BaseXform {
379
379
  return true;
380
380
  case "r":
381
381
  this.model.value = this.model.value || {};
382
- this.model.value.richText = this.model.value.richText || [];
382
+ this.model.value.richText = this.model.value.richText ?? [];
383
383
  this.model.value.richText.push(this.parser.model);
384
384
  this.parser = undefined;
385
385
  this.currentNode = undefined;
@@ -250,7 +250,7 @@ class CfRuleXform extends CompositeXform {
250
250
  break;
251
251
  case "formula":
252
252
  // except - formula is a string and appends to formulae
253
- this.model.formulae = this.model.formulae || [];
253
+ this.model.formulae = this.model.formulae ?? [];
254
254
  this.model.formulae.push(parser.model);
255
255
  break;
256
256
  }
@@ -13,7 +13,7 @@ class ConditionalFormattingsXform extends BaseXform {
13
13
  }
14
14
  prepare(model, options) {
15
15
  // ensure each rule has a priority value
16
- let nextPriority = model.reduce((p, cf) => Math.max(p, ...cf.rules.map((rule) => rule.priority || 0)), 1);
16
+ let nextPriority = model.reduce((p, cf) => Math.max(p, ...cf.rules.map((rule) => rule.priority ?? 0)), 1);
17
17
  model.forEach((cf) => {
18
18
  cf.rules.forEach((rule) => {
19
19
  if (!rule.priority) {
@@ -61,7 +61,7 @@ class CfRuleExtXform extends CompositeXform {
61
61
  xmlStream.openNode(this.tag, {
62
62
  type: "iconSet",
63
63
  priority: model.priority,
64
- id: model.x14Id || `{${uuidV4()}}`
64
+ id: model.x14Id ?? `{${uuidV4()}}`
65
65
  });
66
66
  this.iconSetXform.render(xmlStream, model);
67
67
  xmlStream.closeNode();
@@ -38,9 +38,9 @@ class ColXform extends BaseXform {
38
38
  parseOpen(node) {
39
39
  if (node.name === "col") {
40
40
  const model = (this.model = {
41
- min: parseInt(node.attributes.min || "0", 10),
42
- max: parseInt(node.attributes.max || "0", 10),
43
- width: node.attributes.width === undefined ? undefined : parseFloat(node.attributes.width || "0")
41
+ min: parseInt(node.attributes.min ?? "0", 10),
42
+ max: parseInt(node.attributes.max ?? "0", 10),
43
+ width: node.attributes.width === undefined ? undefined : parseFloat(node.attributes.width ?? "0")
44
44
  });
45
45
  if (node.attributes.style) {
46
46
  model.styleId = parseInt(node.attributes.style, 10);
@@ -159,7 +159,7 @@ class DataValidationsXform extends BaseXform {
159
159
  xmlStream.addAttribute("error", value.error);
160
160
  }
161
161
  xmlStream.addAttribute("sqref", value.sqref);
162
- (value.formulae || []).forEach((formula, index) => {
162
+ (value.formulae ?? []).forEach((formula, index) => {
163
163
  xmlStream.openNode(`formula${index + 1}`);
164
164
  if (value.type === "date") {
165
165
  xmlStream.writeText(dateToExcel(new Date(formula)));
@@ -181,7 +181,7 @@ class DataValidationsXform extends BaseXform {
181
181
  return true;
182
182
  case "dataValidation": {
183
183
  this._address = node.attributes.sqref;
184
- const dataValidation = { type: node.attributes.type || "any", formulae: [] };
184
+ const dataValidation = { type: node.attributes.type ?? "any", formulae: [] };
185
185
  if (node.attributes.type) {
186
186
  assignBool(dataValidation, node.attributes, "allowBlank");
187
187
  }
@@ -227,7 +227,7 @@ class DataValidationsXform extends BaseXform {
227
227
  delete this._dataValidation.operator;
228
228
  }
229
229
  // The four known cases: 1. E4:L9 N4:U9 2.E4 L9 3. N4:U9 4. E4
230
- const list = this._address.split(/\s+/g) || [];
230
+ const list = this._address.split(/\s+/g);
231
231
  list.forEach((addr) => {
232
232
  if (addr.includes(":")) {
233
233
  // Store ranges directly to avoid expanding large (or many) validations.
@@ -85,22 +85,22 @@ class HeaderFooterXform extends BaseXform {
85
85
  parseText(text) {
86
86
  switch (this.currentNode) {
87
87
  case "oddHeader":
88
- this.model.oddHeader = (this.model.oddHeader || "") + text;
88
+ this.model.oddHeader = (this.model.oddHeader ?? "") + text;
89
89
  break;
90
90
  case "oddFooter":
91
- this.model.oddFooter = (this.model.oddFooter || "") + text;
91
+ this.model.oddFooter = (this.model.oddFooter ?? "") + text;
92
92
  break;
93
93
  case "evenHeader":
94
- this.model.evenHeader = (this.model.evenHeader || "") + text;
94
+ this.model.evenHeader = (this.model.evenHeader ?? "") + text;
95
95
  break;
96
96
  case "evenFooter":
97
- this.model.evenFooter = (this.model.evenFooter || "") + text;
97
+ this.model.evenFooter = (this.model.evenFooter ?? "") + text;
98
98
  break;
99
99
  case "firstHeader":
100
- this.model.firstHeader = (this.model.firstHeader || "") + text;
100
+ this.model.firstHeader = (this.model.firstHeader ?? "") + text;
101
101
  break;
102
102
  case "firstFooter":
103
- this.model.firstFooter = (this.model.firstFooter || "") + text;
103
+ this.model.firstFooter = (this.model.firstFooter ?? "") + text;
104
104
  break;
105
105
  default:
106
106
  break;
@@ -81,21 +81,21 @@ class PageSetupXform extends BaseXform {
81
81
  case this.tag:
82
82
  this.model = {
83
83
  paperSize: pageSizeToModel(node.attributes.paperSize),
84
- orientation: node.attributes.orientation || "portrait",
85
- horizontalDpi: parseInt(node.attributes.horizontalDpi || "4294967295", 10),
86
- verticalDpi: parseInt(node.attributes.verticalDpi || "4294967295", 10),
87
- pageOrder: node.attributes.pageOrder || "downThenOver",
84
+ orientation: node.attributes.orientation ?? "portrait",
85
+ horizontalDpi: parseInt(node.attributes.horizontalDpi ?? "4294967295", 10),
86
+ verticalDpi: parseInt(node.attributes.verticalDpi ?? "4294967295", 10),
87
+ pageOrder: node.attributes.pageOrder ?? "downThenOver",
88
88
  blackAndWhite: node.attributes.blackAndWhite === "1",
89
89
  draft: node.attributes.draft === "1",
90
- cellComments: node.attributes.cellComments || "None",
91
- errors: node.attributes.errors || "displayed",
92
- scale: parseInt(node.attributes.scale || "100", 10),
93
- fitToWidth: parseInt(node.attributes.fitToWidth || "1", 10),
94
- fitToHeight: parseInt(node.attributes.fitToHeight || "1", 10),
95
- firstPageNumber: parseInt(node.attributes.firstPageNumber || "1", 10),
90
+ cellComments: node.attributes.cellComments ?? "None",
91
+ errors: node.attributes.errors ?? "displayed",
92
+ scale: parseInt(node.attributes.scale ?? "100", 10),
93
+ fitToWidth: parseInt(node.attributes.fitToWidth ?? "1", 10),
94
+ fitToHeight: parseInt(node.attributes.fitToHeight ?? "1", 10),
95
+ firstPageNumber: parseInt(node.attributes.firstPageNumber ?? "1", 10),
96
96
  useFirstPageNumber: node.attributes.useFirstPageNumber === "1",
97
97
  usePrinterDefaults: node.attributes.usePrinterDefaults === "1",
98
- copies: parseInt(node.attributes.copies || "1", 10)
98
+ copies: parseInt(node.attributes.copies ?? "1", 10)
99
99
  };
100
100
  return true;
101
101
  default:
@@ -16,12 +16,11 @@ interface RowModel {
16
16
  style?: any;
17
17
  dyDescent?: number;
18
18
  }
19
- declare class RowXform extends BaseXform {
19
+ declare class RowXform extends BaseXform<RowModel> {
20
20
  private maxItems?;
21
21
  map: {
22
22
  [key: string]: any;
23
23
  };
24
- model: RowModel;
25
24
  parser: any;
26
25
  private numRowsSeen;
27
26
  private lastCellCol;
@@ -29,12 +29,12 @@ class SheetFormatPropertiesXform extends BaseXform {
29
29
  parseOpen(node) {
30
30
  if (node.name === "sheetFormatPr") {
31
31
  this.model = {
32
- defaultRowHeight: parseFloat(node.attributes.defaultRowHeight || "0"),
32
+ defaultRowHeight: parseFloat(node.attributes.defaultRowHeight ?? "0"),
33
33
  dyDescent: node.attributes["x14ac:dyDescent"] !== undefined
34
34
  ? parseFloat(node.attributes["x14ac:dyDescent"])
35
35
  : undefined,
36
- outlineLevelRow: parseInt(node.attributes.outlineLevelRow || "0", 10),
37
- outlineLevelCol: parseInt(node.attributes.outlineLevelCol || "0", 10)
36
+ outlineLevelRow: parseInt(node.attributes.outlineLevelRow ?? "0", 10),
37
+ outlineLevelCol: parseInt(node.attributes.outlineLevelCol ?? "0", 10)
38
38
  };
39
39
  if (node.attributes.defaultColWidth) {
40
40
  this.model.defaultColWidth = parseFloat(node.attributes.defaultColWidth);
@@ -16,8 +16,7 @@ interface SheetViewModel {
16
16
  activePane?: string;
17
17
  activeCell?: string;
18
18
  }
19
- declare class SheetViewXform extends BaseXform {
20
- model: SheetViewModel;
19
+ declare class SheetViewXform extends BaseXform<SheetViewModel> {
21
20
  private sheetView;
22
21
  private pane;
23
22
  private selections;
@@ -25,7 +25,7 @@ class SheetViewXform extends BaseXform {
25
25
  if (model.tabSelected) {
26
26
  initialAttrs.tabSelected = "1";
27
27
  }
28
- initialAttrs.workbookViewId = model.workbookViewId || 0;
28
+ initialAttrs.workbookViewId = model.workbookViewId ?? 0;
29
29
  xmlStream.openNode("sheetView", initialAttrs);
30
30
  const add = function (name, value, included) {
31
31
  if (included) {
@@ -46,8 +46,8 @@ class SheetViewXform extends BaseXform {
46
46
  let activePane;
47
47
  switch (model.state) {
48
48
  case "frozen":
49
- xSplit = model.xSplit || 0;
50
- ySplit = model.ySplit || 0;
49
+ xSplit = model.xSplit ?? 0;
50
+ ySplit = model.ySplit ?? 0;
51
51
  topLeftCell = model.topLeftCell || colCache.getAddress(ySplit + 1, xSplit + 1).address;
52
52
  activePane =
53
53
  (model.xSplit && model.ySplit && "bottomRight") ||
@@ -105,8 +105,8 @@ class SheetViewXform extends BaseXform {
105
105
  showRuler: !(node.attributes.showRuler === "0"),
106
106
  showRowColHeaders: !(node.attributes.showRowColHeaders === "0"),
107
107
  showGridLines: !(node.attributes.showGridLines === "0"),
108
- zoomScale: parseInt(node.attributes.zoomScale || "100", 10),
109
- zoomScaleNormal: parseInt(node.attributes.zoomScaleNormal || "100", 10),
108
+ zoomScale: parseInt(node.attributes.zoomScale ?? "100", 10),
109
+ zoomScaleNormal: parseInt(node.attributes.zoomScaleNormal ?? "100", 10),
110
110
  style: node.attributes.view
111
111
  };
112
112
  this.pane = undefined;
@@ -114,15 +114,15 @@ class SheetViewXform extends BaseXform {
114
114
  return true;
115
115
  case "pane":
116
116
  this.pane = {
117
- xSplit: parseInt(node.attributes.xSplit || "0", 10),
118
- ySplit: parseInt(node.attributes.ySplit || "0", 10),
117
+ xSplit: parseInt(node.attributes.xSplit ?? "0", 10),
118
+ ySplit: parseInt(node.attributes.ySplit ?? "0", 10),
119
119
  topLeftCell: node.attributes.topLeftCell,
120
- activePane: node.attributes.activePane || "topLeft",
120
+ activePane: node.attributes.activePane ?? "topLeft",
121
121
  state: node.attributes.state
122
122
  };
123
123
  return true;
124
124
  case "selection": {
125
- const name = node.attributes.pane || "topLeft";
125
+ const name = node.attributes.pane ?? "topLeft";
126
126
  this.selections[name] = {
127
127
  pane: name,
128
128
  activeCell: node.attributes.activeCell
@@ -144,7 +144,7 @@ class SheetViewXform extends BaseXform {
144
144
  workbookViewId: this.sheetView.workbookViewId,
145
145
  rightToLeft: this.sheetView.rightToLeft,
146
146
  tabSelected: this.sheetView.tabSelected,
147
- state: VIEW_STATES[this.pane.state] || "split", // split is default
147
+ state: VIEW_STATES[this.pane.state] ?? "split", // split is default
148
148
  xSplit: this.pane.xSplit,
149
149
  ySplit: this.pane.ySplit,
150
150
  topLeftCell: this.pane.topLeftCell,
@@ -85,7 +85,7 @@ class WorkSheetXform extends BaseXform {
85
85
  constructor(options) {
86
86
  super();
87
87
  const { maxRows, maxCols, ignoreNodes } = options || {};
88
- this.ignoreNodes = ignoreNodes || [];
88
+ this.ignoreNodes = ignoreNodes ?? [];
89
89
  this.map = {
90
90
  sheetPr: new SheetPropertiesXform(),
91
91
  dimension: new DimensionXform(),
@@ -293,7 +293,7 @@ class WorkSheetXform extends BaseXform {
293
293
  });
294
294
  });
295
295
  // prepare pivot tables
296
- (model.pivotTables || []).forEach((pivotTable) => {
296
+ (model.pivotTables ?? []).forEach((pivotTable) => {
297
297
  rels.push({
298
298
  Id: nextRid(rels),
299
299
  Type: RelType.PivotTable,
@@ -557,8 +557,8 @@ class WorkSheetXform extends BaseXform {
557
557
  drawing: this.map.drawing.model,
558
558
  tables: this.map.tableParts.model,
559
559
  conditionalFormattings,
560
- rowBreaks: this.map.rowBreaks.model || [],
561
- colBreaks: this.map.colBreaks.model || []
560
+ rowBreaks: this.map.rowBreaks.model ?? [],
561
+ colBreaks: this.map.colBreaks.model ?? []
562
562
  };
563
563
  if (this.map.autoFilter.model) {
564
564
  this.model.autoFilter = this.map.autoFilter.model;
@@ -576,7 +576,7 @@ class WorkSheetXform extends BaseXform {
576
576
  reconcile(model, options) {
577
577
  // options.merges = new Merges();
578
578
  // options.merges.reconcile(model.mergeCells, model.rows);
579
- const rels = (model.relationships || []).reduce((h, rel) => {
579
+ const rels = (model.relationships ?? []).reduce((h, rel) => {
580
580
  h[rel.Id] = rel;
581
581
  if (rel.Type === RelType.Comments) {
582
582
  model.comments = options.comments[rel.Target].comments;
@@ -589,13 +589,13 @@ class WorkSheetXform extends BaseXform {
589
589
  }
590
590
  return h;
591
591
  }, {});
592
- options.commentsMap = (model.comments || []).reduce((h, comment) => {
592
+ options.commentsMap = (model.comments ?? []).reduce((h, comment) => {
593
593
  if (comment.ref) {
594
594
  h[comment.ref] = comment;
595
595
  }
596
596
  return h;
597
597
  }, {});
598
- options.hyperlinkMap = (model.hyperlinks || []).reduce((h, hyperlink) => {
598
+ options.hyperlinkMap = (model.hyperlinks ?? []).reduce((h, hyperlink) => {
599
599
  if (hyperlink.rId) {
600
600
  h[hyperlink.address] = rels[hyperlink.rId].Target;
601
601
  }
@@ -603,9 +603,9 @@ class WorkSheetXform extends BaseXform {
603
603
  }, {});
604
604
  options.formulae = {};
605
605
  // compact the rows and cells
606
- model.rows = (model.rows && model.rows.filter(Boolean)) || [];
606
+ model.rows = model.rows?.filter(Boolean) ?? [];
607
607
  model.rows.forEach(row => {
608
- row.cells = (row.cells && row.cells.filter(Boolean)) || [];
608
+ row.cells = row.cells?.filter(Boolean) ?? [];
609
609
  });
610
610
  this.map.cols.reconcile(model.cols, options);
611
611
  this.map.sheetData.reconcile(model.rows, options);
@@ -623,7 +623,7 @@ class WorkSheetXform extends BaseXform {
623
623
  model.drawing = {
624
624
  ...drawing,
625
625
  name: drawingName,
626
- rels: options.drawingRels?.[drawingName] || drawing.rels || []
626
+ rels: options.drawingRels?.[drawingName] ?? drawing.rels ?? []
627
627
  };
628
628
  // Also extract images to model.media for backward compatibility
629
629
  drawing.anchors.forEach(anchor => {
@@ -651,14 +651,14 @@ class WorkSheetXform extends BaseXform {
651
651
  });
652
652
  }
653
653
  }
654
- model.tables = (model.tables || []).map(tablePart => {
654
+ model.tables = (model.tables ?? []).map(tablePart => {
655
655
  const rel = rels[tablePart.rId];
656
656
  return options.tables[rel.Target];
657
657
  });
658
658
  // Link pivot tables from relationships to worksheet
659
659
  // This is needed so that when writing, the worksheet knows which pivot tables it contains
660
660
  model.pivotTables = [];
661
- (model.relationships || []).forEach(rel => {
661
+ (model.relationships ?? []).forEach(rel => {
662
662
  if (rel.Type === RelType.PivotTable && options.pivotTables) {
663
663
  const pivotTable = options.pivotTables[rel.Target];
664
664
  if (pivotTable) {
@@ -14,8 +14,8 @@ class PhoneticTextXform extends BaseXform {
14
14
  }
15
15
  render(xmlStream, model) {
16
16
  xmlStream.openNode(this.tag, {
17
- sb: model.sb || 0,
18
- eb: model.eb || 0
17
+ sb: model.sb ?? 0,
18
+ eb: model.eb ?? 0
19
19
  });
20
20
  if (model && Object.prototype.hasOwnProperty.call(model, "richText") && model.richText) {
21
21
  const { r } = this.map;
@@ -4,7 +4,7 @@ class ColorXform extends BaseXform {
4
4
  constructor(name) {
5
5
  super();
6
6
  // this.name controls the xm node name
7
- this.name = name || "color";
7
+ this.name = name ?? "color";
8
8
  }
9
9
  get tag() {
10
10
  return this.name;
@@ -16,13 +16,13 @@ class StyleXform extends BaseXform {
16
16
  }
17
17
  render(xmlStream, model) {
18
18
  xmlStream.openNode("xf", {
19
- numFmtId: model.numFmtId || 0,
20
- fontId: model.fontId || 0,
21
- fillId: model.fillId || 0,
22
- borderId: model.borderId || 0
19
+ numFmtId: model.numFmtId ?? 0,
20
+ fontId: model.fontId ?? 0,
21
+ fillId: model.fillId ?? 0,
22
+ borderId: model.borderId ?? 0
23
23
  });
24
24
  if (this.xfId) {
25
- xmlStream.addAttribute("xfId", model.xfId || 0);
25
+ xmlStream.addAttribute("xfId", model.xfId ?? 0);
26
26
  }
27
27
  if (model.applyNumberFormat || model.numFmtId) {
28
28
  xmlStream.addAttribute("applyNumberFormat", "1");
@@ -4,12 +4,11 @@ interface AutoFilterModel {
4
4
  autoFilterRef: string;
5
5
  columns: any[];
6
6
  }
7
- declare class AutoFilterXform extends BaseXform {
7
+ declare class AutoFilterXform extends BaseXform<AutoFilterModel> {
8
8
  map: {
9
9
  [key: string]: FilterColumnXform;
10
10
  };
11
11
  parser: any;
12
- model: AutoFilterModel;
13
12
  constructor();
14
13
  get tag(): string;
15
14
  prepare(model: any): void;
@@ -3,8 +3,7 @@ interface CustomFilterModel {
3
3
  val: string;
4
4
  operator?: string;
5
5
  }
6
- declare class CustomFilterXform extends BaseXform {
7
- model: CustomFilterModel;
6
+ declare class CustomFilterXform extends BaseXform<CustomFilterModel> {
8
7
  constructor();
9
8
  get tag(): string;
10
9
  render(xmlStream: any, model: CustomFilterModel): void;
@@ -5,12 +5,11 @@ interface FilterColumnModel {
5
5
  filterButton: boolean;
6
6
  customFilters?: any[];
7
7
  }
8
- declare class FilterColumnXform extends BaseXform {
8
+ declare class FilterColumnXform extends BaseXform<FilterColumnModel> {
9
9
  map: {
10
10
  [key: string]: ListXform;
11
11
  };
12
12
  parser: any;
13
- model: FilterColumnModel;
14
13
  constructor();
15
14
  get tag(): string;
16
15
  prepare(model: FilterColumnModel, options: {