@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,553 @@
1
+ import { __awaiter, __generator, __values } from "tslib";
2
+ /// <reference path="../xlsx.d.ts" />
3
+ import { CFB } from "xlsx/xlsx.mjs";
4
+ import { sha1 } from "@noble/hashes/sha1";
5
+ import { sha256 } from "@noble/hashes/sha256";
6
+ import { sha384, sha512 } from "@noble/hashes/sha512";
7
+ import { cbc, ecb } from "@noble/ciphers/aes";
8
+ var BLOCK_KEY_VERIFIER_INPUT = new Uint8Array([
9
+ 0xfe, 0xa7, 0xd2, 0x76, 0x3b, 0x4b, 0x9e, 0x79,
10
+ ]);
11
+ var BLOCK_KEY_VERIFIER_HASH = new Uint8Array([
12
+ 0xd7, 0xaa, 0x0f, 0x6d, 0x30, 0x61, 0x34, 0x4e,
13
+ ]);
14
+ var BLOCK_KEY_ENCRYPTION_KEY = new Uint8Array([
15
+ 0x14, 0x6e, 0x0b, 0xe7, 0xab, 0xac, 0xd0, 0xd6,
16
+ ]);
17
+ export var LEGACY_XLS_UNSUPPORTED_MESSAGE = "This file is a legacy Excel 97-2003 (.xls) workbook, which is not supported. Please open it in Excel and save it as .xlsx, then try again.";
18
+ /**
19
+ * Inspects a CFB container's directory to decide whether it is an
20
+ * Office-encrypted OOXML package (`EncryptionInfo` stream present) or an
21
+ * unencrypted legacy BIFF `.xls` workbook (`Workbook`/`Book` stream present
22
+ * without `EncryptionInfo`). Returns "unknown" for anything else, including
23
+ * containers that fail to parse — callers should fall back to their existing
24
+ * behavior in that case.
25
+ */
26
+ export var detectCfbContainerKind = function (source) { return __awaiter(void 0, void 0, void 0, function () {
27
+ var buffer, _a, cfb, streamNames, _b;
28
+ return __generator(this, function (_c) {
29
+ switch (_c.label) {
30
+ case 0:
31
+ _c.trys.push([0, 4, , 5]);
32
+ if (!(source instanceof File)) return [3 /*break*/, 2];
33
+ return [4 /*yield*/, source.arrayBuffer()];
34
+ case 1:
35
+ _a = _c.sent();
36
+ return [3 /*break*/, 3];
37
+ case 2:
38
+ _a = source;
39
+ _c.label = 3;
40
+ case 3:
41
+ buffer = _a;
42
+ cfb = CFB.read(new Uint8Array(buffer), { type: "array" });
43
+ streamNames = new Set(cfb.FileIndex.map(function (entry) { return entry.name; }));
44
+ if (streamNames.has("EncryptionInfo")) {
45
+ return [2 /*return*/, "encrypted-ooxml"];
46
+ }
47
+ if (streamNames.has("Workbook") || streamNames.has("Book")) {
48
+ return [2 /*return*/, "legacy-xls"];
49
+ }
50
+ return [2 /*return*/, "unknown"];
51
+ case 4:
52
+ _b = _c.sent();
53
+ return [2 /*return*/, "unknown"];
54
+ case 5: return [2 /*return*/];
55
+ }
56
+ });
57
+ }); };
58
+ var CFBDecryptor = /** @class */ (function () {
59
+ function CFBDecryptor() {
60
+ }
61
+ /**
62
+ * Decrypts a CFB-encrypted XLSX file
63
+ * @param source The encrypted file or array buffer
64
+ * @param password The password to decrypt with
65
+ * @returns The decrypted XLSX data as ArrayBuffer
66
+ */
67
+ CFBDecryptor.decrypt = function (source, password) {
68
+ return __awaiter(this, void 0, void 0, function () {
69
+ var buffer, _a, uint8Array, cfb, infoContent, view, versionMajor, versionMinor, detail;
70
+ return __generator(this, function (_b) {
71
+ switch (_b.label) {
72
+ case 0:
73
+ if (!(source instanceof File)) return [3 /*break*/, 2];
74
+ return [4 /*yield*/, source.arrayBuffer()];
75
+ case 1:
76
+ _a = _b.sent();
77
+ return [3 /*break*/, 3];
78
+ case 2:
79
+ _a = source;
80
+ _b.label = 3;
81
+ case 3:
82
+ buffer = _a;
83
+ uint8Array = new Uint8Array(buffer);
84
+ cfb = CFB.read(uint8Array, { type: "array" });
85
+ infoContent = this.getEncryptionInfoContent(cfb);
86
+ if (!infoContent) {
87
+ throw new Error("Could not parse encryption information");
88
+ }
89
+ view = new DataView(infoContent.buffer, infoContent.byteOffset, infoContent.byteLength);
90
+ versionMajor = view.getUint16(0, true);
91
+ versionMinor = view.getUint16(2, true);
92
+ if (versionMajor === 4 && versionMinor === 4) {
93
+ return [2 /*return*/, this.decryptAgile(cfb, password)];
94
+ }
95
+ if (versionMinor === 2 && versionMajor >= 2 && versionMajor <= 4) {
96
+ return [2 /*return*/, this.decryptStandardFamily(cfb, infoContent, password)];
97
+ }
98
+ detail = versionMinor === 3 ? " (extensible encryption)" : "";
99
+ throw new Error("Unsupported workbook encryption version ".concat(versionMajor, ".").concat(versionMinor).concat(detail, ". ") +
100
+ "Supported: agile (4.4), standard AES (x.2), RC4 CryptoAPI.");
101
+ }
102
+ });
103
+ });
104
+ };
105
+ CFBDecryptor.decryptAgile = function (cfb, password) {
106
+ var encryptionInfo = this.parseEncryptionInfo(cfb);
107
+ if (!encryptionInfo) {
108
+ throw new Error("Could not parse encryption information");
109
+ }
110
+ // Derive key from password
111
+ var passwordDerivedKey = this.deriveKey(password, encryptionInfo);
112
+ // Verify password by decrypting verifier
113
+ var isValid = this.verifyPassword(passwordDerivedKey, encryptionInfo);
114
+ if (!isValid) {
115
+ throw new Error("Incorrect password");
116
+ }
117
+ // Decrypt the encrypted key value to get the actual encryption key
118
+ var encryptionKey = this.decryptEncryptedKey(passwordDerivedKey, encryptionInfo);
119
+ // Decrypt the package using the decrypted encryption key
120
+ var encryptedPackage = this.getEncryptedPackage(cfb);
121
+ return this.decryptPackage(encryptedPackage, encryptionKey, encryptionInfo);
122
+ };
123
+ CFBDecryptor.getEncryptionInfoContent = function (cfb) {
124
+ var entry = cfb.FileIndex.find(function (e) { return e.name === "EncryptionInfo"; });
125
+ if (!entry || !entry.content) {
126
+ return null;
127
+ }
128
+ var contentArray = entry.content;
129
+ return contentArray instanceof Uint8Array
130
+ ? contentArray
131
+ : new Uint8Array(contentArray);
132
+ };
133
+ // ── Standard (MS-OFFCRYPTO §2.3.4.5-9) & RC4 CryptoAPI (§2.3.5) ──────────────────
134
+ CFBDecryptor.decryptStandardFamily = function (cfb, infoContent, password) {
135
+ // `body` begins at the EncryptionHeaderFlags dword (after the 4-byte version).
136
+ var body = infoContent.subarray(4);
137
+ var dv = new DataView(body.buffer, body.byteOffset, body.byteLength);
138
+ var headerSize = dv.getUint32(4, true);
139
+ var header = body.subarray(8, 8 + headerSize);
140
+ var hdv = new DataView(header.buffer, header.byteOffset, header.byteLength);
141
+ var algId = hdv.getUint32(8, true);
142
+ var keySizeBits = hdv.getUint32(16, true);
143
+ var verifier = body.subarray(8 + headerSize);
144
+ var salt = verifier.subarray(4, 20);
145
+ var encryptedVerifier = verifier.subarray(20, 36);
146
+ // AES uses a 32-byte encrypted verifier hash (SHA1 padded to two blocks); RC4 uses 20.
147
+ var isAes = (algId & 0xff00) === 0x6600;
148
+ var isRc4 = algId === 0x6801 || algId === 0;
149
+ if (!isAes && !isRc4) {
150
+ throw new Error("Unsupported workbook encryption cipher (algId 0x".concat(algId.toString(16), ")."));
151
+ }
152
+ var vhashLen = isAes ? 32 : 20;
153
+ var encryptedVerifierHash = verifier.subarray(40, 40 + vhashLen);
154
+ var encryptedPackage = this.getEncryptedPackage(cfb);
155
+ if (isAes) {
156
+ var keyBytes_1 = keySizeBits !== 0
157
+ ? keySizeBits / 8
158
+ : algId === 0x660e
159
+ ? 16
160
+ : algId === 0x660f
161
+ ? 24
162
+ : 32;
163
+ var key = this.standardKey(password, salt, keyBytes_1);
164
+ var verifierPlain_1 = this.aesEcbDecrypt(encryptedVerifier, key);
165
+ var expected = this.hash(verifierPlain_1, "SHA1");
166
+ var stored = this.aesEcbDecrypt(encryptedVerifierHash, key);
167
+ if (!this.bytesEqual(expected, stored.subarray(0, expected.length))) {
168
+ throw new Error("Incorrect password");
169
+ }
170
+ return this.decryptStandardPackage(encryptedPackage, key);
171
+ }
172
+ // RC4 CryptoAPI: 40-bit keys are 5 significant bytes zero-padded to 16.
173
+ var keyBytes = keySizeBits === 40 || keySizeBits === 0 ? 5 : keySizeBits / 8;
174
+ var key0 = this.rc4CryptoApiKey(password, salt, keyBytes, 0);
175
+ var combined = this.rc4(key0, this.concatArrays(encryptedVerifier, encryptedVerifierHash));
176
+ var verifierPlain = combined.subarray(0, encryptedVerifier.length);
177
+ var storedHash = combined.subarray(encryptedVerifier.length);
178
+ if (!this.bytesEqual(this.hash(verifierPlain, "SHA1"), storedHash)) {
179
+ throw new Error("Incorrect password");
180
+ }
181
+ return this.decryptRc4Package(encryptedPackage, password, salt, keyBytes);
182
+ };
183
+ /** Standard key derivation (MS-OFFCRYPTO §2.3.4.7): iterated SHA1 then the X1‖X2 final block. */
184
+ CFBDecryptor.standardKey = function (password, salt, keyBytes) {
185
+ var SPIN_COUNT = 50000;
186
+ var h = this.hash(this.concatArrays(salt, this.stringToUtf16LE(password)), "SHA1");
187
+ for (var i = 0; i < SPIN_COUNT; i++) {
188
+ h = this.hash(this.concatArrays(this.le32(i), h), "SHA1");
189
+ }
190
+ var hfinal = this.hash(this.concatArrays(h, this.le32(0)), "SHA1");
191
+ var buf1 = new Uint8Array(64).fill(0x36);
192
+ var buf2 = new Uint8Array(64).fill(0x5c);
193
+ for (var i = 0; i < 20; i++) {
194
+ buf1[i] ^= hfinal[i];
195
+ buf2[i] ^= hfinal[i];
196
+ }
197
+ var x1 = this.hash(buf1, "SHA1");
198
+ var x2 = this.hash(buf2, "SHA1");
199
+ return this.concatArrays(x1, x2).slice(0, keyBytes);
200
+ };
201
+ CFBDecryptor.decryptStandardPackage = function (encryptedPackage, key) {
202
+ var sizeView = new DataView(encryptedPackage.buffer, encryptedPackage.byteOffset, 8);
203
+ var packageSize = Number(sizeView.getBigUint64(0, true));
204
+ var decrypted = this.aesEcbDecrypt(encryptedPackage.subarray(8), key);
205
+ var trimmed = decrypted.subarray(0, packageSize);
206
+ var result = new ArrayBuffer(trimmed.byteLength);
207
+ new Uint8Array(result).set(trimmed);
208
+ return result;
209
+ };
210
+ /** RC4 CryptoAPI key derivation (MS-OFFCRYPTO §2.3.5.2). */
211
+ CFBDecryptor.rc4CryptoApiKey = function (password, salt, keyBytes, block) {
212
+ var h0 = this.hash(this.concatArrays(salt, this.stringToUtf16LE(password)), "SHA1");
213
+ var hfinal = this.hash(this.concatArrays(h0, this.le32(block)), "SHA1");
214
+ if (keyBytes === 5) {
215
+ var key = new Uint8Array(16);
216
+ key.set(hfinal.subarray(0, 5));
217
+ return key;
218
+ }
219
+ return hfinal.subarray(0, keyBytes);
220
+ };
221
+ CFBDecryptor.decryptRc4Package = function (encryptedPackage, password, salt, keyBytes) {
222
+ var RC4_BLOCK_LENGTH = 512;
223
+ var sizeView = new DataView(encryptedPackage.buffer, encryptedPackage.byteOffset, 8);
224
+ var packageSize = Number(sizeView.getBigUint64(0, true));
225
+ var data = encryptedPackage.subarray(8);
226
+ var out = new Uint8Array(data.length);
227
+ // RC4 re-keys every 512 bytes of the encrypted package, using the block index.
228
+ for (var block = 0; block * RC4_BLOCK_LENGTH < data.length; block++) {
229
+ var start = block * RC4_BLOCK_LENGTH;
230
+ var end = Math.min(start + RC4_BLOCK_LENGTH, data.length);
231
+ var key = this.rc4CryptoApiKey(password, salt, keyBytes, block);
232
+ out.set(this.rc4(key, data.subarray(start, end)), start);
233
+ }
234
+ var trimmed = out.subarray(0, packageSize);
235
+ var result = new ArrayBuffer(trimmed.byteLength);
236
+ new Uint8Array(result).set(trimmed);
237
+ return result;
238
+ };
239
+ /** AES-ECB block decrypt (no padding). Trailing sub-block bytes are ignored. */
240
+ CFBDecryptor.aesEcbDecrypt = function (data, key) {
241
+ var aligned = data.length - (data.length % 16);
242
+ var cipher = ecb(key, { disablePadding: true });
243
+ return cipher.decrypt(data.subarray(0, aligned));
244
+ };
245
+ /** RC4 stream cipher (KSA + PRGA). Symmetric — the same op encrypts and decrypts. */
246
+ CFBDecryptor.rc4 = function (key, data) {
247
+ var s = new Uint8Array(256);
248
+ for (var i = 0; i < 256; i++)
249
+ s[i] = i;
250
+ var j = 0;
251
+ for (var i = 0; i < 256; i++) {
252
+ j = (j + s[i] + key[i % key.length]) & 0xff;
253
+ var t = s[i];
254
+ s[i] = s[j];
255
+ s[j] = t;
256
+ }
257
+ var out = new Uint8Array(data.length);
258
+ var a = 0;
259
+ var b = 0;
260
+ for (var k = 0; k < data.length; k++) {
261
+ a = (a + 1) & 0xff;
262
+ b = (b + s[a]) & 0xff;
263
+ var t = s[a];
264
+ s[a] = s[b];
265
+ s[b] = t;
266
+ out[k] = data[k] ^ s[(s[a] + s[b]) & 0xff];
267
+ }
268
+ return out;
269
+ };
270
+ CFBDecryptor.le32 = function (n) {
271
+ var b = new Uint8Array(4);
272
+ new DataView(b.buffer).setUint32(0, n >>> 0, true);
273
+ return b;
274
+ };
275
+ CFBDecryptor.bytesEqual = function (a, b) {
276
+ if (a.length !== b.length)
277
+ return false;
278
+ for (var i = 0; i < a.length; i++) {
279
+ if (a[i] !== b[i])
280
+ return false;
281
+ }
282
+ return true;
283
+ };
284
+ CFBDecryptor.parseEncryptionInfo = function (cfb) {
285
+ // Find EncryptionInfo stream
286
+ var encInfoEntry = cfb.FileIndex.find(function (entry) { return entry.name === "EncryptionInfo"; });
287
+ if (!encInfoEntry || !encInfoEntry.content) {
288
+ return null;
289
+ }
290
+ // CFB library returns content as array, convert to Uint8Array with proper buffer
291
+ var contentArray = encInfoEntry.content;
292
+ var content = contentArray instanceof Uint8Array
293
+ ? contentArray
294
+ : new Uint8Array(contentArray);
295
+ // Create a new buffer to ensure we have a proper ArrayBuffer
296
+ var buffer = new ArrayBuffer(content.length);
297
+ var bufferView = new Uint8Array(buffer);
298
+ bufferView.set(content);
299
+ var view = new DataView(buffer);
300
+ // Read version info
301
+ var versionMajor = view.getUint16(0, true);
302
+ var versionMinor = view.getUint16(2, true);
303
+ // Only support Agile encryption (version 4.4)
304
+ if (versionMajor !== 4 || versionMinor !== 4) {
305
+ throw new Error("Unsupported encryption version: ".concat(versionMajor, ".").concat(versionMinor, ". Only Agile encryption (4.4) is supported."));
306
+ }
307
+ // Parse XML encryption descriptor (starts at byte 8)
308
+ var xmlBytes = content.slice(8);
309
+ var xmlString = new TextDecoder().decode(xmlBytes);
310
+ var encInfo = this.parseAgileEncryptionXml(xmlString);
311
+ return encInfo;
312
+ };
313
+ CFBDecryptor.parseAgileEncryptionXml = function (xml) {
314
+ // Simple XML parsing for encryption parameters
315
+ var getAttr = function (tag, attr) {
316
+ // Match tag with optional namespace prefix (p:, x:, etc.)
317
+ // Use non-greedy match to avoid consuming the target attribute
318
+ var regex = new RegExp("<(?:\\w+:)?".concat(tag, "[^>]*?\\s+").concat(attr, "=\"([^\"]*)\""), "i");
319
+ var match = xml.match(regex);
320
+ if (!match) {
321
+ console.warn("Failed to find attribute ".concat(attr, " on tag ").concat(tag));
322
+ // Try alternative: attribute might be first after tag name
323
+ var altRegex = new RegExp("<(?:\\w+:)?".concat(tag, "\\s+").concat(attr, "=\"([^\"]*)\""), "i");
324
+ var altMatch = xml.match(altRegex);
325
+ return altMatch ? altMatch[1] : "";
326
+ }
327
+ return match ? match[1] : "";
328
+ };
329
+ var getBase64 = function (tag, attr) {
330
+ var base64 = getAttr(tag, attr);
331
+ if (!base64) {
332
+ console.warn("No base64 value found for ".concat(tag, ".").concat(attr));
333
+ return new Uint8Array(0);
334
+ }
335
+ try {
336
+ var binary = atob(base64);
337
+ var bytes = new Uint8Array(binary.length);
338
+ for (var i = 0; i < binary.length; i++) {
339
+ bytes[i] = binary.charCodeAt(i);
340
+ }
341
+ return bytes;
342
+ }
343
+ catch (error) {
344
+ console.error("Failed to decode base64 for ".concat(tag, ".").concat(attr, ":"), error);
345
+ return new Uint8Array(0);
346
+ }
347
+ };
348
+ var algorithm = getAttr("keyData", "cipherAlgorithm") || "AES";
349
+ var keySize = parseInt(getAttr("keyData", "keyBits") || "256") / 8;
350
+ var blockSize = parseInt(getAttr("keyData", "blockSize") || "16");
351
+ var hashAlgorithm = getAttr("keyData", "hashAlgorithm") || "SHA512";
352
+ var hashSize = parseInt(getAttr("keyData", "hashSize") || "64");
353
+ var saltSize = parseInt(getAttr("keyData", "saltSize") || "16");
354
+ // TWO different salts are used:
355
+ // 1. passwordSalt from encryptedKey - for password derivation and verification
356
+ // 2. packageSalt from keyData - for package decryption IVs
357
+ var passwordSalt = getBase64("encryptedKey", "saltValue");
358
+ var packageSalt = getBase64("keyData", "saltValue");
359
+ // Get values from p:encryptedKey element
360
+ var spinCount = parseInt(getAttr("encryptedKey", "spinCount") || "100000");
361
+ var encryptedVerifierHashInput = getBase64("encryptedKey", "encryptedVerifierHashInput");
362
+ var encryptedVerifierHashValue = getBase64("encryptedKey", "encryptedVerifierHashValue");
363
+ var encryptedKeyValue = getBase64("encryptedKey", "encryptedKeyValue");
364
+ // Validate that all required values were parsed
365
+ if (!passwordSalt.length || !packageSalt.length) {
366
+ throw new Error("Failed to parse salt values from encryption info");
367
+ }
368
+ if (!encryptedVerifierHashInput.length ||
369
+ !encryptedVerifierHashValue.length ||
370
+ !encryptedKeyValue.length) {
371
+ throw new Error("Failed to parse encrypted verifier values from encryption info");
372
+ }
373
+ return {
374
+ algorithm: algorithm,
375
+ keySize: keySize,
376
+ blockSize: blockSize,
377
+ hashAlgorithm: hashAlgorithm,
378
+ hashSize: hashSize,
379
+ saltSize: saltSize,
380
+ passwordSalt: passwordSalt,
381
+ packageSalt: packageSalt,
382
+ encryptedVerifierHashInput: encryptedVerifierHashInput,
383
+ encryptedVerifierHashValue: encryptedVerifierHashValue,
384
+ encryptedKeyValue: encryptedKeyValue,
385
+ spinCount: spinCount,
386
+ };
387
+ };
388
+ CFBDecryptor.deriveKey = function (password, info) {
389
+ // Convert password to UTF-16LE
390
+ var passwordBytes = this.stringToUtf16LE(password);
391
+ // Initial hash H0 = H(passwordSalt + password)
392
+ // Use passwordSalt from encryptedKey, NOT packageSalt from keyData
393
+ var hash = this.hash(this.concatArrays(info.passwordSalt, passwordBytes), info.hashAlgorithm);
394
+ // Spin iteration: H(iterator + H(n-1))
395
+ for (var i = 0; i < info.spinCount; i++) {
396
+ var iterator = new Uint8Array(4);
397
+ new DataView(iterator.buffer).setUint32(0, i, true);
398
+ hash = this.hash(this.concatArrays(iterator, hash), info.hashAlgorithm);
399
+ }
400
+ // Return H_final (the result after spin iterations)
401
+ // Individual keys are derived from this using block keys
402
+ return hash;
403
+ };
404
+ CFBDecryptor.decryptEncryptedKey = function (passwordDerivedKey, info) {
405
+ var keyForKeyValue = this.deriveAgileBlockKey(passwordDerivedKey, BLOCK_KEY_ENCRYPTION_KEY, info);
406
+ // Agile encryption uses raw CBC block decryption (no PKCS padding).
407
+ var decryptedKey = this.decryptAESNoPadding(info.encryptedKeyValue, keyForKeyValue, info.passwordSalt.slice(0, 16));
408
+ return decryptedKey.slice(0, info.keySize);
409
+ };
410
+ CFBDecryptor.verifyPassword = function (passwordDerivedKey, info) {
411
+ try {
412
+ var keyForVerifierInput = this.deriveAgileBlockKey(passwordDerivedKey, BLOCK_KEY_VERIFIER_INPUT, info);
413
+ // Decrypt verifier hash input
414
+ var verifierHashInput = this.decryptAESNoPadding(info.encryptedVerifierHashInput, keyForVerifierInput, info.passwordSalt.slice(0, 16));
415
+ // Hash the decrypted verifier
416
+ var verifierHash = this.hash(verifierHashInput.slice(0, 16), info.hashAlgorithm);
417
+ var keyForVerifierValue = this.deriveAgileBlockKey(passwordDerivedKey, BLOCK_KEY_VERIFIER_HASH, info);
418
+ // Decrypt verifier hash value
419
+ var decryptedVerifierHash = this.decryptAESNoPadding(info.encryptedVerifierHashValue, keyForVerifierValue, info.passwordSalt.slice(0, 16));
420
+ // Compare hashes
421
+ var expectedHashLength = Math.min(info.hashSize, verifierHash.length, decryptedVerifierHash.length);
422
+ for (var i = 0; i < expectedHashLength; i++) {
423
+ if (verifierHash[i] !== decryptedVerifierHash[i]) {
424
+ return false;
425
+ }
426
+ }
427
+ return true;
428
+ }
429
+ catch (error) {
430
+ console.error("Password verification error:", error);
431
+ return false;
432
+ }
433
+ };
434
+ CFBDecryptor.getEncryptedPackage = function (cfb) {
435
+ var entry = cfb.FileIndex.find(function (e) { return e.name === "EncryptedPackage" || e.name === "0EncryptedPackage"; });
436
+ if (!entry || !entry.content) {
437
+ throw new Error("EncryptedPackage stream not found");
438
+ }
439
+ // CFB library returns content as array, convert to proper Uint8Array
440
+ var contentArray = entry.content;
441
+ return contentArray instanceof Uint8Array
442
+ ? contentArray
443
+ : new Uint8Array(contentArray);
444
+ };
445
+ CFBDecryptor.decryptPackage = function (encrypted, key, info) {
446
+ var e_1, _a;
447
+ // Read the package size from the first 8 bytes
448
+ var sizeView = new DataView(encrypted.buffer, encrypted.byteOffset, 8);
449
+ var packageSize = Number(sizeView.getBigUint64(0, true));
450
+ // Skip the first 8 bytes (package size) to get encrypted data
451
+ var encryptedData = encrypted.slice(8);
452
+ // MS-OFFCRYPTO uses segmented decryption with 4096-byte blocks
453
+ var SEGMENT_LENGTH = 4096;
454
+ var totalSegments = Math.ceil(encryptedData.length / SEGMENT_LENGTH);
455
+ var decryptedSegments = [];
456
+ for (var i = 0; i < totalSegments; i++) {
457
+ var start = i * SEGMENT_LENGTH;
458
+ var end = Math.min(start + SEGMENT_LENGTH, encryptedData.length);
459
+ var segment = encryptedData.slice(start, end);
460
+ // Generate IV for this segment: hash(packageSalt + block number)
461
+ // Use packageSalt from keyData, NOT passwordSalt from encryptedKey
462
+ var blockNumber = new Uint8Array(4);
463
+ new DataView(blockNumber.buffer).setUint32(0, i, true);
464
+ var ivInput = this.concatArrays(info.packageSalt, blockNumber);
465
+ var ivHash = this.hash(ivInput, info.hashAlgorithm);
466
+ var iv = ivHash.slice(0, 16); // Use first 16 bytes as IV
467
+ // Decrypt this segment
468
+ var decryptedSegment = this.decryptAESNoPadding(segment, key, iv);
469
+ decryptedSegments.push(decryptedSegment);
470
+ }
471
+ // Concatenate all decrypted segments
472
+ var totalLength = decryptedSegments.reduce(function (sum, seg) { return sum + seg.length; }, 0);
473
+ var allDecrypted = new Uint8Array(totalLength);
474
+ var offset = 0;
475
+ try {
476
+ for (var decryptedSegments_1 = __values(decryptedSegments), decryptedSegments_1_1 = decryptedSegments_1.next(); !decryptedSegments_1_1.done; decryptedSegments_1_1 = decryptedSegments_1.next()) {
477
+ var seg = decryptedSegments_1_1.value;
478
+ allDecrypted.set(seg, offset);
479
+ offset += seg.length;
480
+ }
481
+ }
482
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
483
+ finally {
484
+ try {
485
+ if (decryptedSegments_1_1 && !decryptedSegments_1_1.done && (_a = decryptedSegments_1.return)) _a.call(decryptedSegments_1);
486
+ }
487
+ finally { if (e_1) throw e_1.error; }
488
+ }
489
+ // Trim to actual package size (remove padding)
490
+ var trimmed = allDecrypted.slice(0, packageSize);
491
+ // Create a proper ArrayBuffer from the decrypted data
492
+ var result = new ArrayBuffer(trimmed.byteLength);
493
+ new Uint8Array(result).set(trimmed);
494
+ return result;
495
+ };
496
+ CFBDecryptor.decryptAESNoPadding = function (data, key, iv) {
497
+ var cipher = cbc(key, iv, { disablePadding: true });
498
+ return cipher.decrypt(data);
499
+ };
500
+ CFBDecryptor.deriveAgileBlockKey = function (passwordDerivedKey, blockKey, info) {
501
+ return this.hash(this.concatArrays(passwordDerivedKey, blockKey), info.hashAlgorithm).slice(0, info.keySize);
502
+ };
503
+ CFBDecryptor.hash = function (data, algorithm) {
504
+ switch (algorithm.toUpperCase()) {
505
+ case "SHA1":
506
+ return sha1(data);
507
+ case "SHA256":
508
+ return sha256(data);
509
+ case "SHA384":
510
+ return sha384(data);
511
+ case "SHA512":
512
+ return sha512(data);
513
+ default:
514
+ throw new Error("Unsupported hash algorithm: ".concat(algorithm));
515
+ }
516
+ };
517
+ CFBDecryptor.stringToUtf16LE = function (str) {
518
+ var bytes = new Uint8Array(str.length * 2);
519
+ for (var i = 0; i < str.length; i++) {
520
+ var code = str.charCodeAt(i);
521
+ bytes[i * 2] = code & 0xff;
522
+ bytes[i * 2 + 1] = (code >> 8) & 0xff;
523
+ }
524
+ return bytes;
525
+ };
526
+ CFBDecryptor.concatArrays = function () {
527
+ var e_2, _a;
528
+ var arrays = [];
529
+ for (var _i = 0; _i < arguments.length; _i++) {
530
+ arrays[_i] = arguments[_i];
531
+ }
532
+ var totalLength = arrays.reduce(function (sum, arr) { return sum + arr.length; }, 0);
533
+ var result = new Uint8Array(totalLength);
534
+ var offset = 0;
535
+ try {
536
+ for (var arrays_1 = __values(arrays), arrays_1_1 = arrays_1.next(); !arrays_1_1.done; arrays_1_1 = arrays_1.next()) {
537
+ var arr = arrays_1_1.value;
538
+ result.set(arr, offset);
539
+ offset += arr.length;
540
+ }
541
+ }
542
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
543
+ finally {
544
+ try {
545
+ if (arrays_1_1 && !arrays_1_1.done && (_a = arrays_1.return)) _a.call(arrays_1);
546
+ }
547
+ finally { if (e_2) throw e_2.error; }
548
+ }
549
+ return result;
550
+ };
551
+ return CFBDecryptor;
552
+ }());
553
+ export { CFBDecryptor };
@@ -0,0 +1,23 @@
1
+ type EncryptOptions = {
2
+ spinCount?: number;
3
+ };
4
+ export declare class CFBEncryptor {
5
+ static encrypt(source: ArrayBuffer | Uint8Array, password: string, options?: EncryptOptions): Promise<Uint8Array>;
6
+ private static buildEncryptionInfoStream;
7
+ private static buildEncryptedPackageStream;
8
+ private static encryptPackage;
9
+ private static buildEncryptionXml;
10
+ private static derivePasswordKey;
11
+ private static deriveAgileBlockKey;
12
+ private static encryptDataIntegrityValue;
13
+ private static encryptAESNoPadding;
14
+ private static sha512Hash;
15
+ private static hmacSha512;
16
+ private static toBase64;
17
+ private static padToBlockSize;
18
+ private static stringToUtf16LE;
19
+ private static concatArrays;
20
+ private static randomBytes;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=cfb-encryptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cfb-encryptor.d.ts","sourceRoot":"","sources":["../../../excel-parser/cfb-encryptor.ts"],"names":[],"mappings":"AAMA,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAwBF,qBAAa,YAAY;WACV,OAAO,CAClB,MAAM,EAAE,WAAW,GAAG,UAAU,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC;IA4FtB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAWxC,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAW1C,OAAO,CAAC,MAAM,CAAC,cAAc;IA0B7B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA6CjC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAehC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAUlC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiBxC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IASlC,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAQvB,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B,OAAO,CAAC,MAAM,CAAC,YAAY;IAW3B,OAAO,CAAC,MAAM,CAAC,WAAW;CAc3B"}