@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
@@ -36,7 +36,7 @@ class StringBuf {
36
36
  return this._buffer;
37
37
  }
38
38
  reset(position) {
39
- position = position || 0;
39
+ position = position ?? 0;
40
40
  this._buffer = undefined;
41
41
  this._inPos = position;
42
42
  }
@@ -233,8 +233,8 @@ class Workbook {
233
233
  // ===========================================================================
234
234
  get model() {
235
235
  return {
236
- creator: this.creator || "Unknown",
237
- lastModifiedBy: this.lastModifiedBy || "Unknown",
236
+ creator: this.creator ?? "Unknown",
237
+ lastModifiedBy: this.lastModifiedBy ?? "Unknown",
238
238
  lastPrinted: this.lastPrinted,
239
239
  created: this.created,
240
240
  modified: this.modified,
@@ -296,10 +296,9 @@ class Workbook {
296
296
  this._definedNames.model = value.definedNames;
297
297
  this.views = value.views;
298
298
  this._themes = value.themes;
299
- this.media = value.media || [];
299
+ this.media = value.media ?? [];
300
300
  // Handle pivot tables - either newly created or loaded from file
301
- // Loaded pivot tables come from loadedPivotTables after reconciliation
302
- this.pivotTables = value.pivotTables || value.loadedPivotTables || [];
301
+ this.pivotTables = value.pivotTables ?? [];
303
302
  // Preserve passthrough files (charts, etc.) for round-trip preservation
304
303
  this._passthrough = value.passthrough || {};
305
304
  // Preserve raw drawing data for drawings with chart references
@@ -24,12 +24,12 @@ class Worksheet {
24
24
  options = options || {};
25
25
  this._workbook = options.workbook;
26
26
  // in a workbook, each sheet will have a number
27
- this.id = options.id || 0;
28
- this.orderNo = options.orderNo || 0;
27
+ this.id = options.id ?? 0;
28
+ this.orderNo = options.orderNo ?? 0;
29
29
  // and a name - use the setter to ensure validation and truncation
30
30
  this.name = options.name || `sheet${this.id}`;
31
31
  // add a state
32
- this.state = options.state || "visible";
32
+ this.state = options.state ?? "visible";
33
33
  // rows allows access organised by row. Sparse array of arrays indexed by row-1, col
34
34
  // Note: _rows is zero based. Must subtract 1 to go from cell.row to index
35
35
  this._rows = [];
@@ -89,8 +89,8 @@ class Worksheet {
89
89
  }, options.headerFooter);
90
90
  this.dataValidations = new data_validations_1.DataValidations();
91
91
  // for freezepanes, split, zoom, gridlines, etc
92
- this.views = options.views || [];
93
- this.autoFilter = options.autoFilter || null;
92
+ this.views = options.views ?? [];
93
+ this.autoFilter = options.autoFilter ?? null;
94
94
  // for images, etc
95
95
  this._media = [];
96
96
  // worksheet protection
@@ -253,7 +253,7 @@ class Worksheet {
253
253
  if (inserts.length > 0) {
254
254
  // must iterate over all rows whether they exist yet or not
255
255
  for (let i = 0; i < nRows; i++) {
256
- const insertValues = inserts.map(insert => insert[i] || null);
256
+ const insertValues = inserts.map(insert => insert[i] ?? null);
257
257
  const row = this.getRow(i + 1);
258
258
  row.splice(start, count, ...insertValues);
259
259
  }
@@ -933,7 +933,7 @@ class Worksheet {
933
933
  };
934
934
  // =================================================
935
935
  // columns
936
- model.cols = column_1.Column.toModel(this.columns || []);
936
+ model.cols = column_1.Column.toModel(this.columns ?? []);
937
937
  // ==========================================================
938
938
  // Rows
939
939
  const rows = (model.rows = []);
@@ -981,8 +981,8 @@ class Worksheet {
981
981
  this.properties = value.properties;
982
982
  this.pageSetup = value.pageSetup;
983
983
  this.headerFooter = value.headerFooter;
984
- this.rowBreaks = value.rowBreaks || [];
985
- this.colBreaks = value.colBreaks || [];
984
+ this.rowBreaks = value.rowBreaks ?? [];
985
+ this.colBreaks = value.colBreaks ?? [];
986
986
  this.views = value.views;
987
987
  this.autoFilter = value.autoFilter;
988
988
  this._media = value.media.map(medium => new image_1.Image(this, medium));
@@ -65,7 +65,7 @@ class BaseXform {
65
65
  // ============================================================
66
66
  reset() {
67
67
  // to make sure parses don't bleed to next iteration
68
- this.model = null;
68
+ this.model = undefined;
69
69
  // if we have a map - reset them too
70
70
  if (this.map) {
71
71
  Object.values(this.map).forEach(xform => {
@@ -61,7 +61,7 @@ function isValidRange(range) {
61
61
  return false;
62
62
  }
63
63
  // Extract the cell reference part (after the sheet name if present)
64
- const cellRef = range.split("!").pop() || "";
64
+ const cellRef = range.split("!").pop() ?? "";
65
65
  // Must match one of the valid patterns
66
66
  if (!cellRangeRegexp.test(cellRef) &&
67
67
  !rowRangeRegexp.test(cellRef) &&
@@ -97,7 +97,7 @@ function extractRanges(parsedText) {
97
97
  if (!item) {
98
98
  return;
99
99
  }
100
- const quotes = (item.match(/'/g) || []).length;
100
+ const quotes = (item.match(/'/g) ?? []).length;
101
101
  if (!quotes) {
102
102
  if (quotesOpened) {
103
103
  last += `${item},`;
@@ -5,10 +5,10 @@ const base_xform_1 = require("../base-xform.js");
5
5
  class WorkbookViewXform extends base_xform_1.BaseXform {
6
6
  render(xmlStream, model) {
7
7
  const attributes = {
8
- xWindow: model.x || 0,
9
- yWindow: model.y || 0,
10
- windowWidth: model.width || 12000,
11
- windowHeight: model.height || 24000,
8
+ xWindow: model.x ?? 0,
9
+ yWindow: model.y ?? 0,
10
+ windowWidth: model.width ?? 12000,
11
+ windowHeight: model.height ?? 24000,
12
12
  firstSheet: model.firstSheet,
13
13
  activeTab: model.activeTab
14
14
  };
@@ -77,7 +77,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
77
77
  if (printAreas.length) {
78
78
  model.definedNames = model.definedNames.concat(printAreas);
79
79
  }
80
- (model.media || []).forEach((medium, i) => {
80
+ (model.media ?? []).forEach((medium, i) => {
81
81
  // assign name
82
82
  medium.name = medium.type + (i + 1);
83
83
  });
@@ -91,7 +91,19 @@ class WorkbookXform extends base_xform_1.BaseXform {
91
91
  this.map.sheets.render(xmlStream, model.sheets);
92
92
  this.map.definedNames.render(xmlStream, model.definedNames);
93
93
  this.map.calcPr.render(xmlStream, model.calcProperties);
94
- this.map.pivotCaches.render(xmlStream, model.pivotTables);
94
+ // R9-B6: Deduplicate pivot caches by cacheId before rendering.
95
+ // Multiple pivot tables may share the same cache, but workbook.xml should
96
+ // only list each cache once in <pivotCaches>.
97
+ const pivotTables = model.pivotTables ?? [];
98
+ const seenCacheIds = new Set();
99
+ const uniquePivotCaches = pivotTables.filter((pt) => {
100
+ if (seenCacheIds.has(pt.cacheId)) {
101
+ return false;
102
+ }
103
+ seenCacheIds.add(pt.cacheId);
104
+ return true;
105
+ });
106
+ this.map.pivotCaches.render(xmlStream, uniquePivotCaches);
95
107
  xmlStream.closeNode();
96
108
  }
97
109
  parseOpen(node) {
@@ -143,7 +155,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
143
155
  }
144
156
  }
145
157
  reconcile(model) {
146
- const rels = (model.workbookRels || []).reduce((map, rel) => {
158
+ const rels = (model.workbookRels ?? []).reduce((map, rel) => {
147
159
  map[rel.Id] = rel;
148
160
  return map;
149
161
  }, {});
@@ -151,7 +163,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
151
163
  const worksheets = [];
152
164
  let worksheet;
153
165
  let index = 0;
154
- (model.sheets || []).forEach((sheet) => {
166
+ (model.sheets ?? []).forEach((sheet) => {
155
167
  const rel = rels[sheet.rId];
156
168
  if (!rel) {
157
169
  return;
@@ -9,7 +9,7 @@ class VmlPositionXform extends base_xform_1.BaseXform {
9
9
  this.model = {};
10
10
  }
11
11
  get tag() {
12
- return (this._model && this._model.tag) || "";
12
+ return this._model?.tag ?? "";
13
13
  }
14
14
  render(xmlStream, model, type) {
15
15
  if (type && model === type[2]) {
@@ -9,7 +9,7 @@ class VmlProtectionXform extends base_xform_1.BaseXform {
9
9
  this.text = "";
10
10
  }
11
11
  get tag() {
12
- return (this._model && this._model.tag) || "";
12
+ return this._model?.tag ?? "";
13
13
  }
14
14
  render(xmlStream, model) {
15
15
  xmlStream.leafNode(this.tag, null, model);
@@ -16,7 +16,7 @@ class VmlShapeXform extends base_xform_1.BaseXform {
16
16
  return "v:shape";
17
17
  }
18
18
  render(xmlStream, model, index) {
19
- xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index || 0));
19
+ xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index ?? 0));
20
20
  xmlStream.leafNode("v:fill", { color2: "infoBackground [80]" });
21
21
  xmlStream.leafNode("v:shadow", { color: "none [81]", obscured: "t" });
22
22
  xmlStream.leafNode("v:path", { "o:connecttype": "none" });
@@ -14,7 +14,7 @@ class VmlTextboxXform extends base_xform_1.BaseXform {
14
14
  return `${(parseFloat(value.toString()) * multiple).toFixed(2)}${unit}`;
15
15
  }
16
16
  reverseConversionUnit(inset) {
17
- return (inset || "").split(",").map(margin => {
17
+ return (inset ?? "").split(",").map(margin => {
18
18
  return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, "")).toFixed(2));
19
19
  });
20
20
  }
@@ -24,7 +24,7 @@ class AppXform extends base_xform_1.BaseXform {
24
24
  xmlStream.leafNode("ScaleCrop", undefined, "false");
25
25
  this.map.HeadingPairs.render(xmlStream, model.worksheets);
26
26
  this.map.TitlesOfParts.render(xmlStream, model.worksheets);
27
- this.map.Company.render(xmlStream, model.company || "");
27
+ this.map.Company.render(xmlStream, model.company ?? "");
28
28
  this.map.Manager.render(xmlStream, model.manager);
29
29
  xmlStream.leafNode("LinksUpToDate", undefined, "false");
30
30
  xmlStream.leafNode("SharedDoc", undefined, "false");
@@ -11,7 +11,7 @@ class ContentTypesXform extends base_xform_1.BaseXform {
11
11
  xmlStream.openXml(xml_stream_1.XmlStream.StdDocAttributes);
12
12
  xmlStream.openNode("Types", ContentTypesXform.PROPERTY_ATTRIBUTES);
13
13
  const mediaHash = {};
14
- (model.media || []).forEach((medium) => {
14
+ (model.media ?? []).forEach((medium) => {
15
15
  if (medium.type === "image") {
16
16
  const imageType = medium.extension;
17
17
  if (!mediaHash[imageType]) {
@@ -40,18 +40,31 @@ class ContentTypesXform extends base_xform_1.BaseXform {
40
40
  ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
41
41
  });
42
42
  });
43
- if ((model.pivotTables || []).length) {
43
+ if ((model.pivotTables ?? []).length) {
44
+ // R9-B6: Deduplicate cache content types by cacheId. When multiple pivot tables
45
+ // share the same cache, the cache definition/records files are written only once.
46
+ const writtenCacheIds = new Set();
44
47
  // Add content types for each pivot table
45
- (model.pivotTables || []).forEach((pivotTable) => {
48
+ (model.pivotTables ?? []).forEach((pivotTable) => {
46
49
  const n = pivotTable.tableNumber;
47
- xmlStream.leafNode("Override", {
48
- PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheDefinitionPath)(n)),
49
- ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
50
- });
51
- xmlStream.leafNode("Override", {
52
- PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheRecordsPath)(n)),
53
- ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
54
- });
50
+ const cacheId = pivotTable.cacheId;
51
+ if (!writtenCacheIds.has(cacheId)) {
52
+ writtenCacheIds.add(cacheId);
53
+ xmlStream.leafNode("Override", {
54
+ PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheDefinitionPath)(n)),
55
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
56
+ });
57
+ // R9-B5: Only register cacheRecords content type when the file actually exists.
58
+ // Loaded pivot tables may lack cacheRecords (e.g. OLAP sources).
59
+ const hasCacheRecords = pivotTable.isLoaded ? !!pivotTable.cacheRecords : true;
60
+ if (hasCacheRecords) {
61
+ xmlStream.leafNode("Override", {
62
+ PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheRecordsPath)(n)),
63
+ ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
64
+ });
65
+ }
66
+ }
67
+ // Each pivot table always has its own file
55
68
  xmlStream.leafNode("Override", {
56
69
  PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotTablePath)(n)),
57
70
  ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"
@@ -13,7 +13,7 @@ class BaseCellAnchorXform extends base_xform_1.BaseXform {
13
13
  this.reset();
14
14
  this.model = {
15
15
  range: {
16
- editAs: node.attributes.editAs || "oneCell"
16
+ editAs: node.attributes.editAs ?? "oneCell"
17
17
  }
18
18
  };
19
19
  break;
@@ -22,8 +22,8 @@ class ExtXform extends base_xform_1.BaseXform {
22
22
  parseOpen(node) {
23
23
  if (node.name === this.tag) {
24
24
  this.model = {
25
- width: parseInt(node.attributes.cx || "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
26
- height: parseInt(node.attributes.cy || "0", 10) / EMU_PER_PIXEL_AT_96_DPI
25
+ width: parseInt(node.attributes.cx ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
26
+ height: parseInt(node.attributes.cy ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI
27
27
  };
28
28
  return true;
29
29
  }
@@ -23,7 +23,7 @@ class OneCellAnchorXform extends base_cell_anchor_xform_1.BaseCellAnchorXform {
23
23
  this.map["xdr:pic"].prepare(model.picture, options);
24
24
  }
25
25
  render(xmlStream, model) {
26
- xmlStream.openNode(this.tag, { editAs: model.range.editAs || "oneCell" });
26
+ xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
27
27
  this.map["xdr:from"].render(xmlStream, model.range.tl);
28
28
  this.map["xdr:ext"].render(xmlStream, model.range.ext);
29
29
  this.map["xdr:pic"].render(xmlStream, model.picture);
@@ -40,7 +40,7 @@ class TwoCellAnchorXform extends base_cell_anchor_xform_1.BaseCellAnchorXform {
40
40
  : {})
41
41
  });
42
42
  }
43
- xmlStream.openNode(this.tag, { editAs: model.range.editAs || "oneCell" });
43
+ xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
44
44
  this.map["xdr:from"].render(xmlStream, model.range.tl);
45
45
  this.map["xdr:to"].render(xmlStream, model.range.br);
46
46
  if (model.picture) {
@@ -9,7 +9,7 @@ class ListXform extends base_xform_1.BaseXform {
9
9
  this.always = !!options.always;
10
10
  this.count = options.count;
11
11
  this.empty = options.empty;
12
- this.$count = options.$count || "count";
12
+ this.$count = options.$count ?? "count";
13
13
  this.$ = options.$;
14
14
  this.childXform = options.childXform;
15
15
  this.maxItems = options.maxItems;
@@ -27,10 +27,10 @@ class ListXform extends base_xform_1.BaseXform {
27
27
  if (this.always || (model && model.length)) {
28
28
  xmlStream.openNode(this.tag, this.$);
29
29
  if (this.count) {
30
- xmlStream.addAttribute(this.$count, (model && model.length) || 0);
30
+ xmlStream.addAttribute(this.$count, model?.length ?? 0);
31
31
  }
32
32
  const { childXform } = this;
33
- (model || []).forEach((childModel, index) => {
33
+ (model ?? []).forEach((childModel, index) => {
34
34
  childXform.render(xmlStream, childModel, index);
35
35
  });
36
36
  xmlStream.closeNode();
@@ -2,7 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CacheFieldXform = void 0;
4
4
  const base_xform_1 = require("../base-xform.js");
5
+ const pivot_table_1 = require("../../../pivot-table.js");
5
6
  const utils_1 = require("../../../../../utils/utils.js");
7
+ const raw_xml_collector_1 = require("./raw-xml-collector.js");
8
+ /** Attribute keys on <cacheField> that are individually parsed (not collected into extraAttrs). */
9
+ const KNOWN_CACHE_FIELD_KEYS = new Set(["name", "numFmtId"]);
6
10
  /**
7
11
  * Xform for parsing individual <cacheField> elements within a pivot cache definition.
8
12
  *
@@ -25,8 +29,9 @@ const utils_1 = require("../../../../../utils/utils.js");
25
29
  class CacheFieldXform extends base_xform_1.BaseXform {
26
30
  constructor() {
27
31
  super();
28
- this.model = null;
29
32
  this.inSharedItems = false;
33
+ this.fieldGroupCollector = new raw_xml_collector_1.RawXmlCollector("fieldGroup");
34
+ this.model = null;
30
35
  }
31
36
  get tag() {
32
37
  return "cacheField";
@@ -34,89 +39,123 @@ class CacheFieldXform extends base_xform_1.BaseXform {
34
39
  reset() {
35
40
  this.model = null;
36
41
  this.inSharedItems = false;
42
+ this.fieldGroupCollector.reset();
37
43
  }
38
44
  parseOpen(node) {
39
45
  const { name, attributes } = node;
46
+ // Collect fieldGroup XML verbatim for roundtrip preservation
47
+ if (this.fieldGroupCollector.active) {
48
+ this.fieldGroupCollector.feedOpen(name, attributes);
49
+ return true;
50
+ }
40
51
  switch (name) {
41
- case "cacheField":
52
+ case "cacheField": {
42
53
  // Initialize the model with field name
54
+ // Collect unknown attributes into extraAttrs bag for roundtrip preservation
55
+ const extraAttrs = {};
56
+ for (const [k, v] of Object.entries(attributes)) {
57
+ if (!KNOWN_CACHE_FIELD_KEYS.has(k)) {
58
+ extraAttrs[k] = String(v);
59
+ }
60
+ }
43
61
  this.model = {
44
- name: (0, utils_1.xmlDecode)(attributes.name || ""),
45
- sharedItems: null
62
+ name: attributes.name ?? "",
63
+ sharedItems: null,
64
+ numFmtId: attributes.numFmtId,
65
+ isLoaded: true,
66
+ extraAttrs: Object.keys(extraAttrs).length > 0 ? extraAttrs : undefined
46
67
  };
47
68
  break;
69
+ }
70
+ case "fieldGroup":
71
+ // Start collecting fieldGroup XML for roundtrip preservation
72
+ if (this.model) {
73
+ this.fieldGroupCollector.start(attributes);
74
+ }
75
+ break;
48
76
  case "sharedItems":
49
77
  this.inSharedItems = true;
50
78
  // Store numeric field metadata
51
79
  if (this.model) {
52
- this.model.containsNumber = attributes.containsNumber === "1";
53
- this.model.containsInteger = attributes.containsInteger === "1";
80
+ // R8-B4: Store containsNumber/containsInteger as raw strings for roundtrip fidelity.
81
+ // Previously "0" was lost because it was parsed as undefined.
82
+ if (attributes.containsNumber !== undefined) {
83
+ this.model.containsNumber = attributes.containsNumber;
84
+ }
85
+ if (attributes.containsInteger !== undefined) {
86
+ this.model.containsInteger = attributes.containsInteger;
87
+ }
88
+ // R8-B7: Guard against NaN from malformed minValue/maxValue
54
89
  if (attributes.minValue !== undefined) {
55
- this.model.minValue = parseFloat(attributes.minValue);
90
+ const parsed = parseFloat(attributes.minValue);
91
+ if (Number.isFinite(parsed)) {
92
+ this.model.minValue = parsed;
93
+ }
56
94
  }
57
95
  if (attributes.maxValue !== undefined) {
58
- this.model.maxValue = parseFloat(attributes.maxValue);
96
+ const parsed = parseFloat(attributes.maxValue);
97
+ if (Number.isFinite(parsed)) {
98
+ this.model.maxValue = parsed;
99
+ }
100
+ }
101
+ // Preserve original sharedItems type attributes for roundtrip fidelity.
102
+ // These are stored as raw strings so we can re-emit them exactly as loaded.
103
+ if (attributes.containsSemiMixedTypes !== undefined) {
104
+ this.model.containsSemiMixedTypes = attributes.containsSemiMixedTypes;
105
+ }
106
+ if (attributes.containsNonDate !== undefined) {
107
+ this.model.containsNonDate = attributes.containsNonDate;
108
+ }
109
+ if (attributes.containsString !== undefined) {
110
+ this.model.containsString = attributes.containsString;
59
111
  }
60
- // Initialize sharedItems array if count > 0 (for both string and numeric fields)
61
- const count = parseInt(attributes.count || "0", 10);
62
- if (count > 0) {
63
- this.model.sharedItems = [];
112
+ if (attributes.containsBlank !== undefined) {
113
+ this.model.containsBlank = attributes.containsBlank;
64
114
  }
65
- else {
66
- // No count means no individual items (pure numeric field)
67
- this.model.sharedItems = null;
115
+ if (attributes.containsDate !== undefined) {
116
+ this.model.containsDate = attributes.containsDate;
68
117
  }
118
+ if (attributes.containsMixedTypes !== undefined) {
119
+ this.model.containsMixedTypes = attributes.containsMixedTypes;
120
+ }
121
+ // Initialize sharedItems array when sharedItems element is present.
122
+ // count="0" means an explicitly empty shared items list (not the same as absent).
123
+ // No count attribute also gets an empty array since the <sharedItems> element
124
+ // itself is present — child elements (<s>, <n>, etc.) will be pushed into it.
125
+ this.model.sharedItems = [];
69
126
  }
70
127
  break;
71
128
  case "s":
72
- // String value in sharedItems
73
- if (this.inSharedItems && this.model?.sharedItems !== null) {
74
- // Decode XML entities in the value
75
- const value = (0, utils_1.xmlDecode)(attributes.v || "");
76
- this.model.sharedItems.push(value);
77
- }
78
- break;
79
129
  case "n":
80
- // Numeric value in sharedItems (less common, but possible)
81
- if (this.inSharedItems && this.model?.sharedItems !== null) {
82
- const value = parseFloat(attributes.v || "0");
83
- this.model.sharedItems.push(value);
84
- }
85
- break;
86
130
  case "b":
87
- // Boolean value in sharedItems
88
- if (this.inSharedItems && this.model?.sharedItems !== null) {
89
- const value = attributes.v === "1";
90
- this.model.sharedItems.push(value);
91
- }
92
- break;
93
131
  case "e":
94
- // Error value in sharedItems
95
- if (this.inSharedItems && this.model?.sharedItems !== null) {
96
- const value = `#${attributes.v || "ERROR!"}`;
97
- this.model.sharedItems.push(value);
98
- }
99
- break;
100
132
  case "m":
101
- // Missing/null value in sharedItems
102
- if (this.inSharedItems && this.model?.sharedItems !== null) {
103
- this.model.sharedItems.push(null);
104
- }
105
- break;
106
133
  case "d":
107
- // Date value in sharedItems
108
- if (this.inSharedItems && this.model?.sharedItems !== null) {
109
- const value = new Date(attributes.v || "");
110
- this.model.sharedItems.push(value);
134
+ // Shared item value push to sharedItems array if we're inside <sharedItems>
135
+ if (this.inSharedItems && this.model && this.model.sharedItems !== null) {
136
+ this.model.sharedItems.push(parseSharedItemValue(name, attributes));
111
137
  }
112
138
  break;
113
139
  }
114
140
  return true;
115
141
  }
116
- parseText(_text) {
117
- // No text content in cacheField elements
142
+ parseText(text) {
143
+ // Forward text to active collector (B3 fix: text nodes in fieldGroup)
144
+ if (this.fieldGroupCollector.active) {
145
+ this.fieldGroupCollector.feedText(text);
146
+ }
118
147
  }
119
148
  parseClose(name) {
149
+ // Handle fieldGroup collection — close tags
150
+ if (this.fieldGroupCollector.active) {
151
+ if (this.fieldGroupCollector.feedClose(name)) {
152
+ if (this.model) {
153
+ this.model.fieldGroupXml = this.fieldGroupCollector.result;
154
+ }
155
+ this.fieldGroupCollector.reset();
156
+ }
157
+ return true;
158
+ }
120
159
  switch (name) {
121
160
  case "cacheField":
122
161
  // End of this cacheField element
@@ -129,3 +168,46 @@ class CacheFieldXform extends base_xform_1.BaseXform {
129
168
  }
130
169
  }
131
170
  exports.CacheFieldXform = CacheFieldXform;
171
+ // ---------------------------------------------------------------------------
172
+ // Helpers
173
+ // ---------------------------------------------------------------------------
174
+ /**
175
+ * Convert a SAX-parsed shared item element into its typed value.
176
+ *
177
+ * Tag mapping:
178
+ * - `s` → string
179
+ * - `n` → number
180
+ * - `b` → boolean
181
+ * - `e` → PivotErrorValue
182
+ * - `m` → null (missing)
183
+ * - `d` → Date (UTC)
184
+ */
185
+ function parseSharedItemValue(tag, attributes) {
186
+ switch (tag) {
187
+ case "s":
188
+ return attributes.v ?? "";
189
+ case "n":
190
+ // Missing v attribute → treat as null (missing) rather than fabricating 0
191
+ if (attributes.v === undefined || attributes.v === "") {
192
+ return null;
193
+ }
194
+ return parseFloat(attributes.v);
195
+ case "b":
196
+ return attributes.v === "1";
197
+ case "e":
198
+ return new pivot_table_1.PivotErrorValue(attributes.v ?? "");
199
+ case "m":
200
+ return null;
201
+ case "d": {
202
+ // Missing/empty v attribute → treat as missing value (null) to avoid Invalid Date
203
+ if (!attributes.v) {
204
+ return null;
205
+ }
206
+ // R8-B13: Guard against Invalid Date from malformed date strings
207
+ const date = (0, utils_1.parseOoxmlDate)(attributes.v);
208
+ return isNaN(date.getTime()) ? null : date;
209
+ }
210
+ default:
211
+ return null;
212
+ }
213
+ }