@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
@@ -2,8 +2,7 @@ import { BaseXform } from "@excel/xlsx/xform/base-xform";
2
2
  interface FilterModel {
3
3
  val: string;
4
4
  }
5
- declare class FilterXform extends BaseXform {
6
- model: FilterModel;
5
+ declare class FilterXform extends BaseXform<FilterModel> {
7
6
  constructor();
8
7
  get tag(): string;
9
8
  render(xmlStream: any, model: FilterModel): void;
@@ -6,8 +6,7 @@ interface TableColumnModel {
6
6
  totalsRowFunction?: string;
7
7
  dxfId?: string;
8
8
  }
9
- declare class TableColumnXform extends BaseXform {
10
- model: TableColumnModel;
9
+ declare class TableColumnXform extends BaseXform<TableColumnModel> {
11
10
  constructor();
12
11
  get tag(): string;
13
12
  prepare(model: TableColumnModel, options: {
@@ -6,8 +6,7 @@ interface TableStyleModel {
6
6
  showRowStripes: boolean;
7
7
  showColumnStripes: boolean;
8
8
  }
9
- declare class TableStyleInfoXform extends BaseXform {
10
- model: TableStyleModel;
9
+ declare class TableStyleInfoXform extends BaseXform<TableStyleModel> {
11
10
  constructor();
12
11
  get tag(): string;
13
12
  render(xmlStream: any, model: TableStyleModel): void;
@@ -12,12 +12,11 @@ interface TableModel {
12
12
  autoFilterRef?: string;
13
13
  style?: any;
14
14
  }
15
- declare class TableXform extends BaseXform {
15
+ declare class TableXform extends BaseXform<TableModel> {
16
16
  map: {
17
17
  [key: string]: any;
18
18
  };
19
19
  parser: any;
20
- model: TableModel;
21
20
  constructor();
22
21
  prepare(model: TableModel, options: any): void;
23
22
  get tag(): string;
@@ -8,6 +8,7 @@
8
8
  * - prepareModel: Prepare model for writing
9
9
  * - loadFromFiles: Load from pre-extracted ZIP data
10
10
  */
11
+ import type { PivotTableSubtotal } from "@excel/pivot-table";
11
12
  import { type IEventEmitter } from "@stream";
12
13
  import type { Workbook } from "@excel/workbook";
13
14
  import type { ZipTimestampMode } from "@archive/utils/timestamps";
@@ -195,7 +196,10 @@ declare class XLSX {
195
196
  protected _buildDefinitionToCacheIdMap(model: any): Map<string, number>;
196
197
  protected _determineMetric(dataFields: Array<{
197
198
  subtotal?: string;
198
- }>): "sum" | "count";
199
+ }>): PivotTableSubtotal;
200
+ protected _determineValueMetrics(dataFields: Array<{
201
+ subtotal?: string;
202
+ }>, defaultMetric: PivotTableSubtotal): PivotTableSubtotal[];
199
203
  _processWorksheetEntry(stream: IParseStream, model: any, sheetNo: number, options: XlsxOptions | undefined, path: string): Promise<void>;
200
204
  _processCommentEntry(stream: IParseStream, model: any, name: string): Promise<void>;
201
205
  _processTableEntry(stream: IParseStream, model: any, name: string): Promise<void>;
@@ -216,7 +220,6 @@ declare class XLSX {
216
220
  _processPivotTableEntry(stream: IParseStream, model: any, name: string): Promise<void>;
217
221
  _processPivotTableRelsEntry(stream: IParseStream, model: any, name: string): Promise<void>;
218
222
  _processPivotCacheDefinitionEntry(stream: IParseStream, model: any, name: string): Promise<void>;
219
- _processPivotCacheDefinitionRelsEntry(stream: IParseStream, model: any, name: string): Promise<void>;
220
223
  _processPivotCacheRecordsEntry(stream: IParseStream, model: any, name: string): Promise<void>;
221
224
  loadFromFiles(zipData: Record<string, Uint8Array>, options?: any): Promise<any>;
222
225
  /**
@@ -324,7 +324,6 @@ class XLSX {
324
324
  pivotTables: {},
325
325
  pivotTableRels: {},
326
326
  pivotCacheDefinitions: {},
327
- pivotCacheDefinitionRels: {},
328
327
  pivotCacheRecords: {},
329
328
  // Passthrough storage for unknown/unsupported files (charts, etc.)
330
329
  passthrough: {}
@@ -548,7 +547,7 @@ class XLSX {
548
547
  o[rel.Id] = rel;
549
548
  return o;
550
549
  }, {});
551
- (drawing.anchors || []).forEach((anchor) => {
550
+ (drawing.anchors ?? []).forEach((anchor) => {
552
551
  const hyperlinks = anchor.picture && anchor.picture.hyperlinks;
553
552
  if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {
554
553
  hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;
@@ -608,13 +607,12 @@ class XLSX {
608
607
  delete model.drawingRels;
609
608
  delete model.vmlDrawings;
610
609
  delete model.pivotTableRels;
611
- delete model.pivotCacheDefinitionRels;
612
610
  }
613
611
  /**
614
612
  * Reconcile pivot tables by linking them to worksheets and their cache data.
615
613
  */
616
614
  _reconcilePivotTables(model) {
617
- const rawPivotTables = model.pivotTables || {};
615
+ const rawPivotTables = (model.pivotTables || {});
618
616
  if (typeof rawPivotTables !== "object" || Object.keys(rawPivotTables).length === 0) {
619
617
  model.pivotTables = [];
620
618
  model.pivotTablesIndexed = {};
@@ -635,29 +633,33 @@ class XLSX {
635
633
  });
636
634
  const loadedPivotTables = [];
637
635
  const pivotTablesIndexed = {};
638
- Object.entries(rawPivotTables).forEach(([pivotName, pivotTable]) => {
639
- const pt = pivotTable;
636
+ Object.entries(rawPivotTables).forEach(([pivotName, pt]) => {
640
637
  const tableNumber = this._extractTableNumber(pivotName);
641
638
  const cacheData = cacheMap.get(pt.cacheId);
639
+ const defaultMetric = this._determineMetric(pt.dataFields);
642
640
  const completePivotTable = {
643
641
  ...pt,
644
642
  tableNumber,
643
+ cacheId: String(pt.cacheId),
645
644
  cacheDefinition: cacheData?.definition,
646
645
  cacheRecords: cacheData?.records,
647
- cacheFields: cacheData?.definition?.cacheFields || [],
646
+ cacheFields: cacheData?.definition?.cacheFields ?? [],
648
647
  rows: pt.rowFields.filter(f => f >= 0),
649
648
  columns: pt.colFields.filter(f => f >= 0 && f !== -2),
650
649
  values: pt.dataFields.map(df => df.fld),
651
- metric: this._determineMetric(pt.dataFields),
652
- applyWidthHeightFormats: pt.applyWidthHeightFormats || "0"
650
+ pages: pt.pageFields.map(pf => pf.fld),
651
+ metric: defaultMetric,
652
+ valueMetrics: this._determineValueMetrics(pt.dataFields, defaultMetric),
653
+ applyWidthHeightFormats: pt.applyWidthHeightFormats === "1" ? "1" : "0"
653
654
  };
654
655
  loadedPivotTables.push(completePivotTable);
656
+ // Key format (e.g., "../pivotTables/pivotTable1.xml") matches worksheet .rels Target values,
657
+ // allowing worksheet reconciliation to look up pivot tables by their relationship target path.
655
658
  pivotTablesIndexed[pivotTableRelTargetFromWorksheetName(pivotName)] = completePivotTable;
656
659
  });
657
660
  loadedPivotTables.sort((a, b) => a.tableNumber - b.tableNumber);
658
661
  model.pivotTables = loadedPivotTables;
659
662
  model.pivotTablesIndexed = pivotTablesIndexed;
660
- model.loadedPivotTables = loadedPivotTables;
661
663
  }
662
664
  _extractTableNumber(name) {
663
665
  const match = name.match(/pivotTable(\d+)/);
@@ -665,7 +667,7 @@ class XLSX {
665
667
  }
666
668
  _buildCacheIdMap(model) {
667
669
  const rIdToCacheId = new Map();
668
- const pivotCaches = model.pivotCaches || [];
670
+ const pivotCaches = model.pivotCaches ?? [];
669
671
  for (const cache of pivotCaches) {
670
672
  if (cache.cacheId && cache.rId) {
671
673
  rIdToCacheId.set(cache.rId, parseInt(cache.cacheId, 10));
@@ -676,7 +678,7 @@ class XLSX {
676
678
  _buildDefinitionToCacheIdMap(model) {
677
679
  const definitionToCacheId = new Map();
678
680
  const rIdToCacheId = this._buildCacheIdMap(model);
679
- const workbookRels = model.workbookRels || [];
681
+ const workbookRels = model.workbookRels ?? [];
680
682
  for (const rel of workbookRels) {
681
683
  if (rel.Type === XLSX.RelType.PivotCacheDefinition && rel.Target) {
682
684
  const match = rel.Target.match(/pivotCacheDefinition(\d+)\.xml/);
@@ -692,11 +694,14 @@ class XLSX {
692
694
  return definitionToCacheId;
693
695
  }
694
696
  _determineMetric(dataFields) {
695
- if (dataFields.length > 0 && dataFields[0].subtotal === "count") {
696
- return "count";
697
+ if (dataFields.length > 0 && dataFields[0].subtotal) {
698
+ return dataFields[0].subtotal;
697
699
  }
698
700
  return "sum";
699
701
  }
702
+ _determineValueMetrics(dataFields, defaultMetric) {
703
+ return dataFields.map(df => df.subtotal || defaultMetric);
704
+ }
700
705
  // ===========================================================================
701
706
  // Process Entry methods - shared by all platforms
702
707
  // ===========================================================================
@@ -839,11 +844,6 @@ class XLSX {
839
844
  model.pivotCacheDefinitions[name] = cacheDefinition;
840
845
  }
841
846
  }
842
- async _processPivotCacheDefinitionRelsEntry(stream, model, name) {
843
- const xform = new RelationshipsXform();
844
- const relationships = await xform.parseStream(stream);
845
- model.pivotCacheDefinitionRels[name] = relationships;
846
- }
847
847
  async _processPivotCacheRecordsEntry(stream, model, name) {
848
848
  const xform = new PivotCacheRecordsXform();
849
849
  const cacheRecords = await xform.parseStream(stream);
@@ -943,9 +943,11 @@ class XLSX {
943
943
  await this._processPivotCacheDefinitionEntry(stream, model, pivotCacheDefinitionName);
944
944
  return true;
945
945
  }
946
+ // R9-B8: Skip parsing pivotCacheDefinition .rels files — they are never used
947
+ // during reconciliation and were just deleted at cleanup. The cache definition's
948
+ // r:id attribute (preserved in ParsedCacheDefinition.rId) is sufficient.
946
949
  const pivotCacheDefinitionRelsName = getPivotCacheDefinitionNameFromRelsPath(entryName);
947
950
  if (pivotCacheDefinitionRelsName) {
948
- await this._processPivotCacheDefinitionRelsEntry(stream, model, pivotCacheDefinitionRelsName);
949
951
  return true;
950
952
  }
951
953
  const pivotCacheRecordsName = getPivotCacheRecordsNameFromPath(entryName);
@@ -1028,13 +1030,25 @@ class XLSX {
1028
1030
  Target: OOXML_REL_TARGETS.workbookFeaturePropertyBag
1029
1031
  });
1030
1032
  }
1031
- (model.pivotTables || []).forEach((pivotTable) => {
1032
- pivotTable.rId = `rId${count++}`;
1033
- relationships.push({
1034
- Id: pivotTable.rId,
1035
- Type: XLSX.RelType.PivotCacheDefinition,
1036
- Target: pivotCacheDefinitionRelTargetFromWorkbook(pivotTable.tableNumber)
1037
- });
1033
+ // R9-B6: Deduplicate pivot cache relationships by cacheId. When multiple pivot
1034
+ // tables share the same cache, only one workbook relationship should be created.
1035
+ // Also assigns rId to each pivot table (R9-B7: typed on PivotTable interface).
1036
+ const seenCacheIds = new Map(); // cacheId → rId
1037
+ (model.pivotTables ?? []).forEach((pivotTable) => {
1038
+ const existing = seenCacheIds.get(pivotTable.cacheId);
1039
+ if (existing) {
1040
+ // Shared cache: reuse the rId from the first pivot table with this cacheId
1041
+ pivotTable.rId = existing;
1042
+ }
1043
+ else {
1044
+ pivotTable.rId = `rId${count++}`;
1045
+ seenCacheIds.set(pivotTable.cacheId, pivotTable.rId);
1046
+ relationships.push({
1047
+ Id: pivotTable.rId,
1048
+ Type: XLSX.RelType.PivotCacheDefinition,
1049
+ Target: pivotCacheDefinitionRelTargetFromWorkbook(pivotTable.tableNumber)
1050
+ });
1051
+ }
1038
1052
  });
1039
1053
  model.worksheets.forEach((worksheet, index) => {
1040
1054
  worksheet.rId = `rId${count++}`;
@@ -1129,7 +1143,7 @@ class XLSX {
1129
1143
  else {
1130
1144
  // Use regenerated XML for normal drawings (images, shapes)
1131
1145
  // Filter out invalid anchors (null, undefined, or missing content)
1132
- const filteredAnchors = (drawing.anchors || []).filter((a) => {
1146
+ const filteredAnchors = (drawing.anchors ?? []).filter((a) => {
1133
1147
  if (a == null) {
1134
1148
  return false;
1135
1149
  }
@@ -1187,40 +1201,60 @@ class XLSX {
1187
1201
  const pivotCacheDefinitionXform = new PivotCacheDefinitionXform();
1188
1202
  const pivotTableXform = new PivotTableXform();
1189
1203
  const relsXform = new RelationshipsXform();
1204
+ // R9-B6: Track which cacheIds have already been written to avoid duplicating
1205
+ // shared caches. Maps cacheId → tableNumber used for the cache file names.
1206
+ const writtenCaches = new Map();
1190
1207
  model.pivotTables.forEach((pivotTable) => {
1191
1208
  const n = pivotTable.tableNumber;
1192
1209
  const isLoaded = pivotTable.isLoaded;
1193
- if (isLoaded) {
1194
- if (pivotTable.cacheDefinition) {
1195
- const xml = pivotCacheDefinitionXform.toXml(pivotTable.cacheDefinition);
1196
- zip.append(xml, { name: pivotCacheDefinitionPath(n) });
1210
+ const cacheId = pivotTable.cacheId;
1211
+ // R9-B6: Only write cache definition/records/rels once per unique cacheId.
1212
+ const cacheAlreadyWritten = writtenCaches.has(cacheId);
1213
+ if (!cacheAlreadyWritten) {
1214
+ writtenCaches.set(cacheId, n);
1215
+ if (isLoaded) {
1216
+ if (pivotTable.cacheDefinition) {
1217
+ const xml = pivotCacheDefinitionXform.toXml(pivotTable.cacheDefinition);
1218
+ zip.append(xml, { name: pivotCacheDefinitionPath(n) });
1219
+ }
1220
+ if (pivotTable.cacheRecords) {
1221
+ const xml = pivotCacheRecordsXform.toXml(pivotTable.cacheRecords);
1222
+ zip.append(xml, { name: pivotCacheRecordsPath(n) });
1223
+ }
1197
1224
  }
1198
- if (pivotTable.cacheRecords) {
1199
- const xml = pivotCacheRecordsXform.toXml(pivotTable.cacheRecords);
1225
+ else {
1226
+ let xml = pivotCacheRecordsXform.toXml(pivotTable);
1200
1227
  zip.append(xml, { name: pivotCacheRecordsPath(n) });
1228
+ xml = pivotCacheDefinitionXform.toXml(pivotTable);
1229
+ zip.append(xml, { name: pivotCacheDefinitionPath(n) });
1201
1230
  }
1202
- }
1203
- else {
1204
- let xml = pivotCacheRecordsXform.toXml(pivotTable);
1205
- zip.append(xml, { name: pivotCacheRecordsPath(n) });
1206
- xml = pivotCacheDefinitionXform.toXml(pivotTable);
1207
- zip.append(xml, { name: pivotCacheDefinitionPath(n) });
1208
- }
1209
- let xml = relsXform.toXml([
1210
- {
1211
- Id: "rId1",
1212
- Type: XLSX.RelType.PivotCacheRecords,
1213
- Target: pivotCacheRecordsRelTarget(n)
1231
+ // R9-B4: Only write cache definition rels when cache records exist.
1232
+ // For loaded pivot tables without cacheRecords (e.g. OLAP), skip the rels file entirely.
1233
+ // R9-B3: Use the rId from the loaded cache definition to stay consistent with the XML.
1234
+ const hasCacheRecords = isLoaded ? !!pivotTable.cacheRecords : true;
1235
+ if (hasCacheRecords) {
1236
+ const cacheRecordsRId = (isLoaded ? pivotTable.cacheDefinition?.rId : undefined) ?? "rId1";
1237
+ const xml = relsXform.toXml([
1238
+ {
1239
+ Id: cacheRecordsRId,
1240
+ Type: XLSX.RelType.PivotCacheRecords,
1241
+ Target: pivotCacheRecordsRelTarget(n)
1242
+ }
1243
+ ]);
1244
+ zip.append(xml, { name: pivotCacheDefinitionRelsPath(n) });
1214
1245
  }
1215
- ]);
1216
- zip.append(xml, { name: pivotCacheDefinitionRelsPath(n) });
1217
- xml = pivotTableXform.toXml(pivotTable);
1246
+ }
1247
+ // Pivot table XML is always written (each pivot table has its own file).
1248
+ let xml = pivotTableXform.toXml(pivotTable);
1218
1249
  zip.append(xml, { name: pivotTablePath(n) });
1250
+ // Pivot table rels point to the cache definition file. For shared caches,
1251
+ // use the tableNumber of the first pivot table that wrote the cache.
1252
+ const cacheTableNumber = writtenCaches.get(cacheId);
1219
1253
  xml = relsXform.toXml([
1220
1254
  {
1221
1255
  Id: "rId1",
1222
1256
  Type: XLSX.RelType.PivotCacheDefinition,
1223
- Target: pivotCacheDefinitionRelTargetFromPivotTable(n)
1257
+ Target: pivotCacheDefinitionRelTargetFromPivotTable(cacheTableNumber)
1224
1258
  }
1225
1259
  ]);
1226
1260
  zip.append(xml, { name: pivotTableRelsPath(n) });
@@ -1236,10 +1270,10 @@ class XLSX {
1236
1270
  });
1237
1271
  }
1238
1272
  prepareModel(model, options) {
1239
- model.creator = model.creator || "ExcelTS";
1240
- model.lastModifiedBy = model.lastModifiedBy || "ExcelTS";
1241
- model.created = model.created || new Date();
1242
- model.modified = model.modified || new Date();
1273
+ model.creator = model.creator ?? "ExcelTS";
1274
+ model.lastModifiedBy = model.lastModifiedBy ?? "ExcelTS";
1275
+ model.created = model.created ?? new Date();
1276
+ model.modified = model.modified ?? new Date();
1243
1277
  model.useSharedStrings =
1244
1278
  options.useSharedStrings !== undefined ? options.useSharedStrings : true;
1245
1279
  model.useStyles = options.useStyles !== undefined ? options.useStyles : true;
@@ -7,8 +7,3 @@
7
7
  * Returns true if process.versions.node exists
8
8
  */
9
9
  export declare function isNode(): boolean;
10
- /**
11
- * Check if running in browser environment
12
- * Returns true if window and document are defined
13
- */
14
- export declare function isBrowser(): boolean;
@@ -9,10 +9,3 @@
9
9
  export function isNode() {
10
10
  return typeof process !== "undefined" && !!process.versions?.node;
11
11
  }
12
- /**
13
- * Check if running in browser environment
14
- * Returns true if window and document are defined
15
- */
16
- export function isBrowser() {
17
- return typeof window !== "undefined" && typeof document !== "undefined";
18
- }
@@ -9,17 +9,14 @@
9
9
  */
10
10
  export declare function base64ToUint8Array(base64: string): Uint8Array;
11
11
  export declare function delay(ms: number): Promise<void>;
12
- export declare function nop(): void;
13
- export declare const inherits: <T extends new (...args: any[]) => any, S extends new (...args: any[]) => any>(cls: T, superCtor: S, statics?: any, prototype?: any) => void;
14
12
  export declare function dateToExcel(d: Date, date1904?: boolean): number;
15
13
  export declare function excelToDate(v: number, date1904?: boolean): Date;
16
- export declare function toIsoDateString(dt: Date): string;
17
- interface PathInfo {
18
- path: string;
19
- name: string;
20
- }
21
- export declare function parsePath(filepath: string): PathInfo;
22
- export declare function getRelsPath(filepath: string): string;
14
+ /**
15
+ * Parse an OOXML date string into a Date object.
16
+ * OOXML dates like "2024-01-15T00:00:00" lack a timezone suffix,
17
+ * which some JS engines parse as local time. Appending "Z" forces UTC.
18
+ */
19
+ export declare function parseOoxmlDate(raw: string): Date;
23
20
  export declare function xmlDecode(text: string): string;
24
21
  /**
25
22
  * Encode special characters for XML output
@@ -28,10 +25,9 @@ export declare function xmlDecode(text: string): string;
28
25
  export declare function xmlEncode(text: string): string;
29
26
  export declare function validInt(value: string | number): number;
30
27
  export declare function isDateFmt(fmt: string | null | undefined): boolean;
31
- export declare function parseBoolean(value: any): boolean;
28
+ export declare function parseBoolean(value: unknown): boolean;
32
29
  export declare function range(start: number, stop: number, step?: number): Generator<number>;
33
- export declare function toSortedArray(values: Iterable<any>): any[];
34
- export declare function objectFromProps<T = any>(props: string[], value?: T | null): Record<string, T | null>;
30
+ export declare function toSortedArray<T>(values: Iterable<T>): T[];
35
31
  /**
36
32
  * Convert a Buffer, ArrayBuffer, or Uint8Array to a UTF-8 string
37
33
  * Works in both Node.js and browser environments
@@ -46,4 +42,3 @@ export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
46
42
  * Convert string to UTF-16LE Uint8Array (used for Excel password hashing)
47
43
  */
48
44
  export declare function stringToUtf16Le(str: string): Uint8Array;
49
- export {};
@@ -30,33 +30,6 @@ export function base64ToUint8Array(base64) {
30
30
  export function delay(ms) {
31
31
  return new Promise(resolve => setTimeout(resolve, ms));
32
32
  }
33
- export function nop() { }
34
- export const inherits = function (cls, superCtor, statics, prototype) {
35
- cls.super_ = superCtor;
36
- if (!prototype) {
37
- prototype = statics;
38
- statics = null;
39
- }
40
- if (statics) {
41
- Object.keys(statics).forEach(i => {
42
- Object.defineProperty(cls, i, Object.getOwnPropertyDescriptor(statics, i));
43
- });
44
- }
45
- const properties = {
46
- constructor: {
47
- value: cls,
48
- enumerable: false,
49
- writable: false,
50
- configurable: true
51
- }
52
- };
53
- if (prototype) {
54
- Object.keys(prototype).forEach(i => {
55
- properties[i] = Object.getOwnPropertyDescriptor(prototype, i);
56
- });
57
- }
58
- cls.prototype = Object.create(superCtor.prototype, properties);
59
- };
60
33
  // =============================================================================
61
34
  // Date utilities
62
35
  // =============================================================================
@@ -67,19 +40,13 @@ export function excelToDate(v, date1904) {
67
40
  const millisecondSinceEpoch = Math.round((v - 25569 + (date1904 ? 1462 : 0)) * 24 * 3600 * 1000);
68
41
  return new Date(millisecondSinceEpoch);
69
42
  }
70
- export function toIsoDateString(dt) {
71
- return dt.toISOString().substr(0, 10);
72
- }
73
- export function parsePath(filepath) {
74
- const last = filepath.lastIndexOf("/");
75
- return {
76
- path: filepath.substring(0, last),
77
- name: filepath.substring(last + 1)
78
- };
79
- }
80
- export function getRelsPath(filepath) {
81
- const path = parsePath(filepath);
82
- return `${path.path}/_rels/${path.name}.rels`;
43
+ /**
44
+ * Parse an OOXML date string into a Date object.
45
+ * OOXML dates like "2024-01-15T00:00:00" lack a timezone suffix,
46
+ * which some JS engines parse as local time. Appending "Z" forces UTC.
47
+ */
48
+ export function parseOoxmlDate(raw) {
49
+ return new Date(raw.endsWith("Z") ? raw : raw + "Z");
83
50
  }
84
51
  // =============================================================================
85
52
  // XML utilities
@@ -199,17 +166,43 @@ export function* range(start, stop, step = 1) {
199
166
  }
200
167
  export function toSortedArray(values) {
201
168
  const result = Array.from(values);
202
- // If all numbers, use numeric sort
169
+ if (result.length <= 1) {
170
+ return result;
171
+ }
172
+ // All numbers → numeric sort
203
173
  if (result.every(item => Number.isFinite(item))) {
204
174
  return result.sort((a, b) => a - b);
205
175
  }
206
- return result.sort();
176
+ // All Dates → chronological sort
177
+ if (result.every(item => item instanceof Date)) {
178
+ return result.sort((a, b) => a.getTime() - b.getTime());
179
+ }
180
+ // Mixed types → type-aware sort: numbers first (numerically), then dates (chronologically), then strings (lexicographic)
181
+ return result.sort((a, b) => {
182
+ const ta = sortTypeRank(a);
183
+ const tb = sortTypeRank(b);
184
+ if (ta !== tb) {
185
+ return ta - tb;
186
+ }
187
+ // Same type group
188
+ if (ta === 0) {
189
+ return a - b;
190
+ }
191
+ if (ta === 1) {
192
+ return a.getTime() - b.getTime();
193
+ }
194
+ return String(a).localeCompare(String(b));
195
+ });
207
196
  }
208
- export function objectFromProps(props, value = null) {
209
- return props.reduce((result, property) => {
210
- result[property] = value;
211
- return result;
212
- }, {});
197
+ /** Rank for mixed-type sort: numbers=0, dates=1, everything else=2 */
198
+ function sortTypeRank(v) {
199
+ if (Number.isFinite(v)) {
200
+ return 0;
201
+ }
202
+ if (v instanceof Date) {
203
+ return 1;
204
+ }
205
+ return 2;
213
206
  }
214
207
  // =============================================================================
215
208
  // Buffer utilities (cross-platform)
@@ -2,5 +2,5 @@
2
2
  * Browser utility functions
3
3
  * Re-exports shared utilities and adds browser-specific implementations
4
4
  */
5
- export { delay, nop, inherits, dateToExcel, excelToDate, toIsoDateString, parsePath, getRelsPath, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, objectFromProps, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "@utils/utils.base";
5
+ export { delay, dateToExcel, excelToDate, parseOoxmlDate, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "@utils/utils.base";
6
6
  export declare function fileExists(_path: string): Promise<boolean>;
@@ -3,7 +3,7 @@
3
3
  * Re-exports shared utilities and adds browser-specific implementations
4
4
  */
5
5
  // Re-export all shared utilities
6
- export { delay, nop, inherits, dateToExcel, excelToDate, toIsoDateString, parsePath, getRelsPath, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, objectFromProps, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "./utils.base.js";
6
+ export { delay, dateToExcel, excelToDate, parseOoxmlDate, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "./utils.base.js";
7
7
  // =============================================================================
8
8
  // File system utilities (Browser stub - always returns false)
9
9
  // =============================================================================
@@ -2,5 +2,5 @@
2
2
  * Node.js utility functions
3
3
  * Re-exports shared utilities and adds Node.js-specific implementations
4
4
  */
5
- export { delay, nop, inherits, dateToExcel, excelToDate, toIsoDateString, parsePath, getRelsPath, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, objectFromProps, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "@utils/utils.base";
5
+ export { delay, dateToExcel, excelToDate, parseOoxmlDate, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "@utils/utils.base";
6
6
  export declare function fileExists(path: string): Promise<boolean>;
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import fs from "fs";
6
6
  // Re-export all shared utilities
7
- export { delay, nop, inherits, dateToExcel, excelToDate, toIsoDateString, parsePath, getRelsPath, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, objectFromProps, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "./utils.base.js";
7
+ export { delay, dateToExcel, excelToDate, parseOoxmlDate, xmlDecode, xmlEncode, validInt, isDateFmt, parseBoolean, range, toSortedArray, bufferToString, base64ToUint8Array, uint8ArrayToBase64, stringToUtf16Le } from "./utils.base.js";
8
8
  // =============================================================================
9
9
  // File system utilities (Node.js only)
10
10
  // =============================================================================