@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
@@ -35,10 +35,10 @@ export class WorkbookWriterBase {
35
35
  this.WorksheetWriterClass = WorksheetWriterClass;
36
36
  this.created = options.created || new Date();
37
37
  this.modified = options.modified || this.created;
38
- this.creator = options.creator || "ExcelTS";
39
- this.lastModifiedBy = options.lastModifiedBy || "ExcelTS";
38
+ this.creator = options.creator ?? "ExcelTS";
39
+ this.lastModifiedBy = options.lastModifiedBy ?? "ExcelTS";
40
40
  this.lastPrinted = options.lastPrinted;
41
- this.useSharedStrings = options.useSharedStrings || false;
41
+ this.useSharedStrings = options.useSharedStrings ?? false;
42
42
  this.sharedStrings = new SharedStrings();
43
43
  this.styles = options.useStyles ? new StylesXform(true) : new StylesXform.Mock(true);
44
44
  this._definedNames = new DefinedNames();
@@ -170,7 +170,7 @@ export class WorkbookWriterBase {
170
170
  opts.properties = { tabColor: opts.tabColor, ...opts.properties };
171
171
  }
172
172
  const id = this.nextId;
173
- name = name || `sheet${id}`;
173
+ name = name ?? `sheet${id}`;
174
174
  const worksheet = new this.WorksheetWriterClass({
175
175
  id,
176
176
  name,
@@ -165,7 +165,7 @@ class WorksheetReader extends EventEmitter {
165
165
  min: parseInt(node.attributes.min, 10),
166
166
  max: parseInt(node.attributes.max, 10),
167
167
  width: parseFloat(node.attributes.width),
168
- styleId: parseInt(node.attributes.style || "0", 10)
168
+ styleId: parseInt(node.attributes.style ?? "0", 10)
169
169
  });
170
170
  }
171
171
  break;
@@ -64,7 +64,7 @@ class WorksheetWriter {
64
64
  // and a name
65
65
  this.name = options.name || `Sheet${this.id}`;
66
66
  // add a state
67
- this.state = options.state || "visible";
67
+ this.state = options.state ?? "visible";
68
68
  // rows are stored here while they need to be worked on.
69
69
  // when they are committed, they will be deleted.
70
70
  this._rows = [];
@@ -138,13 +138,13 @@ class WorksheetWriter {
138
138
  colBreaks: null
139
139
  }, options.pageSetup);
140
140
  // using shared strings creates a smaller xlsx file but may use more memory
141
- this.useSharedStrings = options.useSharedStrings || false;
141
+ this.useSharedStrings = options.useSharedStrings ?? false;
142
142
  this._workbook = options.workbook;
143
143
  this.hasComments = false;
144
144
  // views
145
- this._views = options.views || [];
145
+ this._views = options.views ?? [];
146
146
  // auto filter
147
- this.autoFilter = options.autoFilter || null;
147
+ this.autoFilter = options.autoFilter ?? null;
148
148
  this._media = [];
149
149
  // worksheet protection
150
150
  this.sheetProtection = null;
@@ -104,7 +104,7 @@ class Table {
104
104
  case "sum":
105
105
  return `SUBTOTAL(109,${this.table.name}[${column.name}])`;
106
106
  case "custom":
107
- return column.totalsRowFormula || null;
107
+ return column.totalsRowFormula ?? null;
108
108
  default:
109
109
  throw new Error(`Invalid Totals Row Function: ${column.totalsRowFunction}`);
110
110
  }
@@ -166,7 +166,7 @@ class Table {
166
166
  }
167
167
  else {
168
168
  assign(column, "totalsRowFunction", "none");
169
- column.totalsRowFormula = this.getFormula(column) || undefined;
169
+ column.totalsRowFormula = this.getFormula(column) ?? undefined;
170
170
  }
171
171
  });
172
172
  }
@@ -107,7 +107,7 @@ export function getFormat(numFmtId) {
107
107
  }
