@rowsncolumns/toolkit 24.4.1

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 (456) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +27 -0
  3. package/dist/cjs/autofilter-condition.d.ts +43 -0
  4. package/dist/cjs/autofilter-condition.d.ts.map +1 -0
  5. package/dist/cjs/autofilter-condition.js +155 -0
  6. package/dist/cjs/csv-export.d.ts +49 -0
  7. package/dist/cjs/csv-export.d.ts.map +1 -0
  8. package/dist/cjs/csv-export.js +142 -0
  9. package/dist/cjs/csv-import-worker.d.ts +16 -0
  10. package/dist/cjs/csv-import-worker.d.ts.map +1 -0
  11. package/dist/cjs/csv-import-worker.js +60 -0
  12. package/dist/cjs/csv-import.d.ts +38 -0
  13. package/dist/cjs/csv-import.d.ts.map +1 -0
  14. package/dist/cjs/csv-import.js +166 -0
  15. package/dist/cjs/csv-parser/helpers.d.ts +14 -0
  16. package/dist/cjs/csv-parser/helpers.d.ts.map +1 -0
  17. package/dist/cjs/csv-parser/helpers.js +145 -0
  18. package/dist/cjs/csv-parser/types.d.ts +66 -0
  19. package/dist/cjs/csv-parser/types.d.ts.map +1 -0
  20. package/dist/cjs/csv-parser/types.js +14 -0
  21. package/dist/cjs/csv-parser/worker.d.ts +2 -0
  22. package/dist/cjs/csv-parser/worker.d.ts.map +1 -0
  23. package/dist/cjs/csv-parser/worker.js +200 -0
  24. package/dist/cjs/excel-export.d.ts +11 -0
  25. package/dist/cjs/excel-export.d.ts.map +1 -0
  26. package/dist/cjs/excel-export.js +22 -0
  27. package/dist/cjs/excel-import-session.d.ts +51 -0
  28. package/dist/cjs/excel-import-session.d.ts.map +1 -0
  29. package/dist/cjs/excel-import-session.js +307 -0
  30. package/dist/cjs/excel-import-worker.d.ts +7 -0
  31. package/dist/cjs/excel-import-worker.d.ts.map +1 -0
  32. package/dist/cjs/excel-import-worker.js +119 -0
  33. package/dist/cjs/excel-parser/builtin-numfmts.d.ts +24 -0
  34. package/dist/cjs/excel-parser/builtin-numfmts.d.ts.map +1 -0
  35. package/dist/cjs/excel-parser/builtin-numfmts.js +63 -0
  36. package/dist/cjs/excel-parser/cfb-decryptor.d.ts +53 -0
  37. package/dist/cjs/excel-parser/cfb-decryptor.d.ts.map +1 -0
  38. package/dist/cjs/excel-parser/cfb-decryptor.js +553 -0
  39. package/dist/cjs/excel-parser/cfb-encryptor.d.ts +23 -0
  40. package/dist/cjs/excel-parser/cfb-encryptor.d.ts.map +1 -0
  41. package/dist/cjs/excel-parser/cfb-encryptor.js +200 -0
  42. package/dist/cjs/excel-parser/dv-cell-stamp.d.ts +29 -0
  43. package/dist/cjs/excel-parser/dv-cell-stamp.d.ts.map +1 -0
  44. package/dist/cjs/excel-parser/dv-cell-stamp.js +239 -0
  45. package/dist/cjs/excel-parser/helpers.d.ts +28 -0
  46. package/dist/cjs/excel-parser/helpers.d.ts.map +1 -0
  47. package/dist/cjs/excel-parser/helpers.js +188 -0
  48. package/dist/cjs/excel-parser/interface.d.ts +179 -0
  49. package/dist/cjs/excel-parser/interface.d.ts.map +1 -0
  50. package/dist/cjs/excel-parser/interface.js +1 -0
  51. package/dist/cjs/excel-parser/plugins/base/index.d.ts +31 -0
  52. package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -0
  53. package/dist/cjs/excel-parser/plugins/base/index.js +101 -0
  54. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
  55. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
  56. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.js +488 -0
  57. package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts +15 -0
  58. package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
  59. package/dist/cjs/excel-parser/plugins/ods/data-validations.js +353 -0
  60. package/dist/cjs/excel-parser/plugins/ods/formula.d.ts +8 -0
  61. package/dist/cjs/excel-parser/plugins/ods/formula.d.ts.map +1 -0
  62. package/dist/cjs/excel-parser/plugins/ods/formula.js +82 -0
  63. package/dist/cjs/excel-parser/plugins/ods/index.d.ts +122 -0
  64. package/dist/cjs/excel-parser/plugins/ods/index.d.ts.map +1 -0
  65. package/dist/cjs/excel-parser/plugins/ods/index.js +3642 -0
  66. package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts +25 -0
  67. package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
  68. package/dist/cjs/excel-parser/plugins/ods/sparklines.js +221 -0
  69. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts +60 -0
  70. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts.map +1 -0
  71. package/dist/cjs/excel-parser/plugins/ods/styles.js +808 -0
  72. package/dist/cjs/excel-parser/plugins/ods/types.d.ts +7 -0
  73. package/dist/cjs/excel-parser/plugins/ods/types.d.ts.map +1 -0
  74. package/dist/cjs/excel-parser/plugins/ods/types.js +1 -0
  75. package/dist/cjs/excel-parser/plugins/xls/index.d.ts +5 -0
  76. package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -0
  77. package/dist/cjs/excel-parser/plugins/xls/index.js +19 -0
  78. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
  79. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
  80. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.js +49 -0
  81. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts +117 -0
  82. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
  83. package/dist/cjs/excel-parser/plugins/xlsb/index.js +2972 -0
  84. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
  85. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
  86. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.js +527 -0
  87. package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts +5 -0
  88. package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
  89. package/dist/cjs/excel-parser/plugins/xlsm/index.js +10 -0
  90. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts +60 -0
  91. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
  92. package/dist/cjs/excel-parser/plugins/xlsx/charts.js +2178 -0
  93. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
  94. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
  95. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.js +620 -0
  96. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
  97. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
  98. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.js +515 -0
  99. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
  100. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
  101. package/dist/cjs/excel-parser/plugins/xlsx/drawing.js +941 -0
  102. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +320 -0
  103. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
  104. package/dist/cjs/excel-parser/plugins/xlsx/index.js +6056 -0
  105. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
  106. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
  107. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.js +3 -0
  108. package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
  109. package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
  110. package/dist/cjs/excel-parser/plugins/xlsx/pivots.js +342 -0
  111. package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
  112. package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
  113. package/dist/cjs/excel-parser/plugins/xlsx/relationships.js +26 -0
  114. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
  115. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
  116. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.js +59 -0
  117. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +44 -0
  118. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
  119. package/dist/cjs/excel-parser/plugins/xlsx/styles.js +1377 -0
  120. package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts +50 -0
  121. package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
  122. package/dist/cjs/excel-parser/plugins/xlsx/theme.js +150 -0
  123. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
  124. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
  125. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.js +141 -0
  126. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
  127. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
  128. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.js +407 -0
  129. package/dist/cjs/excel-parser/registry.d.ts +5 -0
  130. package/dist/cjs/excel-parser/registry.d.ts.map +1 -0
  131. package/dist/cjs/excel-parser/registry.js +21 -0
  132. package/dist/cjs/excel-parser/style-registry.d.ts +51 -0
  133. package/dist/cjs/excel-parser/style-registry.d.ts.map +1 -0
  134. package/dist/cjs/excel-parser/style-registry.js +175 -0
  135. package/dist/cjs/excel-parser/theme-default.d.ts +3 -0
  136. package/dist/cjs/excel-parser/theme-default.d.ts.map +1 -0
  137. package/dist/cjs/excel-parser/theme-default.js +19 -0
  138. package/dist/cjs/excel-parser/types.d.ts +365 -0
  139. package/dist/cjs/excel-parser/types.d.ts.map +1 -0
  140. package/dist/cjs/excel-parser/types.js +59 -0
  141. package/dist/cjs/excel-parser/utils.d.ts +6 -0
  142. package/dist/cjs/excel-parser/utils.d.ts.map +1 -0
  143. package/dist/cjs/excel-parser/utils.js +30 -0
  144. package/dist/cjs/excel-parser/workbook.d.ts +51 -0
  145. package/dist/cjs/excel-parser/workbook.d.ts.map +1 -0
  146. package/dist/cjs/excel-parser/workbook.js +317 -0
  147. package/dist/cjs/excel-parser/worker.d.ts +2 -0
  148. package/dist/cjs/excel-parser/worker.d.ts.map +1 -0
  149. package/dist/cjs/excel-parser/worker.js +1149 -0
  150. package/dist/cjs/excel-parser/zip-parser-streaming.d.ts +13 -0
  151. package/dist/cjs/excel-parser/zip-parser-streaming.d.ts.map +1 -0
  152. package/dist/cjs/excel-parser/zip-parser-streaming.js +200 -0
  153. package/dist/cjs/excel-parser/zip-parser.d.ts +11 -0
  154. package/dist/cjs/excel-parser/zip-parser.d.ts.map +1 -0
  155. package/dist/cjs/excel-parser/zip-parser.js +49 -0
  156. package/dist/cjs/exporter/invalid-data-validation.d.ts +19 -0
  157. package/dist/cjs/exporter/invalid-data-validation.d.ts.map +1 -0
  158. package/dist/cjs/exporter/invalid-data-validation.js +39 -0
  159. package/dist/cjs/exporter/ods/ods-export.d.ts +26 -0
  160. package/dist/cjs/exporter/ods/ods-export.d.ts.map +1 -0
  161. package/dist/cjs/exporter/ods/ods-export.js +3714 -0
  162. package/dist/cjs/exporter/ods/sparkline-builder.d.ts +33 -0
  163. package/dist/cjs/exporter/ods/sparkline-builder.d.ts.map +1 -0
  164. package/dist/cjs/exporter/ods/sparkline-builder.js +221 -0
  165. package/dist/cjs/exporter/xlsx/chart-builder.d.ts +3 -0
  166. package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -0
  167. package/dist/cjs/exporter/xlsx/chart-builder.js +1901 -0
  168. package/dist/cjs/exporter/xlsx/chart-templates.d.ts +1781 -0
  169. package/dist/cjs/exporter/xlsx/chart-templates.d.ts.map +1 -0
  170. package/dist/cjs/exporter/xlsx/chart-templates.js +1798 -0
  171. package/dist/cjs/exporter/xlsx/future-functions.d.ts +10 -0
  172. package/dist/cjs/exporter/xlsx/future-functions.d.ts.map +1 -0
  173. package/dist/cjs/exporter/xlsx/future-functions.js +264 -0
  174. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts +58 -0
  175. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts.map +1 -0
  176. package/dist/cjs/exporter/xlsx/pivot-builder.js +277 -0
  177. package/dist/cjs/exporter/xlsx/power-query-builder.d.ts +26 -0
  178. package/dist/cjs/exporter/xlsx/power-query-builder.d.ts.map +1 -0
  179. package/dist/cjs/exporter/xlsx/power-query-builder.js +306 -0
  180. package/dist/cjs/exporter/xlsx/slicer-builder.d.ts +11 -0
  181. package/dist/cjs/exporter/xlsx/slicer-builder.d.ts.map +1 -0
  182. package/dist/cjs/exporter/xlsx/slicer-builder.js +87 -0
  183. package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts +61 -0
  184. package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
  185. package/dist/cjs/exporter/xlsx/sparkline-builder.js +489 -0
  186. package/dist/cjs/exporter/xlsx/style-builder.d.ts +93 -0
  187. package/dist/cjs/exporter/xlsx/style-builder.d.ts.map +1 -0
  188. package/dist/cjs/exporter/xlsx/style-builder.js +813 -0
  189. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
  190. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
  191. package/dist/cjs/exporter/xlsx/threaded-comments-builder.js +189 -0
  192. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +121 -0
  193. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -0
  194. package/dist/cjs/exporter/xlsx/xlsx-export.js +4596 -0
  195. package/dist/cjs/helpers/theme-xml-generator.d.ts +8 -0
  196. package/dist/cjs/helpers/theme-xml-generator.d.ts.map +1 -0
  197. package/dist/cjs/helpers/theme-xml-generator.js +33 -0
  198. package/dist/cjs/helpers.d.ts +34 -0
  199. package/dist/cjs/helpers.d.ts.map +1 -0
  200. package/dist/cjs/helpers.js +189 -0
  201. package/dist/cjs/index.d.ts +16 -0
  202. package/dist/cjs/index.d.ts.map +1 -0
  203. package/dist/cjs/index.js +15 -0
  204. package/dist/cjs/indexed-colors.d.ts +2 -0
  205. package/dist/cjs/indexed-colors.d.ts.map +1 -0
  206. package/dist/cjs/indexed-colors.js +75 -0
  207. package/dist/cjs/ods-export.d.ts +24 -0
  208. package/dist/cjs/ods-export.d.ts.map +1 -0
  209. package/dist/cjs/ods-export.js +23 -0
  210. package/dist/cjs/parse.d.ts +24 -0
  211. package/dist/cjs/parse.d.ts.map +1 -0
  212. package/dist/cjs/parse.js +68 -0
  213. package/dist/cjs/power-query.d.ts +41 -0
  214. package/dist/cjs/power-query.d.ts.map +1 -0
  215. package/dist/cjs/power-query.js +22 -0
  216. package/dist/cjs/server.d.ts +9 -0
  217. package/dist/cjs/server.d.ts.map +1 -0
  218. package/dist/cjs/server.js +8 -0
  219. package/dist/cjs/theme1.d.ts +3 -0
  220. package/dist/cjs/theme1.d.ts.map +1 -0
  221. package/dist/cjs/theme1.js +2 -0
  222. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  223. package/dist/cjs/types.d.ts +14 -0
  224. package/dist/cjs/types.d.ts.map +1 -0
  225. package/dist/cjs/types.js +14 -0
  226. package/dist/cjs/vitest.config.d.ts +3 -0
  227. package/dist/cjs/vitest.config.d.ts.map +1 -0
  228. package/dist/cjs/vitest.config.js +16 -0
  229. package/dist/esm/autofilter-condition.d.ts +43 -0
  230. package/dist/esm/autofilter-condition.d.ts.map +1 -0
  231. package/dist/esm/autofilter-condition.js +145 -0
  232. package/dist/esm/csv-export.d.ts +49 -0
  233. package/dist/esm/csv-export.d.ts.map +1 -0
  234. package/dist/esm/csv-export.js +126 -0
  235. package/dist/esm/csv-import-worker.d.ts +16 -0
  236. package/dist/esm/csv-import-worker.d.ts.map +1 -0
  237. package/dist/esm/csv-import-worker.js +60 -0
  238. package/dist/esm/csv-import.d.ts +38 -0
  239. package/dist/esm/csv-import.d.ts.map +1 -0
  240. package/dist/esm/csv-import.js +132 -0
  241. package/dist/esm/csv-parser/helpers.d.ts +14 -0
  242. package/dist/esm/csv-parser/helpers.d.ts.map +1 -0
  243. package/dist/esm/csv-parser/helpers.js +0 -0
  244. package/dist/esm/csv-parser/types.d.ts +66 -0
  245. package/dist/esm/csv-parser/types.d.ts.map +1 -0
  246. package/dist/esm/csv-parser/types.js +14 -0
  247. package/dist/esm/csv-parser/worker.d.ts +2 -0
  248. package/dist/esm/csv-parser/worker.d.ts.map +1 -0
  249. package/dist/esm/csv-parser/worker.js +154 -0
  250. package/dist/esm/excel-export.d.ts +11 -0
  251. package/dist/esm/excel-export.d.ts.map +1 -0
  252. package/dist/esm/excel-export.js +13 -0
  253. package/dist/esm/excel-import-session.d.ts +51 -0
  254. package/dist/esm/excel-import-session.d.ts.map +1 -0
  255. package/dist/esm/excel-import-session.js +255 -0
  256. package/dist/esm/excel-import-worker.d.ts +7 -0
  257. package/dist/esm/excel-import-worker.d.ts.map +1 -0
  258. package/dist/esm/excel-import-worker.js +116 -0
  259. package/dist/esm/excel-parser/builtin-numfmts.d.ts +24 -0
  260. package/dist/esm/excel-parser/builtin-numfmts.d.ts.map +1 -0
  261. package/dist/esm/excel-parser/builtin-numfmts.js +59 -0
  262. package/dist/esm/excel-parser/cfb-decryptor.d.ts +53 -0
  263. package/dist/esm/excel-parser/cfb-decryptor.d.ts.map +1 -0
  264. package/dist/esm/excel-parser/cfb-decryptor.js +493 -0
  265. package/dist/esm/excel-parser/cfb-encryptor.d.ts +23 -0
  266. package/dist/esm/excel-parser/cfb-encryptor.d.ts.map +1 -0
  267. package/dist/esm/excel-parser/cfb-encryptor.js +181 -0
  268. package/dist/esm/excel-parser/dv-cell-stamp.d.ts +29 -0
  269. package/dist/esm/excel-parser/dv-cell-stamp.d.ts.map +1 -0
  270. package/dist/esm/excel-parser/dv-cell-stamp.js +155 -0
  271. package/dist/esm/excel-parser/helpers.d.ts +28 -0
  272. package/dist/esm/excel-parser/helpers.d.ts.map +1 -0
  273. package/dist/esm/excel-parser/helpers.js +160 -0
  274. package/dist/esm/excel-parser/interface.d.ts +179 -0
  275. package/dist/esm/excel-parser/interface.d.ts.map +1 -0
  276. package/dist/esm/excel-parser/interface.js +1 -0
  277. package/dist/esm/excel-parser/plugins/base/index.d.ts +31 -0
  278. package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -0
  279. package/dist/esm/excel-parser/plugins/base/index.js +64 -0
  280. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
  281. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
  282. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.js +405 -0
  283. package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts +15 -0
  284. package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
  285. package/dist/esm/excel-parser/plugins/ods/data-validations.js +331 -0
  286. package/dist/esm/excel-parser/plugins/ods/formula.d.ts +8 -0
  287. package/dist/esm/excel-parser/plugins/ods/formula.d.ts.map +1 -0
  288. package/dist/esm/excel-parser/plugins/ods/formula.js +82 -0
  289. package/dist/esm/excel-parser/plugins/ods/index.d.ts +122 -0
  290. package/dist/esm/excel-parser/plugins/ods/index.d.ts.map +1 -0
  291. package/dist/esm/excel-parser/plugins/ods/index.js +2896 -0
  292. package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts +25 -0
  293. package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
  294. package/dist/esm/excel-parser/plugins/ods/sparklines.js +188 -0
  295. package/dist/esm/excel-parser/plugins/ods/styles.d.ts +60 -0
  296. package/dist/esm/excel-parser/plugins/ods/styles.d.ts.map +1 -0
  297. package/dist/esm/excel-parser/plugins/ods/styles.js +732 -0
  298. package/dist/esm/excel-parser/plugins/ods/types.d.ts +7 -0
  299. package/dist/esm/excel-parser/plugins/ods/types.d.ts.map +1 -0
  300. package/dist/esm/excel-parser/plugins/ods/types.js +1 -0
  301. package/dist/esm/excel-parser/plugins/xls/index.d.ts +5 -0
  302. package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -0
  303. package/dist/esm/excel-parser/plugins/xls/index.js +7 -0
  304. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
  305. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
  306. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.js +48 -0
  307. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts +117 -0
  308. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
  309. package/dist/esm/excel-parser/plugins/xlsb/index.js +2339 -0
  310. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
  311. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
  312. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.js +522 -0
  313. package/dist/esm/excel-parser/plugins/xlsm/index.d.ts +5 -0
  314. package/dist/esm/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
  315. package/dist/esm/excel-parser/plugins/xlsm/index.js +6 -0
  316. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts +60 -0
  317. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
  318. package/dist/esm/excel-parser/plugins/xlsx/charts.js +2036 -0
  319. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
  320. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
  321. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.js +621 -0
  322. package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
  323. package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
  324. package/dist/esm/excel-parser/plugins/xlsx/data-validations.js +493 -0
  325. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
  326. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
  327. package/dist/esm/excel-parser/plugins/xlsx/drawing.js +905 -0
  328. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +320 -0
  329. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
  330. package/dist/esm/excel-parser/plugins/xlsx/index.js +4654 -0
  331. package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
  332. package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
  333. package/dist/esm/excel-parser/plugins/xlsx/numfmt.js +3 -0
  334. package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
  335. package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
  336. package/dist/esm/excel-parser/plugins/xlsx/pivots.js +254 -0
  337. package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
  338. package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
  339. package/dist/esm/excel-parser/plugins/xlsx/relationships.js +13 -0
  340. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
  341. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
  342. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.js +64 -0
  343. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +44 -0
  344. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
  345. package/dist/esm/excel-parser/plugins/xlsx/styles.js +1365 -0
  346. package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts +50 -0
  347. package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
  348. package/dist/esm/excel-parser/plugins/xlsx/theme.js +127 -0
  349. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
  350. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
  351. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.js +103 -0
  352. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
  353. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
  354. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.js +399 -0
  355. package/dist/esm/excel-parser/registry.d.ts +5 -0
  356. package/dist/esm/excel-parser/registry.d.ts.map +1 -0
  357. package/dist/esm/excel-parser/registry.js +20 -0
  358. package/dist/esm/excel-parser/style-registry.d.ts +51 -0
  359. package/dist/esm/excel-parser/style-registry.d.ts.map +1 -0
  360. package/dist/esm/excel-parser/style-registry.js +163 -0
  361. package/dist/esm/excel-parser/theme-default.d.ts +3 -0
  362. package/dist/esm/excel-parser/theme-default.d.ts.map +1 -0
  363. package/dist/esm/excel-parser/theme-default.js +19 -0
  364. package/dist/esm/excel-parser/types.d.ts +365 -0
  365. package/dist/esm/excel-parser/types.d.ts.map +1 -0
  366. package/dist/esm/excel-parser/types.js +59 -0
  367. package/dist/esm/excel-parser/utils.d.ts +6 -0
  368. package/dist/esm/excel-parser/utils.d.ts.map +1 -0
  369. package/dist/esm/excel-parser/utils.js +25 -0
  370. package/dist/esm/excel-parser/workbook.d.ts +51 -0
  371. package/dist/esm/excel-parser/workbook.d.ts.map +1 -0
  372. package/dist/esm/excel-parser/workbook.js +192 -0
  373. package/dist/esm/excel-parser/worker.d.ts +2 -0
  374. package/dist/esm/excel-parser/worker.d.ts.map +1 -0
  375. package/dist/esm/excel-parser/worker.js +862 -0
  376. package/dist/esm/excel-parser/zip-parser-streaming.d.ts +13 -0
  377. package/dist/esm/excel-parser/zip-parser-streaming.d.ts.map +1 -0
  378. package/dist/esm/excel-parser/zip-parser-streaming.js +119 -0
  379. package/dist/esm/excel-parser/zip-parser.d.ts +11 -0
  380. package/dist/esm/excel-parser/zip-parser.d.ts.map +1 -0
  381. package/dist/esm/excel-parser/zip-parser.js +43 -0
  382. package/dist/esm/exporter/invalid-data-validation.d.ts +19 -0
  383. package/dist/esm/exporter/invalid-data-validation.d.ts.map +1 -0
  384. package/dist/esm/exporter/invalid-data-validation.js +37 -0
  385. package/dist/esm/exporter/ods/ods-export.d.ts +26 -0
  386. package/dist/esm/exporter/ods/ods-export.d.ts.map +1 -0
  387. package/dist/esm/exporter/ods/ods-export.js +3238 -0
  388. package/dist/esm/exporter/ods/sparkline-builder.d.ts +33 -0
  389. package/dist/esm/exporter/ods/sparkline-builder.d.ts.map +1 -0
  390. package/dist/esm/exporter/ods/sparkline-builder.js +165 -0
  391. package/dist/esm/exporter/xlsx/chart-builder.d.ts +3 -0
  392. package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -0
  393. package/dist/esm/exporter/xlsx/chart-builder.js +1805 -0
  394. package/dist/esm/exporter/xlsx/chart-templates.d.ts +1781 -0
  395. package/dist/esm/exporter/xlsx/chart-templates.d.ts.map +1 -0
  396. package/dist/esm/exporter/xlsx/chart-templates.js +1798 -0
  397. package/dist/esm/exporter/xlsx/future-functions.d.ts +10 -0
  398. package/dist/esm/exporter/xlsx/future-functions.d.ts.map +1 -0
  399. package/dist/esm/exporter/xlsx/future-functions.js +264 -0
  400. package/dist/esm/exporter/xlsx/pivot-builder.d.ts +58 -0
  401. package/dist/esm/exporter/xlsx/pivot-builder.d.ts.map +1 -0
  402. package/dist/esm/exporter/xlsx/pivot-builder.js +230 -0
  403. package/dist/esm/exporter/xlsx/power-query-builder.d.ts +26 -0
  404. package/dist/esm/exporter/xlsx/power-query-builder.d.ts.map +1 -0
  405. package/dist/esm/exporter/xlsx/power-query-builder.js +257 -0
  406. package/dist/esm/exporter/xlsx/slicer-builder.d.ts +11 -0
  407. package/dist/esm/exporter/xlsx/slicer-builder.d.ts.map +1 -0
  408. package/dist/esm/exporter/xlsx/slicer-builder.js +84 -0
  409. package/dist/esm/exporter/xlsx/sparkline-builder.d.ts +61 -0
  410. package/dist/esm/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
  411. package/dist/esm/exporter/xlsx/sparkline-builder.js +437 -0
  412. package/dist/esm/exporter/xlsx/style-builder.d.ts +93 -0
  413. package/dist/esm/exporter/xlsx/style-builder.d.ts.map +1 -0
  414. package/dist/esm/exporter/xlsx/style-builder.js +795 -0
  415. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
  416. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
  417. package/dist/esm/exporter/xlsx/threaded-comments-builder.js +175 -0
  418. package/dist/esm/exporter/xlsx/xlsx-export.d.ts +121 -0
  419. package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -0
  420. package/dist/esm/exporter/xlsx/xlsx-export.js +4062 -0
  421. package/dist/esm/helpers/theme-xml-generator.d.ts +8 -0
  422. package/dist/esm/helpers/theme-xml-generator.d.ts.map +1 -0
  423. package/dist/esm/helpers/theme-xml-generator.js +33 -0
  424. package/dist/esm/helpers.d.ts +34 -0
  425. package/dist/esm/helpers.d.ts.map +1 -0
  426. package/dist/esm/helpers.js +182 -0
  427. package/dist/esm/index.d.ts +16 -0
  428. package/dist/esm/index.d.ts.map +1 -0
  429. package/dist/esm/index.js +15 -0
  430. package/dist/esm/indexed-colors.d.ts +2 -0
  431. package/dist/esm/indexed-colors.d.ts.map +1 -0
  432. package/dist/esm/indexed-colors.js +75 -0
  433. package/dist/esm/ods-export.d.ts +24 -0
  434. package/dist/esm/ods-export.d.ts.map +1 -0
  435. package/dist/esm/ods-export.js +12 -0
  436. package/dist/esm/parse.d.ts +24 -0
  437. package/dist/esm/parse.d.ts.map +1 -0
  438. package/dist/esm/parse.js +55 -0
  439. package/dist/esm/power-query.d.ts +41 -0
  440. package/dist/esm/power-query.d.ts.map +1 -0
  441. package/dist/esm/power-query.js +19 -0
  442. package/dist/esm/server.d.ts +9 -0
  443. package/dist/esm/server.d.ts.map +1 -0
  444. package/dist/esm/server.js +8 -0
  445. package/dist/esm/theme1.d.ts +3 -0
  446. package/dist/esm/theme1.d.ts.map +1 -0
  447. package/dist/esm/theme1.js +2 -0
  448. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  449. package/dist/esm/types.d.ts +14 -0
  450. package/dist/esm/types.d.ts.map +1 -0
  451. package/dist/esm/types.js +14 -0
  452. package/dist/esm/vitest.config.d.ts +3 -0
  453. package/dist/esm/vitest.config.d.ts.map +1 -0
  454. package/dist/esm/vitest.config.js +16 -0
  455. package/package.json +62 -0
  456. package/xlsx.d.ts +52 -0
