@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,813 @@
1
+ import { __assign, __read, __spreadArray, __values } from "tslib";
2
+ import { getCellEffectiveFormat, getCellUserEnteredFormat, } from "@rowsncolumns/utils";
3
+ import { BUILTIN_NUMFMT_BY_PATTERN } from "../../excel-parser/builtin-numfmts";
4
+ var isStyleReference = function (value) {
5
+ return !!value && typeof value === "object" && "sid" in value;
6
+ };
7
+ // Built-in number-format dictionary is shared with the importer — see
8
+ // `excel-parser/builtin-numfmts.ts`. Pattern strings are the canonical
9
+ // Excel-writer form (quoted "$" for currency/accounting, `mmss.0` for
10
+ // numFmtId 47 per ECMA-376). Re-aliased for backwards compat with the
11
+ // previous local name in this file.
12
+ var BUILT_IN_NUMFMT_BY_PATTERN = BUILTIN_NUMFMT_BY_PATTERN;
13
+ var StyleBuilder = /** @class */ (function () {
14
+ function StyleBuilder() {
15
+ this.numberFormats = [];
16
+ this.fonts = [
17
+ {
18
+ name: "Calibri",
19
+ size: 11,
20
+ },
21
+ ];
22
+ this.fills = [{ pattern: "none" }, { pattern: "gray125" }];
23
+ this.borders = [{}];
24
+ this.namedCellStyles = [
25
+ { name: "Normal", xfId: 0, builtinId: 0 },
26
+ ];
27
+ this.customTableStyles = [];
28
+ this.cellXfs = [
29
+ {
30
+ numFmtId: 0,
31
+ fontId: 0,
32
+ fillId: 0,
33
+ borderId: 0,
34
+ },
35
+ ];
36
+ this.fontMap = new Map();
37
+ this.fillMap = new Map();
38
+ this.borderMap = new Map();
39
+ this.formatMap = new Map();
40
+ this.xfMap = new Map();
41
+ this.dxfs = [];
42
+ this.dxfMap = new Map();
43
+ this.fontMap.set(this.serializeFont(this.fonts[0]), 0);
44
+ this.fillMap.set(this.serializeFill(this.fills[0]), 0);
45
+ this.fillMap.set(this.serializeFill(this.fills[1]), 1);
46
+ this.borderMap.set(this.serializeBorder(this.borders[0]), 0);
47
+ this.xfMap.set(serializeXf(this.cellXfs[0]), 0);
48
+ }
49
+ /**
50
+ * Replace the named-cell-styles list emitted in `<cellStyles>`.
51
+ * Used for round-tripping the OOXML Heading 1 / Accent / Total /
52
+ * Good-Bad-Neutral gallery — the importer parses these from
53
+ * `xl/styles.xml` and exposes them on `workbook.workbookStyles.
54
+ * namedCellStyles`; hosts can forward that list back here.
55
+ *
56
+ * Excel requires at least a "Normal" entry pointing at xfId=0,
57
+ * builtinId=0 — when the supplied list doesn't contain one, we
58
+ * keep the default at the head of the list rather than risk
59
+ * emitting a file Excel rejects.
60
+ */
61
+ StyleBuilder.prototype.setNamedCellStyles = function (entries) {
62
+ if (!entries || entries.length === 0)
63
+ return;
64
+ var hasNormal = entries.some(function (e) { return e.builtinId === 0 || e.name === "Normal"; });
65
+ this.namedCellStyles = hasNormal
66
+ ? entries.slice()
67
+ : __spreadArray([{ name: "Normal", xfId: 0, builtinId: 0 }], __read(entries), false);
68
+ };
69
+ /**
70
+ * Replace the user-authored table-style list emitted in the
71
+ * `<tableStyles>` block. The exporter registers each element's
72
+ * format as a dxf at `toXml()` time, so callers pass self-contained
73
+ * records (no dxfIds to manage). Used for round-tripping the
74
+ * OOXML custom-table-style list from
75
+ * `workbook.workbookStyles.getCustomTableStyleExports()`.
76
+ */
77
+ StyleBuilder.prototype.setCustomTableStyles = function (entries) {
78
+ if (!entries || entries.length === 0) {
79
+ this.customTableStyles = [];
80
+ return;
81
+ }
82
+ this.customTableStyles = entries.slice();
83
+ };
84
+ /**
85
+ * Replace the workbook default font (font id 0 — what every cell without
86
+ * an explicit font inherits). Callers pass the source workbook's parsed
87
+ * default (`WorkBook.getDefaultFont()`) so an imported workbook keeps its
88
+ * default typeface/size instead of the hardcoded Calibri 11. Must be
89
+ * called before any cell registration: cells explicitly styled with the
90
+ * old default must not collapse into font id 0.
91
+ */
92
+ StyleBuilder.prototype.setDefaultFont = function (format) {
93
+ if (this.fonts.length > 1)
94
+ return;
95
+ var record = this.buildFontRecord(format);
96
+ if (!record)
97
+ return;
98
+ this.fonts[0] = record;
99
+ this.fontMap.clear();
100
+ this.fontMap.set(this.serializeFont(record), 0);
101
+ };
102
+ StyleBuilder.prototype.registerCell = function (cell, cellXfs,
103
+ /**
104
+ * Number format to use when the cell itself has none. Used by the
105
+ * exporter to layer in the precedent-derived number format on formula
106
+ * cells so Excel displays them correctly without requiring a recalc.
107
+ */
108
+ derivedNumberFormat) {
109
+ var _a, _b, _c, _d, _e, _f, _g;
110
+ if (!cell)
111
+ return 0;
112
+ // Match Excel's model: persist only the user-entered format. Auto-
113
+ // derived alignment / pattern color / formula precedent format are
114
+ // recomputed at render time and never serialized to disk. Legacy `ef`
115
+ // is still read as a fallback so old files continue to export with the
116
+ // formatting they originally had.
117
+ var userEnteredFormat = normalizeFormat(getCellUserEnteredFormat(cell), cellXfs);
118
+ var effectiveFormat = (_a = userEnteredFormat !== null && userEnteredFormat !== void 0 ? userEnteredFormat : normalizeFormat(getCellEffectiveFormat(cell), cellXfs)) !== null && _a !== void 0 ? _a : undefined;
119
+ // Layer in the derived number format only when the cell's own format
120
+ // has nothing in that slot. User-set formats always win.
121
+ if (derivedNumberFormat && !(effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.numberFormat)) {
122
+ effectiveFormat = __assign(__assign({}, (effectiveFormat !== null && effectiveFormat !== void 0 ? effectiveFormat : {})), { numberFormat: derivedNumberFormat });
123
+ }
124
+ var numberFormatId = this.getNumberFormatId(effectiveFormat);
125
+ var fontId = this.getFontId(effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.textFormat);
126
+ var fillId = this.getFillId(effectiveFormat);
127
+ var borderId = this.getBorderId(effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.borders);
128
+ var xfRecord = {
129
+ numFmtId: numberFormatId,
130
+ fontId: fontId,
131
+ fillId: fillId,
132
+ borderId: borderId,
133
+ wrapText: (effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.wrapStrategy) === "wrap",
134
+ horizontalAlignment: normalizeHorizontalAlignment(effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.horizontalAlignment),
135
+ verticalAlignment: normalizeVerticalAlignment(effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.verticalAlignment),
136
+ indent: (_b = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.indent) !== null && _b !== void 0 ? _b : undefined,
137
+ relativeIndent: (_c = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.relativeIndent) !== null && _c !== void 0 ? _c : undefined,
138
+ textRotation: (_d = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.textRotation) !== null && _d !== void 0 ? _d : undefined,
139
+ shrinkToFit: (_e = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.shrinkToFit) !== null && _e !== void 0 ? _e : undefined,
140
+ // Protection lives top-level on the cell (not on the format) — read
141
+ // it off the cell directly. The xf still carries the flags because
142
+ // that's where Excel persists them; we synthesize a unique xf per
143
+ // protection variant via the cache key below.
144
+ protectionLocked: ((_f = cell === null || cell === void 0 ? void 0 : cell.protection) === null || _f === void 0 ? void 0 : _f.locked) === false ? false : undefined,
145
+ protectionHidden: ((_g = cell === null || cell === void 0 ? void 0 : cell.protection) === null || _g === void 0 ? void 0 : _g.hidden) === true ? true : undefined,
146
+ };
147
+ var key = serializeXf(xfRecord);
148
+ var existing = this.xfMap.get(key);
149
+ if (typeof existing === "number") {
150
+ return existing;
151
+ }
152
+ var nextId = this.cellXfs.length;
153
+ this.cellXfs.push(xfRecord);
154
+ this.xfMap.set(key, nextId);
155
+ return nextId;
156
+ };
157
+ StyleBuilder.prototype.registerDifferentialFormat = function (format) {
158
+ if (!format)
159
+ return undefined;
160
+ var record = {};
161
+ if (format.backgroundColor) {
162
+ record.fill = {
163
+ color: format.backgroundColor,
164
+ };
165
+ }
166
+ var font = this.buildFontRecord(format.textFormat);
167
+ if (font) {
168
+ record.font = font;
169
+ }
170
+ if (!record.fill && !record.font) {
171
+ return undefined;
172
+ }
173
+ var key = this.serializeDxf(record);
174
+ var existing = this.dxfMap.get(key);
175
+ if (typeof existing === "number") {
176
+ return existing;
177
+ }
178
+ var nextId = this.dxfs.length;
179
+ this.dxfs.push(record);
180
+ this.dxfMap.set(key, nextId);
181
+ return nextId;
182
+ };
183
+ StyleBuilder.prototype.getNumberFormatId = function (effectiveFormat) {
184
+ var _a;
185
+ var pattern = (_a = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.numberFormat) === null || _a === void 0 ? void 0 : _a.pattern;
186
+ if (!pattern)
187
+ return 0;
188
+ // Preserve trailing whitespace in the pattern verbatim — number-format
189
+ // strings legitimately end with significant `\xa0` (non-breaking space)
190
+ // chars for column-aligned currency/accounting formats. Trimming here
191
+ // mangled those formats on round-trip and broke comparator equality
192
+ // against the source `<numFmts>` table. We still dedupe via the map
193
+ // using the raw pattern as key.
194
+ var normalizedPattern = pattern;
195
+ // Try Excel's built-in numFmtId table (0–49). When our pattern matches
196
+ // a built-in exactly, emit that ID — Excel and other readers render
197
+ // identically and we avoid bloating <numFmts> with a redundant
198
+ // custom entry.
199
+ var builtInId = BUILT_IN_NUMFMT_BY_PATTERN.get(normalizedPattern);
200
+ if (typeof builtInId === "number") {
201
+ return builtInId;
202
+ }
203
+ var existing = this.formatMap.get(normalizedPattern);
204
+ if (typeof existing === "number") {
205
+ return existing;
206
+ }
207
+ // ECMA-376 §18.8.30: built-in numFmtIds occupy 0–163. Custom IDs
208
+ // start at 164 by convention (Excel's own writer does the same).
209
+ var nextId = 164 + this.numberFormats.length;
210
+ this.numberFormats.push({
211
+ id: nextId,
212
+ format: normalizedPattern,
213
+ });
214
+ this.formatMap.set(normalizedPattern, nextId);
215
+ return nextId;
216
+ };
217
+ StyleBuilder.prototype.getFontId = function (format) {
218
+ var record = this.buildFontRecord(format);
219
+ if (!record)
220
+ return 0;
221
+ var key = this.serializeFont(record);
222
+ var existing = this.fontMap.get(key);
223
+ if (typeof existing === "number") {
224
+ return existing;
225
+ }
226
+ var nextId = this.fonts.length;
227
+ this.fonts.push(record);
228
+ this.fontMap.set(key, nextId);
229
+ return nextId;
230
+ };
231
+ StyleBuilder.prototype.getFillId = function (format) {
232
+ var _a, _b, _c, _d, _e;
233
+ var fillPattern = (_a = format === null || format === void 0 ? void 0 : format.fillPattern) !== null && _a !== void 0 ? _a : undefined;
234
+ var fgColor = (_b = format === null || format === void 0 ? void 0 : format.foregroundColor) !== null && _b !== void 0 ? _b : undefined;
235
+ var bgColor = (_c = format === null || format === void 0 ? void 0 : format.backgroundColor) !== null && _c !== void 0 ? _c : undefined;
236
+ var gradient = (_d = format === null || format === void 0 ? void 0 : format.gradient) !== null && _d !== void 0 ? _d : undefined;
237
+ // Gradient fill takes precedence over pattern — Excel's UI treats
238
+ // them as mutually exclusive on a single cell.
239
+ if (gradient && ((_e = gradient.stops) === null || _e === void 0 ? void 0 : _e.length)) {
240
+ var record_1 = { gradient: gradient };
241
+ var key_1 = this.serializeFill(record_1);
242
+ var existing_1 = this.fillMap.get(key_1);
243
+ if (typeof existing_1 === "number")
244
+ return existing_1;
245
+ var nextId_1 = this.fills.length;
246
+ this.fills.push(record_1);
247
+ this.fillMap.set(key_1, nextId_1);
248
+ return nextId_1;
249
+ }
250
+ // Patterned (non-solid) fill: `color` carries the foreground (pattern)
251
+ // color and `bgColor` carries the under-layer that shows through the
252
+ // pattern gaps. Solid fill keeps the legacy single-color path.
253
+ if (fillPattern &&
254
+ fillPattern !== "none" &&
255
+ fillPattern !== "solid") {
256
+ var record_2 = {
257
+ color: fgColor !== null && fgColor !== void 0 ? fgColor : bgColor,
258
+ bgColor: fgColor ? bgColor : undefined,
259
+ pattern: fillPattern,
260
+ };
261
+ var key_2 = this.serializeFill(record_2);
262
+ var existing_2 = this.fillMap.get(key_2);
263
+ if (typeof existing_2 === "number")
264
+ return existing_2;
265
+ var nextId_2 = this.fills.length;
266
+ this.fills.push(record_2);
267
+ this.fillMap.set(key_2, nextId_2);
268
+ return nextId_2;
269
+ }
270
+ // Solid fill: prefer explicit foregroundColor, fall back to
271
+ // backgroundColor for the common authored-as-bg case.
272
+ var color = fgColor !== null && fgColor !== void 0 ? fgColor : bgColor;
273
+ var record = {
274
+ color: color,
275
+ pattern: color ? "solid" : "none",
276
+ };
277
+ var key = this.serializeFill(record);
278
+ var existing = this.fillMap.get(key);
279
+ if (typeof existing === "number") {
280
+ return existing;
281
+ }
282
+ var nextId = this.fills.length;
283
+ this.fills.push(record);
284
+ this.fillMap.set(key, nextId);
285
+ return nextId;
286
+ };
287
+ StyleBuilder.prototype.getBorderId = function (borders) {
288
+ var _a;
289
+ // OOXML uses a single <diagonal> child plus diagonalUp/diagonalDown
290
+ // attributes. If both diagonals are present and identically styled the
291
+ // first non-null one defines the edge; otherwise each flag is set
292
+ // independently and both share the same painted style. This matches
293
+ // how Excel collapses diagonal pairs.
294
+ var diagonalEdge = convertBorderEdge((_a = borders === null || borders === void 0 ? void 0 : borders.diagonalUp) !== null && _a !== void 0 ? _a : borders === null || borders === void 0 ? void 0 : borders.diagonalDown);
295
+ var record = {
296
+ top: convertBorderEdge(borders === null || borders === void 0 ? void 0 : borders.top),
297
+ bottom: convertBorderEdge(borders === null || borders === void 0 ? void 0 : borders.bottom),
298
+ left: convertBorderEdge(borders === null || borders === void 0 ? void 0 : borders.left),
299
+ right: convertBorderEdge(borders === null || borders === void 0 ? void 0 : borders.right),
300
+ diagonal: diagonalEdge,
301
+ diagonalUp: !!(borders === null || borders === void 0 ? void 0 : borders.diagonalUp),
302
+ diagonalDown: !!(borders === null || borders === void 0 ? void 0 : borders.diagonalDown),
303
+ };
304
+ var key = this.serializeBorder(record);
305
+ var existing = this.borderMap.get(key);
306
+ if (typeof existing === "number") {
307
+ return existing;
308
+ }
309
+ var nextId = this.borders.length;
310
+ this.borders.push(record);
311
+ this.borderMap.set(key, nextId);
312
+ return nextId;
313
+ };
314
+ StyleBuilder.prototype.serializeFont = function (font) {
315
+ var _a, _b, _c;
316
+ return [
317
+ (_a = font.name) !== null && _a !== void 0 ? _a : "",
318
+ (_b = font.size) !== null && _b !== void 0 ? _b : "",
319
+ font.bold ? "1" : "",
320
+ font.italic ? "1" : "",
321
+ font.underline ? "1" : "",
322
+ font.strike ? "1" : "",
323
+ serializeColor(font.color),
324
+ (_c = font.vertAlign) !== null && _c !== void 0 ? _c : "",
325
+ ].join("|");
326
+ };
327
+ StyleBuilder.prototype.buildFontRecord = function (format) {
328
+ var _a, _b, _c, _d, _e, _f, _g;
329
+ if (!(format === null || format === void 0 ? void 0 : format.bold) &&
330
+ !(format === null || format === void 0 ? void 0 : format.italic) &&
331
+ !(format === null || format === void 0 ? void 0 : format.underline) &&
332
+ !(format === null || format === void 0 ? void 0 : format.strikethrough) &&
333
+ !(format === null || format === void 0 ? void 0 : format.fontSize) &&
334
+ !(format === null || format === void 0 ? void 0 : format.fontFamily) &&
335
+ !(format === null || format === void 0 ? void 0 : format.color) &&
336
+ !(format === null || format === void 0 ? void 0 : format.baselineOffset)) {
337
+ return undefined;
338
+ }
339
+ var vertAlign = (format === null || format === void 0 ? void 0 : format.baselineOffset) === "superscript" ||
340
+ (format === null || format === void 0 ? void 0 : format.baselineOffset) === "subscript"
341
+ ? format.baselineOffset
342
+ : undefined;
343
+ return {
344
+ bold: (_a = format === null || format === void 0 ? void 0 : format.bold) !== null && _a !== void 0 ? _a : undefined,
345
+ italic: (_b = format === null || format === void 0 ? void 0 : format.italic) !== null && _b !== void 0 ? _b : undefined,
346
+ underline: (_c = format === null || format === void 0 ? void 0 : format.underline) !== null && _c !== void 0 ? _c : undefined,
347
+ strike: (_d = format === null || format === void 0 ? void 0 : format.strikethrough) !== null && _d !== void 0 ? _d : undefined,
348
+ size: (_e = format === null || format === void 0 ? void 0 : format.fontSize) !== null && _e !== void 0 ? _e : undefined,
349
+ name: (_f = format === null || format === void 0 ? void 0 : format.fontFamily) !== null && _f !== void 0 ? _f : undefined,
350
+ color: (_g = format === null || format === void 0 ? void 0 : format.color) !== null && _g !== void 0 ? _g : undefined,
351
+ vertAlign: vertAlign,
352
+ };
353
+ };
354
+ StyleBuilder.prototype.buildFontXml = function (font) {
355
+ var color = serializeColorXml(font.color);
356
+ var name = sanitizeFontName(font.name);
357
+ return "<font>".concat(font.size ? "<sz val=\"".concat(font.size, "\"/>") : "").concat(name ? "<name val=\"".concat(escapeXml(name), "\"/>") : "").concat(font.bold ? "<b/>" : "").concat(font.italic ? "<i/>" : "").concat(font.underline ? "<u/>" : "").concat(font.strike ? "<strike/>" : "").concat(font.vertAlign ? "<vertAlign val=\"".concat(font.vertAlign, "\"/>") : "").concat(color ? "<color ".concat(color, "/>") : "", "</font>");
358
+ };
359
+ StyleBuilder.prototype.buildFillXml = function (fill, forDxf) {
360
+ var _a, _b;
361
+ if (forDxf === void 0) { forDxf = false; }
362
+ // Gradient fill — emits `<gradientFill>` with `<stop>` children.
363
+ // Excel accepts gradients in cell fills (not dxf), so when this is
364
+ // requested for a dxf record we degrade to a solid using the first
365
+ // stop's color so the conditional format still has SOMETHING to paint.
366
+ if (fill.gradient && ((_a = fill.gradient.stops) === null || _a === void 0 ? void 0 : _a.length)) {
367
+ if (forDxf) {
368
+ var first = fill.gradient.stops[0].color;
369
+ var fallback = serializeColorXml(first);
370
+ if (fallback) {
371
+ return "<fill><patternFill patternType=\"solid\"><fgColor ".concat(fallback, "/><bgColor ").concat(fallback, "/></patternFill></fill>");
372
+ }
373
+ return "<fill><patternFill patternType=\"none\"/></fill>";
374
+ }
375
+ return this.buildGradientFillXml(fill.gradient);
376
+ }
377
+ var pattern = (_b = fill.pattern) !== null && _b !== void 0 ? _b : (fill.color ? "solid" : "none");
378
+ if (pattern === "gray125" && !fill.color) {
379
+ return "<fill><patternFill patternType=\"gray125\"/></fill>";
380
+ }
381
+ var color = serializeColorXml(fill.color);
382
+ if (pattern === "none" || !color) {
383
+ return "<fill><patternFill patternType=\"none\"/></fill>";
384
+ }
385
+ if (pattern === "solid") {
386
+ if (forDxf) {
387
+ return "<fill><patternFill patternType=\"solid\"><fgColor ".concat(color, "/><bgColor ").concat(color, "/></patternFill></fill>");
388
+ }
389
+ return "<fill><patternFill patternType=\"solid\"><fgColor ".concat(color, "/><bgColor indexed=\"64\"/></patternFill></fill>");
390
+ }
391
+ // True patterned fill — emit both fg and bg if available.
392
+ var bgColor = serializeColorXml(fill.bgColor);
393
+ var bgAttr = bgColor ? "<bgColor ".concat(bgColor, "/>") : "<bgColor indexed=\"64\"/>";
394
+ return "<fill><patternFill patternType=\"".concat(pattern, "\"><fgColor ").concat(color, "/>").concat(bgAttr, "</patternFill></fill>");
395
+ };
396
+ StyleBuilder.prototype.buildGradientFillXml = function (gradient) {
397
+ var stopsXml = gradient.stops
398
+ .map(function (s) {
399
+ var color = serializeColorXml(s.color);
400
+ return "<stop position=\"".concat(s.position, "\">").concat(color ? "<color ".concat(color, "/>") : "", "</stop>");
401
+ })
402
+ .join("");
403
+ var attrs = [];
404
+ if (gradient.type === "path") {
405
+ attrs.push('type="path"');
406
+ if (gradient.left != null)
407
+ attrs.push("left=\"".concat(gradient.left, "\""));
408
+ if (gradient.right != null)
409
+ attrs.push("right=\"".concat(gradient.right, "\""));
410
+ if (gradient.top != null)
411
+ attrs.push("top=\"".concat(gradient.top, "\""));
412
+ if (gradient.bottom != null)
413
+ attrs.push("bottom=\"".concat(gradient.bottom, "\""));
414
+ }
415
+ else if (gradient.degree != null && gradient.degree !== 0) {
416
+ attrs.push("degree=\"".concat(gradient.degree, "\""));
417
+ }
418
+ var attrStr = attrs.length ? " " + attrs.join(" ") : "";
419
+ return "<fill><gradientFill".concat(attrStr, ">").concat(stopsXml, "</gradientFill></fill>");
420
+ };
421
+ StyleBuilder.prototype.serializeFill = function (fill) {
422
+ var _a, _b, _c, _d, _e, _f;
423
+ var gradientKey = fill.gradient
424
+ ? "G:".concat(fill.gradient.type, ":").concat((_a = fill.gradient.degree) !== null && _a !== void 0 ? _a : "", ":").concat((_b = fill.gradient.left) !== null && _b !== void 0 ? _b : "", ":").concat((_c = fill.gradient.right) !== null && _c !== void 0 ? _c : "", ":").concat((_d = fill.gradient.top) !== null && _d !== void 0 ? _d : "", ":").concat((_e = fill.gradient.bottom) !== null && _e !== void 0 ? _e : "", ":").concat(fill.gradient.stops
425
+ .map(function (s) { return "".concat(s.position, ",").concat(s.color); })
426
+ .join("|"))
427
+ : "";
428
+ return "".concat((_f = fill.pattern) !== null && _f !== void 0 ? _f : "", ":").concat(serializeColor(fill.color), ":").concat(serializeColor(fill.bgColor), ":").concat(gradientKey);
429
+ };
430
+ StyleBuilder.prototype.serializeBorder = function (border) {
431
+ return [
432
+ serializeBorderEdge(border.top),
433
+ serializeBorderEdge(border.bottom),
434
+ serializeBorderEdge(border.left),
435
+ serializeBorderEdge(border.right),
436
+ serializeBorderEdge(border.diagonal),
437
+ border.diagonalUp ? "1" : "",
438
+ border.diagonalDown ? "1" : "",
439
+ ].join("|");
440
+ };
441
+ StyleBuilder.prototype.serializeDxf = function (dxf) {
442
+ return "".concat(dxf.fill ? this.serializeFill(dxf.fill) : "", "|").concat(dxf.font ? this.serializeFont(dxf.font) : "");
443
+ };
444
+ StyleBuilder.prototype.toXml = function () {
445
+ var _this = this;
446
+ var numFmtXml = this.numberFormats.length
447
+ ? "<numFmts count=\"".concat(this.numberFormats.length, "\">").concat(this.numberFormats
448
+ .map(function (fmt) {
449
+ return "<numFmt numFmtId=\"".concat(fmt.id, "\" formatCode=\"").concat(escapeXml(fmt.format), "\"/>");
450
+ })
451
+ .join(""), "</numFmts>")
452
+ : "<numFmts count=\"0\"/>";
453
+ var fontXml = "<fonts count=\"".concat(this.fonts.length, "\">").concat(this.fonts
454
+ .map(function (font) { return _this.buildFontXml(font); })
455
+ .join(""), "</fonts>");
456
+ var fillXml = "<fills count=\"".concat(this.fills.length, "\">").concat(this.fills
457
+ .map(function (fill) { return _this.buildFillXml(fill, false); })
458
+ .join(""), "</fills>");
459
+ var borderXml = "<borders count=\"".concat(this.borders.length, "\">").concat(this.borders
460
+ .map(function (border) {
461
+ var top = serializeBorderEdgeXml(border.top, "top");
462
+ var bottom = serializeBorderEdgeXml(border.bottom, "bottom");
463
+ var left = serializeBorderEdgeXml(border.left, "left");
464
+ var right = serializeBorderEdgeXml(border.right, "right");
465
+ var diagonal = border.diagonal
466
+ ? serializeBorderEdgeXml(border.diagonal, "diagonal")
467
+ : "<diagonal/>";
468
+ var diagonalAttrs = "".concat(border.diagonalUp ? " diagonalUp=\"1\"" : "").concat(border.diagonalDown ? " diagonalDown=\"1\"" : "");
469
+ return "<border".concat(diagonalAttrs, ">").concat(left).concat(right).concat(top).concat(bottom).concat(diagonal, "</border>");
470
+ })
471
+ .join(""), "</borders>");
472
+ var cellXfsXml = "<cellXfs count=\"".concat(this.cellXfs.length, "\">").concat(this.cellXfs
473
+ .map(function (record) {
474
+ var alignment = serializeAlignment(record);
475
+ var protection = serializeProtection(record);
476
+ // ECMA-376 §18.8.45: `applyX="1"` signals that this xf overrides
477
+ // the named-style parent (xfId=0) for that aspect. Excel tolerates
478
+ // missing applyX, but stricter readers (older LibreOffice, some
479
+ // headless engines) honor only the parent's value when applyX is
480
+ // absent. Emit each flag when the corresponding id deviates from
481
+ // the parent's defaults (0 across the board) or when alignment is
482
+ // present.
483
+ var applyNumberFormat = record.numFmtId !== 0 ? " applyNumberFormat=\"1\"" : "";
484
+ var applyFont = record.fontId !== 0 ? " applyFont=\"1\"" : "";
485
+ var applyFill = record.fillId !== 0 ? " applyFill=\"1\"" : "";
486
+ var applyBorder = record.borderId !== 0 ? " applyBorder=\"1\"" : "";
487
+ var applyAlignment = alignment ? " applyAlignment=\"1\"" : "";
488
+ var applyProtection = protection ? " applyProtection=\"1\"" : "";
489
+ return "<xf numFmtId=\"".concat(record.numFmtId, "\" fontId=\"").concat(record.fontId, "\" fillId=\"").concat(record.fillId, "\" borderId=\"").concat(record.borderId, "\" xfId=\"0\"").concat(applyNumberFormat).concat(applyFont).concat(applyFill).concat(applyBorder).concat(applyAlignment).concat(applyProtection, ">").concat(alignment).concat(protection, "</xf>");
490
+ })
491
+ .join(""), "</cellXfs>");
492
+ var resolvedTableStyles = this.customTableStyles.map(function (style) {
493
+ var e_1, _a;
494
+ var resolvedElements = [];
495
+ try {
496
+ for (var _b = __values(style.elements), _c = _b.next(); !_c.done; _c = _b.next()) {
497
+ var el = _c.value;
498
+ var dxfId = _this.registerDifferentialFormat(__assign(__assign({}, (el.backgroundColor
499
+ ? { backgroundColor: el.backgroundColor }
500
+ : {})), (el.textColor || el.bold || el.italic
501
+ ? {
502
+ textFormat: __assign(__assign(__assign({}, (el.textColor ? { color: el.textColor } : {})), (el.bold ? { bold: true } : {})), (el.italic ? { italic: true } : {})),
503
+ }
504
+ : {})));
505
+ // Drop elements that didn't contribute any recognized format —
506
+ // an undefined dxfId means `registerDifferentialFormat` saw
507
+ // an empty record. (dxfId === 0 is the valid first-slot
508
+ // entry, so we explicitly exclude only `undefined`.)
509
+ if (dxfId === undefined)
510
+ continue;
511
+ resolvedElements.push(__assign({ type: el.type, dxfId: dxfId }, (el.size != null ? { size: el.size } : {})));
512
+ }
513
+ }
514
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
515
+ finally {
516
+ try {
517
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
518
+ }
519
+ finally { if (e_1) throw e_1.error; }
520
+ }
521
+ return {
522
+ name: style.name,
523
+ pivot: style.pivot,
524
+ elements: resolvedElements,
525
+ };
526
+ });
527
+ var dxfsXml = this.dxfs.length
528
+ ? "<dxfs count=\"".concat(this.dxfs.length, "\">").concat(this.dxfs
529
+ .map(function (dxf) {
530
+ var font = dxf.font ? _this.buildFontXml(dxf.font) : "";
531
+ var fill = dxf.fill ? _this.buildFillXml(dxf.fill, true) : "";
532
+ return "<dxf>".concat(font).concat(fill, "</dxf>");
533
+ })
534
+ .join(""), "</dxfs>")
535
+ : "<dxfs count=\"0\"/>";
536
+ var cellStylesXml = "<cellStyles count=\"".concat(this.namedCellStyles.length, "\">").concat(this.namedCellStyles
537
+ .map(function (s) {
538
+ var parts = ["name=\"".concat(escapeXml(s.name), "\"")];
539
+ parts.push("xfId=\"".concat(s.xfId, "\""));
540
+ if (s.builtinId != null)
541
+ parts.push("builtinId=\"".concat(s.builtinId, "\""));
542
+ if (s.iLevel != null)
543
+ parts.push("iLevel=\"".concat(s.iLevel, "\""));
544
+ if (s.hidden)
545
+ parts.push("hidden=\"1\"");
546
+ if (s.customBuiltin)
547
+ parts.push("customBuiltin=\"1\"");
548
+ return "<cellStyle ".concat(parts.join(" "), "/>");
549
+ })
550
+ .join(""), "</cellStyles>");
551
+ // Emit user-authored table styles. Excel REQUIRES the
552
+ // `defaultTableStyle` + `defaultPivotStyle` attributes to be the
553
+ // names of built-in styles (or styles defined here) — we keep
554
+ // the built-in defaults regardless of whether any custom styles
555
+ // are present.
556
+ var customTableStylesXml = resolvedTableStyles
557
+ .filter(function (s) { return s.elements.length > 0; })
558
+ .map(function (s) {
559
+ var pivotAttr = s.pivot ? " pivot=\"1\"" : " pivot=\"0\"";
560
+ var elementsXml = s.elements
561
+ .map(function (el) {
562
+ var sizeAttr = el.size != null ? " size=\"".concat(el.size, "\"") : "";
563
+ return "<tableStyleElement type=\"".concat(escapeXml(el.type), "\" dxfId=\"").concat(el.dxfId, "\"").concat(sizeAttr, "/>");
564
+ })
565
+ .join("");
566
+ return "<tableStyle name=\"".concat(escapeXml(s.name), "\"").concat(pivotAttr, " count=\"").concat(s.elements.length, "\">").concat(elementsXml, "</tableStyle>");
567
+ })
568
+ .join("");
569
+ var tableStylesXml = "<tableStyles count=\"".concat(resolvedTableStyles.filter(function (s) { return s.elements.length > 0; }).length, "\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\">").concat(customTableStylesXml, "</tableStyles>");
570
+ var styleXml = "".concat(XML_DECLARATION, "<styleSheet xmlns=\"").concat(WORKSHEET_NS, "\">").concat(numFmtXml).concat(fontXml).concat(fillXml).concat(borderXml, "<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>").concat(cellXfsXml).concat(cellStylesXml).concat(dxfsXml).concat(tableStylesXml, "</styleSheet>");
571
+ return styleXml;
572
+ };
573
+ return StyleBuilder;
574
+ }());
575
+ export { StyleBuilder };
576
+ var convertBorderEdge = function (border) {
577
+ var _a;
578
+ if (!border || !border.style)
579
+ return undefined;
580
+ return {
581
+ style: mapBorderStyle(border.style),
582
+ color: (_a = border.color) !== null && _a !== void 0 ? _a : undefined,
583
+ };
584
+ };
585
+ var mapBorderStyle = function (style) {
586
+ switch (style) {
587
+ case "dashed":
588
+ return "dashed";
589
+ case "dotted":
590
+ return "dotted";
591
+ case "double":
592
+ return "double";
593
+ case "solid_medium":
594
+ return "medium";
595
+ case "solid_thick":
596
+ return "thick";
597
+ case "hair":
598
+ return "hair";
599
+ case "mediumDashed":
600
+ return "mediumDashed";
601
+ case "mediumDashDot":
602
+ return "mediumDashDot";
603
+ case "dashDot":
604
+ return "dashDot";
605
+ case "dashDotDot":
606
+ return "dashDotDot";
607
+ case "slantDashDot":
608
+ return "slantDashDot";
609
+ case "thin":
610
+ // openpyxl/Excel's "thin" is the regular 1px border. The previous
611
+ // mapping returned Excel's "hair" (the lightest sub-1px border),
612
+ // which produced near-invisible borders for any caller — including
613
+ // athena-openpyxl — that explicitly asks for `Side(style="thin")`.
614
+ return "thin";
615
+ case "solid":
616
+ default:
617
+ // rowsncolumns' generic "solid" remains aliased to Excel's "thin"
618
+ // (the regular 1px border) when no explicit thickness is requested.
619
+ return "thin";
620
+ }
621
+ };
622
+ var serializeBorderEdge = function (edge) {
623
+ if (!edge)
624
+ return "";
625
+ return "".concat(edge.style || "", ":").concat(serializeColor(edge.color));
626
+ };
627
+ var serializeBorderEdgeXml = function (edge, side) {
628
+ if (!(edge === null || edge === void 0 ? void 0 : edge.style)) {
629
+ return "<".concat(side, "/>");
630
+ }
631
+ var color = serializeColorXml(edge.color);
632
+ return "<".concat(side, " style=\"").concat(edge.style, "\">").concat(color ? "<color ".concat(color, "/>") : "", "</").concat(side, ">");
633
+ };
634
+ var serializeColor = function (color) {
635
+ var _a, _b;
636
+ if (!color)
637
+ return "";
638
+ if (typeof color === "string") {
639
+ return (_a = normalizeHex(color)) !== null && _a !== void 0 ? _a : "";
640
+ }
641
+ return "theme".concat(color.theme, ":").concat((_b = color.tint) !== null && _b !== void 0 ? _b : "");
642
+ };
643
+ var serializeColorXml = function (color) {
644
+ if (!color)
645
+ return undefined;
646
+ if (typeof color === "string") {
647
+ var hex = normalizeHex(color);
648
+ return hex ? "rgb=\"".concat(hex, "\"") : undefined;
649
+ }
650
+ var tintAttr = typeof color.tint === "number" ? " tint=\"".concat(color.tint, "\"") : "";
651
+ return "theme=\"".concat(color.theme, "\"").concat(tintAttr);
652
+ };
653
+ // Excel <name val=""/> expects a single font family ≤31 chars. CSS font stacks
654
+ // (`InterVariable, system-ui, sans-serif`) make Excel reject the entire styles
655
+ // part. Take the first family and strip surrounding quotes.
656
+ var sanitizeFontName = function (name) {
657
+ if (!name || typeof name !== "string")
658
+ return undefined;
659
+ var first = name.split(",")[0].trim().replace(/^['"]|['"]$/g, "");
660
+ if (!first)
661
+ return undefined;
662
+ return first.length > 31 ? first.slice(0, 31) : first;
663
+ };
664
+ var HEX6_RE = /^[0-9A-Fa-f]{6}$/;
665
+ var HEX8_RE = /^[0-9A-Fa-f]{8}$/;
666
+ var RGB_FUNC_RE = /^rgba?\s*\(\s*(\d+)\s*[, ]\s*(\d+)\s*[, ]\s*(\d+)(?:\s*[, /]\s*([\d.]+))?\s*\)$/i;
667
+ // Returns AARRGGBB hex for any recognized color string; undefined otherwise.
668
+ // Excel rejects the whole styles.xml if rgb="" contains non-hex or unescaped
669
+ // quotes (which CSS strings like `font-family:"Times New Roman"` would produce).
670
+ var normalizeHex = function (color) {
671
+ if (typeof color !== "string")
672
+ return undefined;
673
+ var trimmed = color.trim();
674
+ if (!trimmed)
675
+ return undefined;
676
+ var noHash = trimmed.startsWith("#") ? trimmed.slice(1) : trimmed;
677
+ if (HEX8_RE.test(noHash))
678
+ return noHash.toUpperCase();
679
+ if (HEX6_RE.test(noHash))
680
+ return "FF".concat(noHash.toUpperCase());
681
+ var m = RGB_FUNC_RE.exec(trimmed);
682
+ if (m) {
683
+ var toHex = function (s) {
684
+ var n = Math.max(0, Math.min(255, parseInt(s, 10) | 0));
685
+ return n.toString(16).padStart(2, "0").toUpperCase();
686
+ };
687
+ var alpha = m[4] != null
688
+ ? Math.max(0, Math.min(255, Math.round(parseFloat(m[4]) * 255)))
689
+ .toString(16)
690
+ .padStart(2, "0")
691
+ .toUpperCase()
692
+ : "FF";
693
+ return "".concat(alpha).concat(toHex(m[1])).concat(toHex(m[2])).concat(toHex(m[3]));
694
+ }
695
+ return undefined;
696
+ };
697
+ var serializeAlignment = function (record) {
698
+ var attrs = [];
699
+ if (record.horizontalAlignment) {
700
+ attrs.push("horizontal=\"".concat(record.horizontalAlignment, "\""));
701
+ }
702
+ if (record.verticalAlignment) {
703
+ attrs.push("vertical=\"".concat(record.verticalAlignment, "\""));
704
+ }
705
+ if (record.wrapText) {
706
+ attrs.push("wrapText=\"1\"");
707
+ }
708
+ if (typeof record.indent === "number" &&
709
+ Number.isFinite(record.indent) &&
710
+ record.indent > 0) {
711
+ attrs.push("indent=\"".concat(record.indent, "\""));
712
+ }
713
+ if (typeof record.relativeIndent === "number" &&
714
+ Number.isFinite(record.relativeIndent) &&
715
+ record.relativeIndent !== 0) {
716
+ attrs.push("relativeIndent=\"".concat(record.relativeIndent, "\""));
717
+ }
718
+ if (record.textRotation !== undefined && record.textRotation !== null) {
719
+ // Excel encodes "vertical (stacked)" text as the magic value 255.
720
+ var rotation = record.textRotation === "vertical" ? 255 : record.textRotation;
721
+ if (Number.isFinite(rotation) && rotation !== 0) {
722
+ attrs.push("textRotation=\"".concat(rotation, "\""));
723
+ }
724
+ }
725
+ if (record.shrinkToFit) {
726
+ attrs.push("shrinkToFit=\"1\"");
727
+ }
728
+ if (!attrs.length)
729
+ return "";
730
+ return "<alignment ".concat(attrs.join(" "), "/>");
731
+ };
732
+ var serializeXf = function (record) {
733
+ var _a, _b, _c, _d, _e;
734
+ return [
735
+ record.numFmtId,
736
+ record.fontId,
737
+ record.fillId,
738
+ record.borderId,
739
+ record.wrapText ? 1 : 0,
740
+ (_a = record.horizontalAlignment) !== null && _a !== void 0 ? _a : "",
741
+ (_b = record.verticalAlignment) !== null && _b !== void 0 ? _b : "",
742
+ (_c = record.indent) !== null && _c !== void 0 ? _c : "",
743
+ (_d = record.relativeIndent) !== null && _d !== void 0 ? _d : "",
744
+ (_e = record.textRotation) !== null && _e !== void 0 ? _e : "",
745
+ record.shrinkToFit ? 1 : 0,
746
+ record.protectionLocked === false ? 0 : "",
747
+ record.protectionHidden === true ? 1 : "",
748
+ ].join(":");
749
+ };
750
+ var serializeProtection = function (record) {
751
+ var attrs = [];
752
+ // Only emit when the value deviates from Excel's defaults (locked=true,
753
+ // hidden=false) — otherwise we'd flag every xf as having protection.
754
+ if (record.protectionLocked === false) {
755
+ attrs.push("locked=\"0\"");
756
+ }
757
+ if (record.protectionHidden === true) {
758
+ attrs.push("hidden=\"1\"");
759
+ }
760
+ if (!attrs.length)
761
+ return "";
762
+ return "<protection ".concat(attrs.join(" "), "/>");
763
+ };
764
+ var normalizeHorizontalAlignment = function (value) {
765
+ var allowed = new Set([
766
+ "general",
767
+ "left",
768
+ "center",
769
+ "right",
770
+ "fill",
771
+ "justify",
772
+ "centerContinuous",
773
+ "distributed",
774
+ ]);
775
+ if (!value)
776
+ return undefined;
777
+ return allowed.has(value) ? value : undefined;
778
+ };
779
+ var normalizeVerticalAlignment = function (value) {
780
+ if (!value)
781
+ return undefined;
782
+ if (value === "middle")
783
+ return "center";
784
+ var allowed = new Set([
785
+ "top",
786
+ "center",
787
+ "bottom",
788
+ "justify",
789
+ "distributed",
790
+ ]);
791
+ return allowed.has(value) ? value : undefined;
792
+ };
793
+ var XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
794
+ var WORKSHEET_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
795
+ var normalizeFormat = function (format, cellXfs) {
796
+ var _a;
797
+ if (format && isStyleReference(format)) {
798
+ var styleId = (_a = format.sid) !== null && _a !== void 0 ? _a : format.styleId;
799
+ if (styleId) {
800
+ return cellXfs === null || cellXfs === void 0 ? void 0 : cellXfs.get(styleId);
801
+ }
802
+ return undefined;
803
+ }
804
+ return format !== null && format !== void 0 ? format : undefined;
805
+ };
806
+ var escapeXml = function (value) {
807
+ return value
808
+ .replace(/&/g, "&amp;")
809
+ .replace(/</g, "&lt;")
810
+ .replace(/>/g, "&gt;")
811
+ .replace(/"/g, "&quot;")
812
+ .replace(/'/g, "&apos;");
813
+ };