108
108
  // Check default map
109
109
  if (DEFAULT_MAP[numFmtId] !== undefined) {
110
- return TABLE_FMT[DEFAULT_MAP[numFmtId]] || "General";
110
+ return TABLE_FMT[DEFAULT_MAP[numFmtId]] ?? "General";
111
111
  }
112
112
  return "General";
113
113
  }
@@ -339,7 +339,7 @@ function formatGeneral(val) {
339
339
  */
340
340
  function formatPercentage(val, fmt) {
341
341
  // Count % signs
342
- const percentCount = (fmt.match(/%/g) || []).length;
342
+ const percentCount = (fmt.match(/%/g) ?? []).length;
343
343
  // Multiply value by 100 for each %
344
344
  const scaledVal = val * Math.pow(100, percentCount);
345
345
  // Remove % from format to process the number part
@@ -553,7 +553,7 @@ function formatNumberPattern(val, fmt) {
553
553
  formattedInt = commaify(intPart);
554
554
  }
555
555
  // Pad integer with leading zeros if needed
556
- const minIntDigits = (intFmt.match(/0/g) || []).length;
556
+ const minIntDigits = (intFmt.match(/0/g) ?? []).length;
557
557
  if (formattedInt.length < minIntDigits) {
558
558
  formattedInt = "0".repeat(minIntDigits - formattedInt.length) + formattedInt;
559
559
  }
@@ -27,7 +27,7 @@ function slideFormula(formula, fromCell, toCell) {
27
27
  if (!rowDollar) {
28
28
  row += to.row - offset.row;
29
29
  }
30
- const res = (sheet || "") + (colDollar || "") + colCache.n2l(col) + (rowDollar || "") + row;
30
+ const res = (sheet ?? "") + (colDollar ?? "") + colCache.n2l(col) + (rowDollar ?? "") + row;
31
31
  return res;
32
32
  }
33
33
  return refMatch;
@@ -132,7 +132,7 @@ class StreamBuf extends EventEmitter {
132
132
  this._asyncWriteQueue = Promise.resolve();
133
133
  this.bufSize = options?.bufSize || 1024 * 1024;
134
134
  this.buffers = [];
135
- this.batch = options?.batch || false;
135
+ this.batch = options?.batch ?? false;
136
136
  this.corked = false;
137
137
  this.paused = false;
138
138
  this.encoding = null;
@@ -345,7 +345,7 @@ class StreamBuf extends EventEmitter {
345
345
  * Cross-platform compatible - works identically in Node.js and Browser.
346
346
  */
347
347
  readString(encoding) {
348
- const enc = encoding || this.encoding || "utf-8";
348
+ const enc = encoding ?? this.encoding ?? "utf-8";
349
349
  const buf = this.read();
350
350
  if (typeof Buffer !== "undefined" && buf instanceof Buffer) {
351
351
  return buf.toString(enc);
@@ -33,7 +33,7 @@ class StringBuf {
33
33
  return this._buffer;
34
34
  }
35
35
  reset(position) {
36
- position = position || 0;
36
+ position = position ?? 0;
37
37
  this._buffer = undefined;
38
38
  this._inPos = position;
39
39
  }
@@ -230,8 +230,8 @@ class Workbook {
230
230
  // ===========================================================================
231
231
  get model() {
232
232
  return {
233
- creator: this.creator || "Unknown",
234
- lastModifiedBy: this.lastModifiedBy || "Unknown",
233
+ creator: this.creator ?? "Unknown",
234
+ lastModifiedBy: this.lastModifiedBy ?? "Unknown",
235
235
  lastPrinted: this.lastPrinted,
236
236
  created: this.created,
237
237
  modified: this.modified,
@@ -293,10 +293,9 @@ class Workbook {
293
293
  this._definedNames.model = value.definedNames;
294
294
  this.views = value.views;
295
295
  this._themes = value.themes;
296
- this.media = value.media || [];
296
+ this.media = value.media ?? [];
297
297
  // Handle pivot tables - either newly created or loaded from file
298
- // Loaded pivot tables come from loadedPivotTables after reconciliation
299
- this.pivotTables = value.pivotTables || value.loadedPivotTables || [];
298
+ this.pivotTables = value.pivotTables ?? [];
300
299
  // Preserve passthrough files (charts, etc.) for round-trip preservation
301
300
  this._passthrough = value.passthrough || {};
302
301
  // Preserve raw drawing data for drawings with chart references
@@ -21,12 +21,12 @@ class Worksheet {
21
21
  options = options || {};
22
22
  this._workbook = options.workbook;
23
23
  // in a workbook, each sheet will have a number
24
- this.id = options.id || 0;
25
- this.orderNo = options.orderNo || 0;
24
+ this.id = options.id ?? 0;
25
+ this.orderNo = options.orderNo ?? 0;
26
26
  // and a name - use the setter to ensure validation and truncation
27
27
  this.name = options.name || `sheet${this.id}`;
28
28
  // add a state
29
- this.state = options.state || "visible";
29
+ this.state = options.state ?? "visible";
30
30
  // rows allows access organised by row. Sparse array of arrays indexed by row-1, col
31
31
  // Note: _rows is zero based. Must subtract 1 to go from cell.row to index
32
32
  this._rows = [];
@@ -86,8 +86,8 @@ class Worksheet {
86
86
  }, options.headerFooter);
87
87
  this.dataValidations = new DataValidations();
88
88
  // for freezepanes, split, zoom, gridlines, etc
89
- this.views = options.views || [];
90
- this.autoFilter = options.autoFilter || null;
89
+ this.views = options.views ?? [];
90
+ this.autoFilter = options.autoFilter ?? null;
91
91
  // for images, etc
92
92
  this._media = [];
93
93
  // worksheet protection
@@ -250,7 +250,7 @@ class Worksheet {
250
250
  if (inserts.length > 0) {
251
251
  // must iterate over all rows whether they exist yet or not
252
252
  for (let i = 0; i < nRows; i++) {
253
- const insertValues = inserts.map(insert => insert[i] || null);
253
+ const insertValues = inserts.map(insert => insert[i] ?? null);
254
254
  const row = this.getRow(i + 1);
255
255
  row.splice(start, count, ...insertValues);
256
256
  }
@@ -930,7 +930,7 @@ class Worksheet {
930
930
  };
931
931
  // =================================================
932
932
  // columns
933
- model.cols = Column.toModel(this.columns || []);
933
+ model.cols = Column.toModel(this.columns ?? []);
934
934
  // ==========================================================
935
935
  // Rows
936
936
  const rows = (model.rows = []);
@@ -978,8 +978,8 @@ class Worksheet {
978
978
  this.properties = value.properties;
979
979
  this.pageSetup = value.pageSetup;
980
980
  this.headerFooter = value.headerFooter;
981
- this.rowBreaks = value.rowBreaks || [];
982
- this.colBreaks = value.colBreaks || [];
981
+ this.rowBreaks = value.rowBreaks ?? [];
982
+ this.colBreaks = value.colBreaks ?? [];
983
983
  this.views = value.views;
984
984
  this.autoFilter = value.autoFilter;
985
985
  this._media = value.media.map(medium => new Image(this, medium));
@@ -62,7 +62,7 @@ class BaseXform {
62
62
  // ============================================================
63
63
  reset() {
64
64
  // to make sure parses don't bleed to next iteration
65
- this.model = null;
65
+ this.model = undefined;
66
66
  // if we have a map - reset them too
67
67
  if (this.map) {
68
68
  Object.values(this.map).forEach(xform => {
@@ -57,7 +57,7 @@ function isValidRange(range) {
57
57
  return false;
58
58
  }
59
59
  // Extract the cell reference part (after the sheet name if present)
60
- const cellRef = range.split("!").pop() || "";
60
+ const cellRef = range.split("!").pop() ?? "";
61
61
  // Must match one of the valid patterns
62
62
  if (!cellRangeRegexp.test(cellRef) &&
63
63
  !rowRangeRegexp.test(cellRef) &&
@@ -93,7 +93,7 @@ function extractRanges(parsedText) {
93
93
  if (!item) {
94
94
  return;
95
95
  }
96
- const quotes = (item.match(/'/g) || []).length;
96
+ const quotes = (item.match(/'/g) ?? []).length;
97
97
  if (!quotes) {
98
98
  if (quotesOpened) {
99
99
  last += `${item},`;
@@ -2,10 +2,10 @@ import { BaseXform } from "../base-xform.js";
2
2
  class WorkbookViewXform extends BaseXform {
3
3
  render(xmlStream, model) {
4
4
  const attributes = {
5
- xWindow: model.x || 0,
6
- yWindow: model.y || 0,
7
- windowWidth: model.width || 12000,
8
- windowHeight: model.height || 24000,
5
+ xWindow: model.x ?? 0,
6
+ yWindow: model.y ?? 0,
7
+ windowWidth: model.width ?? 12000,
8
+ windowHeight: model.height ?? 24000,
9
9
  firstSheet: model.firstSheet,
10
10
  activeTab: model.activeTab
11
11
  };
@@ -74,7 +74,7 @@ class WorkbookXform extends BaseXform {
74
74
  if (printAreas.length) {
75
75
  model.definedNames = model.definedNames.concat(printAreas);
76
76
  }
77
- (model.media || []).forEach((medium, i) => {
77
+ (model.media ?? []).forEach((medium, i) => {
78
78
  // assign name
79
79
  medium.name = medium.type + (i + 1);
80
80
  });
@@ -88,7 +88,19 @@ class WorkbookXform extends BaseXform {
88
88
  this.map.sheets.render(xmlStream, model.sheets);
89
89
  this.map.definedNames.render(xmlStream, model.definedNames);
90
90
  this.map.calcPr.render(xmlStream, model.calcProperties);
91
- this.map.pivotCaches.render(xmlStream, model.pivotTables);
91
+ // R9-B6: Deduplicate pivot caches by cacheId before rendering.
92
+ // Multiple pivot tables may share the same cache, but workbook.xml should
93
+ // only list each cache once in <pivotCaches>.
94
+ const pivotTables = model.pivotTables ?? [];
95
+ const seenCacheIds = new Set();
96
+ const uniquePivotCaches = pivotTables.filter((pt) => {
97
+ if (seenCacheIds.has(pt.cacheId)) {
98
+ return false;
99
+ }
100
+ seenCacheIds.add(pt.cacheId);
101
+ return true;
102
+ });
103
+ this.map.pivotCaches.render(xmlStream, uniquePivotCaches);
92
104
  xmlStream.closeNode();
93
105
  }
94
106
  parseOpen(node) {
@@ -140,7 +152,7 @@ class WorkbookXform extends BaseXform {
140
152
  }
141
153
  }
142
154
  reconcile(model) {
143
- const rels = (model.workbookRels || []).reduce((map, rel) => {
155
+ const rels = (model.workbookRels ?? []).reduce((map, rel) => {
144
156
  map[rel.Id] = rel;
145
157
  return map;
146
158
  }, {});
@@ -148,7 +160,7 @@ class WorkbookXform extends BaseXform {
148
160
  const worksheets = [];
149
161
  let worksheet;
150
162
  let index = 0;
151
- (model.sheets || []).forEach((sheet) => {
163
+ (model.sheets ?? []).forEach((sheet) => {
152
164
  const rel = rels[sheet.rId];
153
165
  if (!rel) {
154
166
  return;
@@ -6,7 +6,7 @@ class VmlPositionXform extends BaseXform {
6
6
  this.model = {};
7
7
  }
8
8
  get tag() {
9
- return (this._model && this._model.tag) || "";
9
+ return this._model?.tag ?? "";
10
10
  }
11
11
  render(xmlStream, model, type) {
12
12
  if (type && model === type[2]) {
@@ -6,7 +6,7 @@ class VmlProtectionXform extends BaseXform {
6
6
  this.text = "";
7
7
  }
8
8
  get tag() {
9
- return (this._model && this._model.tag) || "";
9
+ return this._model?.tag ?? "";
10
10
  }
11
11
  render(xmlStream, model) {
12
12
  xmlStream.leafNode(this.tag, null, model);
@@ -13,7 +13,7 @@ class VmlShapeXform extends BaseXform {
13
13
  return "v:shape";
14
14
  }
15
15
  render(xmlStream, model, index) {
16
- xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index || 0));
16
+ xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index ?? 0));
17
17
  xmlStream.leafNode("v:fill", { color2: "infoBackground [80]" });
18
18
  xmlStream.leafNode("v:shadow", { color: "none [81]", obscured: "t" });
19
19
  xmlStream.leafNode("v:path", { "o:connecttype": "none" });
@@ -11,7 +11,7 @@ class VmlTextboxXform extends BaseXform {
11
11
  return `${(parseFloat(value.toString()) * multiple).toFixed(2)}${unit}`;
12
12
  }
13
13
  reverseConversionUnit(inset) {
14
- return (inset || "").split(",").map(margin => {
14
+ return (inset ?? "").split(",").map(margin => {
15
15
  return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, "")).toFixed(2));
16
16
  });
17
17
  }
@@ -21,7 +21,7 @@ class AppXform extends BaseXform {
21
21
  xmlStream.leafNode("ScaleCrop", undefined, "false");
22
22
  this.map.HeadingPairs.render(xmlStream, model.worksheets);
23
23
  this.map.TitlesOfParts.render(xmlStream, model.worksheets);
24
- this.map.Company.render(xmlStream, model.company || "");
24
+ this.map.Company.render(xmlStream, model.company ?? "");
25
25
  this.map.Manager.render(xmlStream, model.manager);
26
26
  xmlStream.leafNode("LinksUpToDate", undefined, "false");
27
27
  xmlStream.leafNode("SharedDoc", undefined, "false");
@@ -8,7 +8,7 @@ class ContentTypesXform extends BaseXform {
8
8
  xmlStream.openXml(XmlStream.StdDocAttributes);
9
9
  xmlStream.openNode("Types", ContentTypesXform.PROPERTY_ATTRIBUTES);
10
10
  const mediaHash = {};
11
- (model.media || []).forEach((medium) => {
11
+ (model.media ?? []).forEach((medium) => {
12
12
  if (medium.type === "image") {
13
13
  const imageType = medium.extension;
14
14
  if (!mediaHash[imageType]) {
@@ -37,18 +37,31 @@ class ContentTypesXform extends BaseXform {
37
37
  ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
38
38
  });
39
39
  });
40
- if ((model.pivotTables || []).length) {
40
+ if ((model.pivotTables ?? []).length) {
41
+ // R9-B6: Deduplicate cache content types by cacheId. When multiple pivot tables
42
+ // share the same cache, the cache definition/records files are written only once.
43
+ const writtenCacheIds = new Set();
41
44
  // Add content types for each pivot table
42
- (model.pivotTables || []).forEach((pivotTable) => {
45
+ (model.pivotTables ?? []).forEach((pivotTable) => {
43
46
  const n = pivotTable.tableNumber;
44
- xmlStream.leafNode("Override", {
45
- PartName: toContentTypesPartName(pivotCacheDefinitionPath(n)),
46
- ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
47
- });
48
- xmlStream.leafNode("Override", {
49
- PartName: toContentTypesPartName(pivotCacheRecordsPath(n)),
50
- ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
51
- });
47
+ const cacheId = pivotTable.cacheId;
48
+ if (!writtenCacheIds.has(cacheId)) {
49
+ writtenCacheIds.add(cacheId);
50
+ xmlStream.leafNode("Override", {
51
+ PartName: toContentTypesPartName(pivotCacheDefinitionPath(n)),
52
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
53
+ });
54
+ // R9-B5: Only register cacheRecords content type when the file actually exists.
55
+ // Loaded pivot tables may lack cacheRecords (e.g. OLAP sources).
56
+ const hasCacheRecords = pivotTable.isLoaded ? !!pivotTable.cacheRecords : true;
57
+ if (hasCacheRecords) {
58
+ xmlStream.leafNode("Override", {
59
+ PartName: toContentTypesPartName(pivotCacheRecordsPath(n)),
60
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
61
+ });
62
+ }
63
+ }
64
+ // Each pivot table always has its own file
52
65
  xmlStream.leafNode("Override", {
53
66
  PartName: toContentTypesPartName(pivotTablePath(n)),
54
67
  ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"
@@ -10,7 +10,7 @@ class BaseCellAnchorXform extends BaseXform {
10
10
  this.reset();
11
11
  this.model = {
12
12
  range: {
13
- editAs: node.attributes.editAs || "oneCell"
13
+ editAs: node.attributes.editAs ?? "oneCell"
14
14
  }
15
15
  };
16
16
  break;
@@ -19,8 +19,8 @@ class ExtXform extends BaseXform {
19
19
  parseOpen(node) {
20
20
  if (node.name === this.tag) {
21
21
  this.model = {
22
- width: parseInt(node.attributes.cx || "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
23
- height: parseInt(node.attributes.cy || "0", 10) / EMU_PER_PIXEL_AT_96_DPI
22
+ width: parseInt(node.attributes.cx ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
23
+ height: parseInt(node.attributes.cy ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI
24
24
  };
25
25
  return true;
26
26
  }
@@ -20,7 +20,7 @@ class OneCellAnchorXform extends BaseCellAnchorXform {
20
20
  this.map["xdr:pic"].prepare(model.picture, options);
21
21
  }
22
22
  render(xmlStream, model) {
23
- xmlStream.openNode(this.tag, { editAs: model.range.editAs || "oneCell" });
23
+ xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
24
24
  this.map["xdr:from"].render(xmlStream, model.range.tl);
25
25
  this.map["xdr:ext"].render(xmlStream, model.range.ext);
26
26
  this.map["xdr:pic"].render(xmlStream, model.picture);
@@ -37,7 +37,7 @@ class TwoCellAnchorXform extends BaseCellAnchorXform {
37
37
  : {})
38
38
  });
39
39
  }
40
- xmlStream.openNode(this.tag, { editAs: model.range.editAs || "oneCell" });
40
+ xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
41
41
  this.map["xdr:from"].render(xmlStream, model.range.tl);
42
42
  this.map["xdr:to"].render(xmlStream, model.range.br);
43
43
  if (model.picture) {
@@ -6,7 +6,7 @@ class ListXform extends BaseXform {
6
6
  this.always = !!options.always;
7
7
  this.count = options.count;
8
8
  this.empty = options.empty;
9
- this.$count = options.$count || "count";
9
+ this.$count = options.$count ?? "count";
10
10
  this.$ = options.$;
11
11
  this.childXform = options.childXform;
12
12
  this.maxItems = options.maxItems;
@@ -24,10 +24,10 @@ class ListXform extends BaseXform {
24
24
  if (this.always || (model && model.length)) {
25
25
  xmlStream.openNode(this.tag, this.$);
26
26
  if (this.count) {
27
- xmlStream.addAttribute(this.$count, (model && model.length) || 0);
27
+ xmlStream.addAttribute(this.$count, model?.length ?? 0);
28
28
  }
29
29
  const { childXform } = this;
30
- (model || []).forEach((childModel, index) => {
30
+ (model ?? []).forEach((childModel, index) => {
31
31
  childXform.render(xmlStream, childModel, index);
32
32
  });
33
33
  xmlStream.closeNode();