@@ -0,0 +1,18 @@
1
+ import type { BooleanCondition, CellFormat, ConditionalFormatRule, DistinctRule, TopBottomRule } from "@rowsncolumns/spreadsheet";
2
+ export declare function parseTopBottomCondition(cfRule: any, format: CellFormat): TopBottomRule | undefined;
3
+ export declare function parseDistinctRule(ruleType: string, format: CellFormat): DistinctRule;
4
+ /**
5
+ * Parse a boolean rule condition
6
+ * @param cfRule The conditional formatting rule
7
+ * @returns BooleanCondition object
8
+ */
9
+ export declare function parseBooleanCondition(cfRule: any): BooleanCondition | undefined;
10
+ /**
11
+ * Get conditional formatting rules from a sheet
12
+ * @param sheetData The sheet data
13
+ * @param sheetId The sheet ID
14
+ * @param workbookStyles The workbook styles
15
+ * @returns Array of ConditionalFormatRule objects
16
+ */
17
+ export declare function getConditionalFormattingFromSheet(sheetData: any, sheetId: number, workbookStyles: any, indexedColors?: Array<string | undefined>): ConditionalFormatRule[];
18
+ //# sourceMappingURL=conditional-formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional-formatting.d.ts","sourceRoot":"","sources":["../../../../../excel-parser/plugins/xlsx/conditional-formatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAGV,qBAAqB,EAGrB,YAAY,EAKZ,aAAa,EACd,MAAM,2BAA2B,CAAC;AAgLnC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,UAAU,GACjB,aAAa,GAAG,SAAS,CAuC3B;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,GACjB,YAAY,CAKd;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,GAAG,GACV,gBAAgB,GAAG,SAAS,CAgI9B;AA8KD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,GAAG,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,GAAG,EACnB,aAAa,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GACxC,qBAAqB,EAAE,CAsLzB"}
@@ -0,0 +1,621 @@
1
+ import { get, set } from "lodash-es";
2
+ import { getRangeFromAddressRef } from "../../helpers";
3
+ import { extractColor } from "./styles";
4
+ /**
5
+ * Parse cell format from dxf format definition. Theme color
6
+ * references (`<color theme="N" tint="T"/>`) are intentionally
7
+ * preserved as `{ theme, tint }` objects on output — consumers
8
+ * resolve them via `getStringifiedColor(color, theme)` so users can
9
+ * switch themes / dark mode and have CF colors re-resolve.
10
+ * Symmetric with how regular cell `backgroundColor` is stored.
11
+ *
12
+ * @param dxf The differential formatting element
13
+ * @param indexedColors Indexed color palette overrides
14
+ * @returns CellFormat object
15
+ */
16
+ function parseDxfFormat(dxf, indexedColors) {
17
+ const format = {};
18
+ // Font formatting. OOXML boolean flag elements default to TRUE when the `val`
19
+ // attribute is absent, but `val="0"`/`"false"` means explicitly OFF — key presence
20
+ // alone treated `<strike val="0"/>` (an explicit "not struck" dxf font) as struck.
21
+ // Mirrors styles.ts' `isTruthyFlagNode` + its `<u val="none"/>` handling.
22
+ const isTruthyFlagNode = (node) => {
23
+ if (node === undefined || node === null)
24
+ return false;
25
+ const val = typeof node === "object" ? (node.a$?.val ?? node["#text"] ?? node) : node;
26
+ if (val === undefined || val === null || val === true)
27
+ return true;
28
+ const str = String(val).toLowerCase();
29
+ if (str === "" || str === "true" || str === "1")
30
+ return true;
31
+ return false;
32
+ };
33
+ if (dxf.font) {
34
+ if ("b" in dxf.font && isTruthyFlagNode(dxf.font.b)) {
35
+ set(format, "textFormat.bold", true);
36
+ }
37
+ if ("i" in dxf.font && isTruthyFlagNode(dxf.font.i)) {
38
+ set(format, "textFormat.italic", true);
39
+ }
40
+ if ("u" in dxf.font) {
41
+ // Underline is not a boolean — `<u val="none"/>` means no underline; anything
42
+ // else (including an absent val) is some form of underline.
43
+ const uNode = dxf.font.u;
44
+ const uVal = typeof uNode === "object" ? (uNode?.a$?.val ?? uNode?.["#text"]) : uNode;
45
+ const uStr = uVal === undefined || uVal === null ? "" : String(uVal).toLowerCase();
46
+ if (uStr !== "none") {
47
+ set(format, "textFormat.underline", true);
48
+ }
49
+ }
50
+ if ("strike" in dxf.font && isTruthyFlagNode(dxf.font.strike)) {
51
+ set(format, "textFormat.strikethrough", true);
52
+ }
53
+ if (dxf.font.color)
54
+ set(format, "textFormat.color", extractColor(dxf.font.color, indexedColors));
55
+ }
56
+ // Fill formatting
57
+ if (dxf.fill && dxf.fill.patternFill && dxf.fill.patternFill.bgColor) {
58
+ format.backgroundColor = extractColor(dxf.fill.patternFill.bgColor, indexedColors);
59
+ }
60
+ return format;
61
+ }
62
+ /**
63
+ * Map Excel condition type to our condition type
64
+ * @param cfType Excel conditional formatting type
65
+ * @returns Standardized condition type
66
+ */
67
+ function mapConditionType(cfType) {
68
+ const typeMap = {
69
+ containsText: "TEXT_CONTAINS",
70
+ notContainsText: "TEXT_NOT_CONTAINS",
71
+ beginsWith: "TEXT_STARTS_WITH",
72
+ endsWith: "TEXT_ENDS_WITH",
73
+ containsBlanks: "BLANK",
74
+ notContainsBlanks: "NOT_BLANK",
75
+ containsErrors: "ERROR",
76
+ notContainsErrors: "NOT_ERROR",
77
+ expression: "CUSTOM_FORMULA",
78
+ };
79
+ return typeMap[cfType] || cfType;
80
+ }
81
+ /**
82
+ * Map Excel operator to our condition operator
83
+ * @param operator Excel operator
84
+ * @returns Standardized operator
85
+ */
86
+ function mapOperator(operator) {
87
+ const operatorMap = {
88
+ lessThan: "NUMBER_LESS",
89
+ lessThanOrEqual: "NUMBER_LESS_THAN_EQ",
90
+ equal: "NUMBER_EQ",
91
+ notEqual: "NUMBER_NOT_EQ",
92
+ greaterThanOrEqual: "NUMBER_GREATER_THAN_EQ",
93
+ greaterThan: "NUMBER_GREATER",
94
+ between: "NUMBER_BETWEEN",
95
+ notBetween: "NUMBER_NOT_BETWEEN",
96
+ containsText: "TEXT_CONTAINS",
97
+ };
98
+ return operatorMap[operator] || operator;
99
+ }
100
+ function asArray(entry) {
101
+ if (entry === undefined || entry === null) {
102
+ return [];
103
+ }
104
+ return Array.isArray(entry) ? entry : [entry];
105
+ }
106
+ function extractFormulaText(entry) {
107
+ if (entry === undefined || entry === null) {
108
+ return undefined;
109
+ }
110
+ if (typeof entry === "string" || typeof entry === "number") {
111
+ return String(entry);
112
+ }
113
+ if (typeof entry === "object") {
114
+ const textNode = (typeof entry.t$ === "string" && entry.t$) ||
115
+ (typeof entry._text === "string" && entry._text) ||
116
+ (typeof entry["#text"] === "string" && entry["#text"]);
117
+ const attributeFormula = typeof entry?.a$?.["xm:f"] === "string" ? entry.a$["xm:f"] : undefined;
118
+ if (textNode && !textNode.trim().startsWith("#REF!")) {
119
+ return textNode;
120
+ }
121
+ if (attributeFormula && attributeFormula.trim()) {
122
+ return attributeFormula;
123
+ }
124
+ if (textNode) {
125
+ return textNode;
126
+ }
127
+ }
128
+ return undefined;
129
+ }
130
+ function normalizeFormulaExpression(entry) {
131
+ const text = extractFormulaText(entry);
132
+ if (text === undefined) {
133
+ return undefined;
134
+ }
135
+ const trimmed = text.trim();
136
+ if (!trimmed) {
137
+ return undefined;
138
+ }
139
+ return trimmed.startsWith("=") ? trimmed : `=${trimmed}`;
140
+ }
141
+ export function parseTopBottomCondition(cfRule, format) {
142
+ if (!cfRule) {
143
+ return undefined;
144
+ }
145
+ const ruleAttributes = cfRule.a$ ?? {};
146
+ const top10Node = cfRule.top10 ?? cfRule["x:top10"];
147
+ const top10Attributes = top10Node?.a$ ?? {};
148
+ const attributes = {
149
+ ...ruleAttributes,
150
+ ...top10Attributes,
151
+ };
152
+ const rankAttr = attributes.rank ??
153
+ attributes.val ??
154
+ attributes.value ??
155
+ attributes.rankNumber;
156
+ const rank = rankAttr !== undefined && !Number.isNaN(Number(rankAttr))
157
+ ? Number(rankAttr)
158
+ : 10;
159
+ if (!Number.isFinite(rank) || rank <= 0) {
160
+ return undefined;
161
+ }
162
+ const percentAttr = attributes.percent ?? attributes.isPercent;
163
+ const bottomAttr = attributes.bottom ?? attributes.isBottom;
164
+ const isPercent = percentAttr === "1" || percentAttr === "true";
165
+ const isBottom = bottomAttr === "1" || bottomAttr === "true";
166
+ return {
167
+ type: isBottom ? "BOTTOM" : "TOP",
168
+ rank,
169
+ isPercent,
170
+ format,
171
+ };
172
+ }
173
+ export function parseDistinctRule(ruleType, format) {
174
+ return {
175
+ type: ruleType === "duplicateValues" ? "DUPLICATE" : "UNIQUE",
176
+ format,
177
+ };
178
+ }
179
+ /**
180
+ * Parse a boolean rule condition
181
+ * @param cfRule The conditional formatting rule
182
+ * @returns BooleanCondition object
183
+ */
184
+ export function parseBooleanCondition(cfRule) {
185
+ const rawType = cfRule.a$.type;
186
+ if (!rawType) {
187
+ return undefined;
188
+ }
189
+ if (rawType === "timePeriod") {
190
+ const periodMap = {
191
+ today: "DATE_TODAY",
192
+ yesterday: "DATE_YESTERDAY",
193
+ tomorrow: "DATE_TOMORROW",
194
+ last7Days: "DATE_LAST_7_DAYS",
195
+ lastWeek: "DATE_LAST_WEEK",
196
+ thisWeek: "DATE_THIS_WEEK",
197
+ nextWeek: "DATE_NEXT_WEEK",
198
+ lastMonth: "DATE_LAST_MONTH",
199
+ thisMonth: "DATE_THIS_MONTH",
200
+ nextMonth: "DATE_NEXT_MONTH",
201
+ };
202
+ const mapped = periodMap[String(cfRule.a$.timePeriod ?? "")];
203
+ if (!mapped) {
204
+ return undefined;
205
+ }
206
+ return { type: mapped };
207
+ }
208
+ if (rawType === "aboveAverage") {
209
+ const aboveAverage = String(cfRule.a$.aboveAverage ?? "1") !== "0";
210
+ return {
211
+ type: aboveAverage ? "NUMBER_ABOVE_AVERAGE" : "NUMBER_BELOW_AVERAGE",
212
+ };
213
+ }
214
+ const type = mapConditionType(rawType);
215
+ if (!type) {
216
+ return undefined;
217
+ }
218
+ const condition = {
219
+ type,
220
+ };
221
+ // Parse operators and values
222
+ const operator = cfRule.a$.operator;
223
+ if (cfRule.a$.operator) {
224
+ condition.type = mapOperator(cfRule.a$.operator);
225
+ }
226
+ // Parse formula values
227
+ const values = [];
228
+ // Handle both with and without namespace prefix
229
+ const formulaEntries = asArray(cfRule.formula ?? cfRule["x:formula"]);
230
+ const formula1Entries = asArray(cfRule.formula1 ?? cfRule["x:formula1"]);
231
+ const formula2Entries = asArray(cfRule.formula2 ?? cfRule["x:formula2"]);
232
+ const effectiveFormulaEntries = formulaEntries.length > 0
233
+ ? formulaEntries
234
+ : [...formula1Entries, ...formula2Entries];
235
+ if (condition.type === "CUSTOM_FORMULA") {
236
+ effectiveFormulaEntries.forEach((entry) => {
237
+ const normalized = normalizeFormulaExpression(entry);
238
+ if (normalized !== undefined) {
239
+ values.push({ userEnteredValue: normalized });
240
+ }
241
+ });
242
+ }
243
+ else if (["containsText", "notContainsText", "beginsWith", "endsWith"].includes(rawType)) {
244
+ // Prefer text attribute for text based rules, ignore implementation formula
245
+ if (cfRule.a$.text) {
246
+ values.push({ userEnteredValue: cfRule.a$.text });
247
+ }
248
+ }
249
+ else if ([
250
+ "containsBlanks",
251
+ "notContainsBlanks",
252
+ "containsErrors",
253
+ "notContainsErrors",
254
+ ].includes(rawType)) {
255
+ // Ignore values for these rules
256
+ }
257
+ else {
258
+ // Default behavior (e.g. cellIs): use formula values as literals
259
+ let hasQuotedTextLiteral = false;
260
+ effectiveFormulaEntries.forEach((entry) => {
261
+ const text = extractFormulaText(entry);
262
+ if (text !== undefined) {
263
+ const trimmed = text.trim();
264
+ const isQuoted = (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
265
+ (trimmed.startsWith("'") && trimmed.endsWith("'"));
266
+ // Check if numeric (simple check)
267
+ const isNumeric = !isNaN(Number(trimmed));
268
+ if (isQuoted) {
269
+ // Quoted string literal -> Scalar string
270
+ hasQuotedTextLiteral = true;
271
+ values.push({ userEnteredValue: trimmed.slice(1, -1) });
272
+ }
273
+ else if (isNumeric) {
274
+ // Numeric literal -> Scalar number
275
+ values.push({ userEnteredValue: trimmed });
276
+ }
277
+ else {
278
+ // Reference or Formula -> Formula value (prepend =)
279
+ const val = trimmed.startsWith("=") ? trimmed : `=${trimmed}`;
280
+ values.push({ userEnteredValue: val });
281
+ }
282
+ }
283
+ });
284
+ if (values.length === 0 && cfRule.a$.text) {
285
+ hasQuotedTextLiteral = true;
286
+ values.push({ userEnteredValue: cfRule.a$.text });
287
+ }
288
+ if (rawType === "cellIs" &&
289
+ hasQuotedTextLiteral &&
290
+ (operator === "equal" || operator === "notEqual")) {
291
+ condition.type = operator === "equal" ? "TEXT_EQ" : "TEXT_NOT_EQ";
292
+ }
293
+ }
294
+ if (values.length > 0) {
295
+ condition.values = values;
296
+ }
297
+ return condition;
298
+ }
299
+ /**
300
+ * Parse color scale rule
301
+ * @param cfRule The conditional formatting rule
302
+ * @param dxfs The differential formatting styles
303
+ * @param workbookStyles The workbook styles
304
+ * @returns GradientRule object
305
+ */
306
+ function parseColorScaleRule(cfRule, indexedColors) {
307
+ const gradientRule = {};
308
+ // Handle both with and without namespace prefix
309
+ const colorScale = cfRule.colorScale ?? cfRule["x:colorScale"];
310
+ if (!colorScale)
311
+ return gradientRule;
312
+ const cfColors = colorScale.color ?? colorScale["x:color"] ?? [];
313
+ const cfValues = colorScale.cfvo ?? colorScale["x:cfvo"] ?? [];
314
+ const colorsArray = Array.isArray(cfColors) ? cfColors : [cfColors];
315
+ const valuesArray = Array.isArray(cfValues) ? cfValues : [cfValues];
316
+ // Parse min point
317
+ if (valuesArray.length > 0 && colorsArray.length > 0) {
318
+ const minValue = valuesArray[0];
319
+ const minValueType = minValue.a$.type.toUpperCase();
320
+ gradientRule.minpoint = {
321
+ color: extractColor(colorsArray[0], indexedColors),
322
+ type: minValueType,
323
+ };
324
+ if (minValue.a$.val) {
325
+ set(gradientRule, "minpoint.value", minValue.a$.val);
326
+ }
327
+ }
328
+ // Parse mid point (if exists)
329
+ if (valuesArray.length > 2 && colorsArray.length > 2) {
330
+ const midValue = valuesArray[1];
331
+ const midValueType = midValue.a$.type.toUpperCase();
332
+ gradientRule.midpoint = {
333
+ color: extractColor(colorsArray[1], indexedColors),
334
+ type: midValueType,
335
+ };
336
+ if (midValue.a$.val) {
337
+ set(gradientRule, "midpoint.value", midValue.a$.val);
338
+ }
339
+ }
340
+ // Parse max point
341
+ if (valuesArray.length > 1 && colorsArray.length > 1) {
342
+ const maxIndex = valuesArray.length - 1;
343
+ const maxValue = valuesArray[maxIndex];
344
+ const maxValueType = maxValue.a$.type.toUpperCase();
345
+ gradientRule.maxpoint = {
346
+ color: extractColor(colorsArray[maxIndex], indexedColors),
347
+ type: maxValueType,
348
+ };
349
+ if (maxValue.a$.val) {
350
+ set(gradientRule, "maxpoint.value", maxValue.a$.val);
351
+ }
352
+ }
353
+ return gradientRule;
354
+ }
355
+ // Map OOXML cfvo type → engine threshold type. OOXML uses lowercase strings;
356
+ // our engine uses uppercase enum values.
357
+ function mapCfvoType(rawType) {
358
+ const t = (rawType ?? "").toLowerCase();
359
+ if (t === "min")
360
+ return "MIN";
361
+ if (t === "max")
362
+ return "MAX";
363
+ if (t === "num")
364
+ return "NUMBER";
365
+ if (t === "percent")
366
+ return "PERCENT";
367
+ if (t === "percentile")
368
+ return "PERCENTILE";
369
+ if (t === "formula")
370
+ return "FORMULA";
371
+ return "NUMBER";
372
+ }
373
+ function parseCfvoArray(cfvos) {
374
+ if (!cfvos)
375
+ return [];
376
+ const array = Array.isArray(cfvos) ? cfvos : [cfvos];
377
+ return array.map((v) => ({
378
+ type: mapCfvoType(v?.a$?.type),
379
+ ...(v?.a$?.val !== undefined ? { value: v.a$.val } : {}),
380
+ }));
381
+ }
382
+ const KNOWN_ICON_SET_FAMILIES = new Set([
383
+ "3Arrows",
384
+ "3ArrowsGray",
385
+ "3Flags",
386
+ "3TrafficLights1",
387
+ "3TrafficLights2",
388
+ "3Signs",
389
+ "3Symbols",
390
+ "3Symbols2",
391
+ "4Arrows",
392
+ "4ArrowsGray",
393
+ "4RedToBlack",
394
+ "4Rating",
395
+ "4TrafficLights",
396
+ "5Arrows",
397
+ "5ArrowsGray",
398
+ "5Rating",
399
+ "5Quarters",
400
+ ]);
401
+ function parseIconSetRule(cfRule) {
402
+ const iconSet = cfRule.iconSet ?? cfRule["x:iconSet"];
403
+ if (!iconSet)
404
+ return null;
405
+ const familyRaw = iconSet?.a$?.iconSet ?? "3TrafficLights1";
406
+ const family = (KNOWN_ICON_SET_FAMILIES.has(familyRaw) ? familyRaw : "3TrafficLights1");
407
+ const cfvos = iconSet.cfvo ?? iconSet["x:cfvo"];
408
+ const thresholds = parseCfvoArray(cfvos);
409
+ // OOXML always includes a leading "MIN/0%" cfvo for icon sets; drop it
410
+ // because the engine treats thresholds[i] as the lower bound for bucket i+1.
411
+ const effective = thresholds.length > 1 ? thresholds.slice(1) : thresholds;
412
+ const rule = {
413
+ iconSet: family,
414
+ thresholds: effective,
415
+ };
416
+ if (iconSet.a$?.reverse === "1")
417
+ rule.reverse = true;
418
+ if (iconSet.a$?.showValue === "0")
419
+ rule.showValue = false;
420
+ return rule;
421
+ }
422
+ function parseDataBarRule(cfRule, indexedColors) {
423
+ const dataBar = cfRule.dataBar ?? cfRule["x:dataBar"];
424
+ if (!dataBar)
425
+ return null;
426
+ const cfvos = parseCfvoArray(dataBar.cfvo ?? dataBar["x:cfvo"]);
427
+ if (cfvos.length < 2)
428
+ return null;
429
+ const colorNode = dataBar.color ?? dataBar["x:color"];
430
+ const color = extractColor(Array.isArray(colorNode) ? colorNode[0] : colorNode, indexedColors);
431
+ if (!color)
432
+ return null;
433
+ const rule = {
434
+ minpoint: cfvos[0],
435
+ maxpoint: cfvos[cfvos.length - 1],
436
+ color,
437
+ };
438
+ if (dataBar.a$?.showValue === "0")
439
+ rule.showValue = false;
440
+ return rule;
441
+ }
442
+ /**
443
+ * Get conditional formatting rules from a sheet
444
+ * @param sheetData The sheet data
445
+ * @param sheetId The sheet ID
446
+ * @param workbookStyles The workbook styles
447
+ * @returns Array of ConditionalFormatRule objects
448
+ */
449
+ export function getConditionalFormattingFromSheet(sheetData, sheetId, workbookStyles, indexedColors) {
450
+ const conditionalFormatRules = [];
451
+ // Get conditional formatting entries
452
+ // Handle both with and without namespace prefix
453
+ const conditionalFormattingEntries = get(sheetData, "worksheet.conditionalFormatting") ||
454
+ get(sheetData, "x:worksheet.x:conditionalFormatting");
455
+ if (!conditionalFormattingEntries)
456
+ return [];
457
+ // Normalize to array
458
+ const cfEntries = Array.isArray(conditionalFormattingEntries)
459
+ ? conditionalFormattingEntries
460
+ : [conditionalFormattingEntries];
461
+ // Get dxfs (differential formatting) if available
462
+ const dxfs = get(workbookStyles, "dxfs.dxf") || [];
463
+ const dxfsArray = Array.isArray(dxfs) ? dxfs : [dxfs];
464
+ // Process each conditional formatting entry
465
+ cfEntries.forEach((cfEntry, index) => {
466
+ // Get the range(s) this formatting applies to
467
+ const sqref = cfEntry.a$ && cfEntry.a$.sqref;
468
+ if (!sqref)
469
+ return;
470
+ // Split multiple ranges (Excel uses space as delimiter)
471
+ const rangeAddresses = sqref.split(" ");
472
+ const ranges = [];
473
+ // Convert each Excel range to our SheetRange format
474
+ rangeAddresses.forEach((address) => {
475
+ const range = getRangeFromAddressRef(address);
476
+ if (range) {
477
+ ranges.push({
478
+ ...range,
479
+ sheetId,
480
+ });
481
+ }
482
+ });
483
+ if (ranges.length === 0)
484
+ return;
485
+ // Get the formatting rules
486
+ // Handle both with and without namespace prefix
487
+ const cfRules = cfEntry.cfRule ?? cfEntry["x:cfRule"] ?? [];
488
+ const cfRulesArray = Array.isArray(cfRules) ? cfRules : [cfRules];
489
+ // Process each rule
490
+ cfRulesArray.forEach((cfRule, ruleIndex) => {
491
+ const rule = {
492
+ id: `${sheetId}_${index}_${ruleIndex}`,
493
+ ranges,
494
+ };
495
+ if (cfRule.a$?.priority !== undefined) {
496
+ const parsedPriority = Number.parseInt(cfRule.a$.priority, 10);
497
+ if (!Number.isNaN(parsedPriority)) {
498
+ rule.priority = parsedPriority;
499
+ }
500
+ }
501
+ if (cfRule.a$?.stopIfTrue === "1") {
502
+ rule.stopIfTrue = true;
503
+ }
504
+ // Check if rule is disabled
505
+ if (cfRule.a$ && cfRule.a$.disabled === "1") {
506
+ rule.enabled = false;
507
+ }
508
+ // Process different rule types
509
+ const ruleType = cfRule.a$.type;
510
+ // Capture the verbatim source representation so the exporter can replay
511
+ // it exactly — preserves cfRule `type` (`containsText`/`beginsWith`/
512
+ // `timePeriod`/etc.), the original operator, the user's formula text,
513
+ // and rule attrs (`text`, `rank`, `percent`, `aboveAverage`, etc.) that
514
+ // would otherwise be lost when the rule round-trips through the
515
+ // synthesizing exporter. For `colorScale`/`dataBar`/`iconSet` rules,
516
+ // the relevant data lives in nested child elements with stop points,
517
+ // colors, and value thresholds — capture those subtrees opaquely so
518
+ // the exporter can re-emit them via XMLBuilder verbatim.
519
+ if (ruleType) {
520
+ const formulaNodes = cfRule.formula ?? cfRule["x:formula"];
521
+ const formulaArray = formulaNodes
522
+ ? Array.isArray(formulaNodes)
523
+ ? formulaNodes
524
+ : [formulaNodes]
525
+ : [];
526
+ const formulas = [];
527
+ for (const fNode of formulaArray) {
528
+ const text = extractFormulaText(fNode);
529
+ if (text !== undefined && String(text).length > 0) {
530
+ const trimmed = String(text).trim();
531
+ formulas.push(trimmed.startsWith("=") ? trimmed.slice(1) : trimmed);
532
+ }
533
+ }
534
+ const numericAttr = (key) => {
535
+ if (cfRule.a$?.[key] === undefined)
536
+ return undefined;
537
+ const n = Number(cfRule.a$[key]);
538
+ return Number.isFinite(n) ? n : undefined;
539
+ };
540
+ const colorScaleNode = cfRule.colorScale ?? cfRule["x:colorScale"];
541
+ const dataBarNode = cfRule.dataBar ?? cfRule["x:dataBar"];
542
+ const iconSetNode = cfRule.iconSet ?? cfRule["x:iconSet"];
543
+ rule.xlsxSource = {
544
+ type: ruleType,
545
+ ...(cfRule.a$.operator
546
+ ? { operator: cfRule.a$.operator }
547
+ : {}),
548
+ ...(cfRule.a$.text ? { text: cfRule.a$.text } : {}),
549
+ ...(cfRule.a$.timePeriod
550
+ ? { timePeriod: cfRule.a$.timePeriod }
551
+ : {}),
552
+ ...(numericAttr("rank") !== undefined
553
+ ? { rank: numericAttr("rank") }
554
+ : {}),
555
+ ...(cfRule.a$.percent === "1" ? { percent: true } : {}),
556
+ ...(cfRule.a$.bottom === "1" ? { bottom: true } : {}),
557
+ ...(cfRule.a$.aboveAverage === "0"
558
+ ? { aboveAverage: false }
559
+ : cfRule.a$.aboveAverage === "1"
560
+ ? { aboveAverage: true }
561
+ : {}),
562
+ ...(cfRule.a$.equalAverage === "1"
563
+ ? { equalAverage: true }
564
+ : {}),
565
+ ...(numericAttr("stdDev") !== undefined
566
+ ? { stdDev: numericAttr("stdDev") }
567
+ : {}),
568
+ ...(formulas.length ? { formulas } : {}),
569
+ ...(colorScaleNode ? { colorScale: colorScaleNode } : {}),
570
+ ...(dataBarNode ? { dataBar: dataBarNode } : {}),
571
+ ...(iconSetNode ? { iconSet: iconSetNode } : {}),
572
+ };
573
+ }
574
+ // Handle color scale (gradient) rules
575
+ if (ruleType === "colorScale") {
576
+ rule.gradientRule = parseColorScaleRule(cfRule, indexedColors);
577
+ }
578
+ else if (ruleType === "iconSet") {
579
+ const parsed = parseIconSetRule(cfRule);
580
+ if (parsed)
581
+ rule.iconSetRule = parsed;
582
+ }
583
+ else if (ruleType === "dataBar") {
584
+ const parsed = parseDataBarRule(cfRule, indexedColors);
585
+ if (parsed)
586
+ rule.dataBarRule = parsed;
587
+ }
588
+ else {
589
+ // Get formatting from dxf if available
590
+ let format = {};
591
+ if (cfRule.a$.dxfId !== undefined) {
592
+ const dxfId = parseInt(cfRule.a$.dxfId);
593
+ if (dxfId >= 0 && dxfId < dxfsArray.length) {
594
+ format = parseDxfFormat(dxfsArray[dxfId], indexedColors);
595
+ }
596
+ }
597
+ if (ruleType === "top10") {
598
+ const topBottomRule = parseTopBottomCondition(cfRule, format);
599
+ if (topBottomRule) {
600
+ rule.topBottomRule = topBottomRule;
601
+ }
602
+ }
603
+ else if (ruleType === "duplicateValues" ||
604
+ ruleType === "uniqueValues") {
605
+ rule.distinctRule = parseDistinctRule(ruleType, format);
606
+ }
607
+ else {
608
+ const condition = parseBooleanCondition(cfRule);
609
+ if (condition) {
610
+ rule.booleanRule = {
611
+ condition,
612
+ format,
613
+ };
614
+ }
615
+ }
616
+ }
617
+ conditionalFormatRules.push(rule);
618
+ });
619
+ });
620
+ return conditionalFormatRules;
621
+ }
@@ -0,0 +1,4 @@
1
+ import type { DataValidationRuleRecord } from "@rowsncolumns/spreadsheet";
2
+ import type { IWorkbookPlugin } from "../../interface";
3
+ export declare const getDataValidationsForSheet: (workbook: IWorkbookPlugin, sheetId: number, sheet_data: any, sheetName?: string) => DataValidationRuleRecord[];
4
+ //# sourceMappingURL=data-validations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-validations.d.ts","sourceRoot":"","sources":["../../../../../excel-parser/plugins/xlsx/data-validations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,wBAAwB,EAEzB,MAAM,2BAA2B,CAAC;AASnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAwSvD,eAAO,MAAM,0BAA0B,GACrC,UAAU,eAAe,EACzB,SAAS,MAAM,EACf,YAAY,GAAG,EACf,YAAY,MAAM,+BAyRnB,CAAC"}