@cj-tech-master/excelts 9.2.1 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/README.md +25 -2
  2. package/README_zh.md +29 -6
  3. package/dist/browser/index.browser.d.ts +1 -1
  4. package/dist/browser/index.browser.js +4 -0
  5. package/dist/browser/index.d.ts +1 -1
  6. package/dist/browser/index.js +4 -0
  7. package/dist/browser/modules/excel/cell.d.ts +17 -3
  8. package/dist/browser/modules/excel/cell.js +170 -22
  9. package/dist/browser/modules/excel/defined-names.d.ts +96 -1
  10. package/dist/browser/modules/excel/defined-names.js +411 -21
  11. package/dist/browser/modules/excel/image.d.ts +11 -0
  12. package/dist/browser/modules/excel/image.js +24 -1
  13. package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  14. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +14 -0
  15. package/dist/browser/modules/excel/stream/workbook-reader.d.ts +2 -1
  16. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  17. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +48 -1
  18. package/dist/browser/modules/excel/stream/workbook-writer.d.ts +3 -2
  19. package/dist/browser/modules/excel/stream/worksheet-reader.js +17 -1
  20. package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +39 -6
  21. package/dist/browser/modules/excel/stream/worksheet-writer.js +45 -5
  22. package/dist/browser/modules/excel/table.js +15 -2
  23. package/dist/browser/modules/excel/types.d.ts +133 -2
  24. package/dist/browser/modules/excel/utils/col-cache.d.ts +1 -0
  25. package/dist/browser/modules/excel/utils/col-cache.js +15 -0
  26. package/dist/browser/modules/excel/utils/drawing-utils.d.ts +3 -3
  27. package/dist/browser/modules/excel/utils/drawing-utils.js +4 -0
  28. package/dist/browser/modules/excel/utils/external-link-formula.d.ts +76 -0
  29. package/dist/browser/modules/excel/utils/external-link-formula.js +208 -0
  30. package/dist/browser/modules/excel/utils/iterate-stream.d.ts +9 -3
  31. package/dist/browser/modules/excel/utils/iterate-stream.js +3 -1
  32. package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +19 -0
  33. package/dist/browser/modules/excel/utils/ooxml-paths.js +37 -2
  34. package/dist/browser/modules/excel/utils/shared-strings.d.ts +8 -3
  35. package/dist/browser/modules/excel/utils/shared-strings.js +21 -2
  36. package/dist/browser/modules/excel/utils/workbook-protection.d.ts +30 -0
  37. package/dist/browser/modules/excel/utils/workbook-protection.js +30 -0
  38. package/dist/browser/modules/excel/workbook.browser.d.ts +257 -6
  39. package/dist/browser/modules/excel/workbook.browser.js +318 -34
  40. package/dist/browser/modules/excel/workbook.d.ts +1 -1
  41. package/dist/browser/modules/excel/worksheet.d.ts +3 -1
  42. package/dist/browser/modules/excel/worksheet.js +21 -2
  43. package/dist/browser/modules/excel/xlsx/rel-type.d.ts +15 -0
  44. package/dist/browser/modules/excel/xlsx/rel-type.js +16 -1
  45. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  46. package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  47. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  48. package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  49. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  50. package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  51. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  52. package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  53. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  54. package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  55. package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  56. package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  57. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  58. package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  59. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  60. package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  61. package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  62. package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  63. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  64. package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  65. package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  66. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  67. package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  68. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  69. package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  70. package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  71. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +410 -20
  72. package/dist/browser/modules/excel/xlsx/xlsx.d.ts +7 -4
  73. package/dist/browser/modules/excel/xlsx/xlsx.js +4 -5
  74. package/dist/browser/modules/formula/compile/address-utils.d.ts +62 -0
  75. package/dist/browser/modules/formula/compile/address-utils.js +83 -0
  76. package/dist/browser/modules/formula/compile/binder.d.ts +42 -0
  77. package/dist/browser/modules/formula/compile/binder.js +487 -0
  78. package/dist/browser/modules/formula/compile/bound-ast.d.ts +230 -0
  79. package/dist/browser/modules/formula/compile/bound-ast.js +80 -0
  80. package/dist/browser/modules/formula/compile/compiled-formula.d.ts +137 -0
  81. package/dist/browser/modules/formula/compile/compiled-formula.js +383 -0
  82. package/dist/browser/modules/formula/compile/dependency-analysis.d.ts +93 -0
  83. package/dist/browser/modules/formula/compile/dependency-analysis.js +432 -0
  84. package/dist/browser/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  85. package/dist/browser/modules/formula/compile/structured-ref-utils.js +136 -0
  86. package/dist/browser/modules/formula/default-syntax-probe.d.ts +79 -0
  87. package/dist/browser/modules/formula/default-syntax-probe.js +83 -0
  88. package/dist/browser/modules/formula/functions/_date-context.d.ts +4 -0
  89. package/dist/browser/modules/formula/functions/_date-context.js +29 -0
  90. package/dist/browser/modules/formula/functions/_shared.d.ts +121 -0
  91. package/dist/browser/modules/formula/functions/_shared.js +381 -0
  92. package/dist/browser/modules/formula/functions/conditional.d.ts +27 -0
  93. package/dist/browser/modules/formula/functions/conditional.js +343 -0
  94. package/dist/browser/modules/formula/functions/database.d.ts +37 -0
  95. package/dist/browser/modules/formula/functions/database.js +274 -0
  96. package/dist/browser/modules/formula/functions/date.d.ts +61 -0
  97. package/dist/browser/modules/formula/functions/date.js +855 -0
  98. package/dist/browser/modules/formula/functions/dynamic-array.d.ts +23 -0
  99. package/dist/browser/modules/formula/functions/dynamic-array.js +860 -0
  100. package/dist/browser/modules/formula/functions/engineering.d.ts +57 -0
  101. package/dist/browser/modules/formula/functions/engineering.js +1128 -0
  102. package/dist/browser/modules/formula/functions/financial.d.ts +202 -0
  103. package/dist/browser/modules/formula/functions/financial.js +2296 -0
  104. package/dist/browser/modules/formula/functions/lookup.d.ts +18 -0
  105. package/dist/browser/modules/formula/functions/lookup.js +886 -0
  106. package/dist/browser/modules/formula/functions/math.d.ts +114 -0
  107. package/dist/browser/modules/formula/functions/math.js +1406 -0
  108. package/dist/browser/modules/formula/functions/statistical.d.ts +193 -0
  109. package/dist/browser/modules/formula/functions/statistical.js +3390 -0
  110. package/dist/browser/modules/formula/functions/text.d.ts +86 -0
  111. package/dist/browser/modules/formula/functions/text.js +1845 -0
  112. package/dist/browser/modules/formula/host-registry.d.ts +53 -0
  113. package/dist/browser/modules/formula/host-registry.js +69 -0
  114. package/dist/browser/modules/formula/index.d.ts +39 -0
  115. package/dist/browser/modules/formula/index.js +49 -0
  116. package/dist/browser/modules/formula/install.d.ts +62 -0
  117. package/dist/browser/modules/formula/install.js +88 -0
  118. package/dist/browser/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  119. package/dist/browser/modules/formula/integration/apply-writeback-plan.js +210 -0
  120. package/dist/browser/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  121. package/dist/browser/modules/formula/integration/calculate-formulas-impl.js +616 -0
  122. package/dist/browser/modules/formula/integration/calculate-formulas.d.ts +67 -0
  123. package/dist/browser/modules/formula/integration/calculate-formulas.js +68 -0
  124. package/dist/browser/modules/formula/integration/formula-instance.d.ts +64 -0
  125. package/dist/browser/modules/formula/integration/formula-instance.js +79 -0
  126. package/dist/browser/modules/formula/integration/workbook-adapter.d.ts +26 -0
  127. package/dist/browser/modules/formula/integration/workbook-adapter.js +324 -0
  128. package/dist/browser/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  129. package/dist/browser/modules/formula/integration/workbook-snapshot.js +77 -0
  130. package/dist/browser/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  131. package/dist/browser/modules/formula/materialize/build-writeback-plan.js +473 -0
  132. package/dist/browser/modules/formula/materialize/spill-engine.d.ts +9 -0
  133. package/dist/browser/modules/formula/materialize/spill-engine.js +38 -0
  134. package/dist/browser/modules/formula/materialize/types.d.ts +179 -0
  135. package/dist/browser/modules/formula/materialize/types.js +29 -0
  136. package/dist/browser/modules/formula/materialize/writeback-plan.d.ts +167 -0
  137. package/dist/browser/modules/formula/materialize/writeback-plan.js +27 -0
  138. package/dist/browser/modules/formula/runtime/evaluator.d.ts +151 -0
  139. package/dist/browser/modules/formula/runtime/evaluator.js +2291 -0
  140. package/dist/browser/modules/formula/runtime/function-registry.d.ts +47 -0
  141. package/dist/browser/modules/formula/runtime/function-registry.js +840 -0
  142. package/dist/browser/modules/formula/runtime/values.d.ts +211 -0
  143. package/dist/browser/modules/formula/runtime/values.js +385 -0
  144. package/dist/browser/modules/formula/syntax/ast.d.ts +129 -0
  145. package/dist/browser/modules/formula/syntax/ast.js +28 -0
  146. package/dist/browser/modules/formula/syntax/parser.d.ts +18 -0
  147. package/dist/browser/modules/formula/syntax/parser.js +439 -0
  148. package/dist/browser/modules/formula/syntax/token-types.d.ts +153 -0
  149. package/dist/browser/modules/formula/syntax/token-types.js +59 -0
  150. package/dist/browser/modules/formula/syntax/tokenizer.d.ts +10 -0
  151. package/dist/browser/modules/formula/syntax/tokenizer.js +1074 -0
  152. package/dist/browser/modules/pdf/excel-bridge.js +9 -0
  153. package/dist/cjs/index.js +4 -0
  154. package/dist/cjs/modules/excel/cell.js +170 -22
  155. package/dist/cjs/modules/excel/defined-names.js +411 -21
  156. package/dist/cjs/modules/excel/image.js +24 -1
  157. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +14 -0
  158. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +48 -1
  159. package/dist/cjs/modules/excel/stream/worksheet-reader.js +17 -1
  160. package/dist/cjs/modules/excel/stream/worksheet-writer.js +45 -5
  161. package/dist/cjs/modules/excel/table.js +15 -2
  162. package/dist/cjs/modules/excel/utils/col-cache.js +15 -0
  163. package/dist/cjs/modules/excel/utils/drawing-utils.js +4 -0
  164. package/dist/cjs/modules/excel/utils/external-link-formula.js +212 -0
  165. package/dist/cjs/modules/excel/utils/iterate-stream.js +3 -1
  166. package/dist/cjs/modules/excel/utils/ooxml-paths.js +42 -2
  167. package/dist/cjs/modules/excel/utils/shared-strings.js +21 -2
  168. package/dist/cjs/modules/excel/utils/workbook-protection.js +33 -0
  169. package/dist/cjs/modules/excel/workbook.browser.js +318 -34
  170. package/dist/cjs/modules/excel/worksheet.js +20 -1
  171. package/dist/cjs/modules/excel/xlsx/rel-type.js +16 -1
  172. package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  173. package/dist/cjs/modules/excel/xlsx/xform/book/external-link-xform.js +333 -0
  174. package/dist/cjs/modules/excel/xlsx/xform/book/external-reference-xform.js +27 -0
  175. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  176. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-protection-xform.js +69 -0
  177. package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  178. package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +18 -0
  179. package/dist/cjs/modules/excel/xlsx/xform/core/metadata-xform.js +161 -0
  180. package/dist/cjs/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +108 -0
  181. package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  182. package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  183. package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  184. package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  185. package/dist/cjs/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +83 -0
  186. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  187. package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  188. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +408 -18
  189. package/dist/cjs/modules/excel/xlsx/xlsx.js +4 -5
  190. package/dist/cjs/modules/formula/compile/address-utils.js +89 -0
  191. package/dist/cjs/modules/formula/compile/binder.js +489 -0
  192. package/dist/cjs/modules/formula/compile/bound-ast.js +68 -0
  193. package/dist/cjs/modules/formula/compile/compiled-formula.js +387 -0
  194. package/dist/cjs/modules/formula/compile/dependency-analysis.js +437 -0
  195. package/dist/cjs/modules/formula/compile/structured-ref-utils.js +141 -0
  196. package/dist/cjs/modules/formula/default-syntax-probe.js +87 -0
  197. package/dist/cjs/modules/formula/functions/_date-context.js +33 -0
  198. package/dist/cjs/modules/formula/functions/_shared.js +396 -0
  199. package/dist/cjs/modules/formula/functions/conditional.js +354 -0
  200. package/dist/cjs/modules/formula/functions/database.js +288 -0
  201. package/dist/cjs/modules/formula/functions/date.js +883 -0
  202. package/dist/cjs/modules/formula/functions/dynamic-array.js +881 -0
  203. package/dist/cjs/modules/formula/functions/engineering.js +1183 -0
  204. package/dist/cjs/modules/formula/functions/financial.js +2348 -0
  205. package/dist/cjs/modules/formula/functions/lookup.js +902 -0
  206. package/dist/cjs/modules/formula/functions/math.js +1487 -0
  207. package/dist/cjs/modules/formula/functions/statistical.js +3488 -0
  208. package/dist/cjs/modules/formula/functions/text.js +1889 -0
  209. package/dist/cjs/modules/formula/host-registry.js +75 -0
  210. package/dist/cjs/modules/formula/index.js +58 -0
  211. package/dist/cjs/modules/formula/install.js +93 -0
  212. package/dist/cjs/modules/formula/integration/apply-writeback-plan.js +213 -0
  213. package/dist/cjs/modules/formula/integration/calculate-formulas-impl.js +619 -0
  214. package/dist/cjs/modules/formula/integration/calculate-formulas.js +71 -0
  215. package/dist/cjs/modules/formula/integration/formula-instance.js +82 -0
  216. package/dist/cjs/modules/formula/integration/workbook-adapter.js +327 -0
  217. package/dist/cjs/modules/formula/integration/workbook-snapshot.js +84 -0
  218. package/dist/cjs/modules/formula/materialize/build-writeback-plan.js +475 -0
  219. package/dist/cjs/modules/formula/materialize/spill-engine.js +42 -0
  220. package/dist/cjs/modules/formula/materialize/types.js +32 -0
  221. package/dist/cjs/modules/formula/materialize/writeback-plan.js +28 -0
  222. package/dist/cjs/modules/formula/runtime/evaluator.js +2298 -0
  223. package/dist/cjs/modules/formula/runtime/function-registry.js +846 -0
  224. package/dist/cjs/modules/formula/runtime/values.js +385 -0
  225. package/dist/cjs/modules/formula/syntax/ast.js +8 -0
  226. package/dist/cjs/modules/formula/syntax/parser.js +440 -0
  227. package/dist/cjs/modules/formula/syntax/token-types.js +32 -0
  228. package/dist/cjs/modules/formula/syntax/tokenizer.js +1076 -0
  229. package/dist/cjs/modules/pdf/excel-bridge.js +9 -0
  230. package/dist/esm/index.browser.js +4 -0
  231. package/dist/esm/index.js +4 -0
  232. package/dist/esm/modules/excel/cell.js +170 -22
  233. package/dist/esm/modules/excel/defined-names.js +411 -21
  234. package/dist/esm/modules/excel/image.js +24 -1
  235. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +14 -0
  236. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +48 -1
  237. package/dist/esm/modules/excel/stream/worksheet-reader.js +17 -1
  238. package/dist/esm/modules/excel/stream/worksheet-writer.js +45 -5
  239. package/dist/esm/modules/excel/table.js +15 -2
  240. package/dist/esm/modules/excel/utils/col-cache.js +15 -0
  241. package/dist/esm/modules/excel/utils/drawing-utils.js +4 -0
  242. package/dist/esm/modules/excel/utils/external-link-formula.js +208 -0
  243. package/dist/esm/modules/excel/utils/iterate-stream.js +3 -1
  244. package/dist/esm/modules/excel/utils/ooxml-paths.js +37 -2
  245. package/dist/esm/modules/excel/utils/shared-strings.js +21 -2
  246. package/dist/esm/modules/excel/utils/workbook-protection.js +30 -0
  247. package/dist/esm/modules/excel/workbook.browser.js +318 -34
  248. package/dist/esm/modules/excel/worksheet.js +21 -2
  249. package/dist/esm/modules/excel/xlsx/rel-type.js +16 -1
  250. package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
  251. package/dist/esm/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
  252. package/dist/esm/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
  253. package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
  254. package/dist/esm/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
  255. package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
  256. package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
  257. package/dist/esm/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
  258. package/dist/esm/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
  259. package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
  260. package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
  261. package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
  262. package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
  263. package/dist/esm/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
  264. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
  265. package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +4 -1
  266. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +410 -20
  267. package/dist/esm/modules/excel/xlsx/xlsx.js +4 -5
  268. package/dist/esm/modules/formula/compile/address-utils.js +83 -0
  269. package/dist/esm/modules/formula/compile/binder.js +487 -0
  270. package/dist/esm/modules/formula/compile/bound-ast.js +80 -0
  271. package/dist/esm/modules/formula/compile/compiled-formula.js +383 -0
  272. package/dist/esm/modules/formula/compile/dependency-analysis.js +432 -0
  273. package/dist/esm/modules/formula/compile/structured-ref-utils.js +136 -0
  274. package/dist/esm/modules/formula/default-syntax-probe.js +83 -0
  275. package/dist/esm/modules/formula/functions/_date-context.js +29 -0
  276. package/dist/esm/modules/formula/functions/_shared.js +381 -0
  277. package/dist/esm/modules/formula/functions/conditional.js +343 -0
  278. package/dist/esm/modules/formula/functions/database.js +274 -0
  279. package/dist/esm/modules/formula/functions/date.js +855 -0
  280. package/dist/esm/modules/formula/functions/dynamic-array.js +860 -0
  281. package/dist/esm/modules/formula/functions/engineering.js +1128 -0
  282. package/dist/esm/modules/formula/functions/financial.js +2296 -0
  283. package/dist/esm/modules/formula/functions/lookup.js +886 -0
  284. package/dist/esm/modules/formula/functions/math.js +1406 -0
  285. package/dist/esm/modules/formula/functions/statistical.js +3390 -0
  286. package/dist/esm/modules/formula/functions/text.js +1845 -0
  287. package/dist/esm/modules/formula/host-registry.js +69 -0
  288. package/dist/esm/modules/formula/index.js +49 -0
  289. package/dist/esm/modules/formula/install.js +88 -0
  290. package/dist/esm/modules/formula/integration/apply-writeback-plan.js +210 -0
  291. package/dist/esm/modules/formula/integration/calculate-formulas-impl.js +616 -0
  292. package/dist/esm/modules/formula/integration/calculate-formulas.js +68 -0
  293. package/dist/esm/modules/formula/integration/formula-instance.js +79 -0
  294. package/dist/esm/modules/formula/integration/workbook-adapter.js +324 -0
  295. package/dist/esm/modules/formula/integration/workbook-snapshot.js +77 -0
  296. package/dist/esm/modules/formula/materialize/build-writeback-plan.js +473 -0
  297. package/dist/esm/modules/formula/materialize/spill-engine.js +38 -0
  298. package/dist/esm/modules/formula/materialize/types.js +29 -0
  299. package/dist/esm/modules/formula/materialize/writeback-plan.js +27 -0
  300. package/dist/esm/modules/formula/runtime/evaluator.js +2291 -0
  301. package/dist/esm/modules/formula/runtime/function-registry.js +840 -0
  302. package/dist/esm/modules/formula/runtime/values.js +385 -0
  303. package/dist/esm/modules/formula/syntax/ast.js +28 -0
  304. package/dist/esm/modules/formula/syntax/parser.js +439 -0
  305. package/dist/esm/modules/formula/syntax/token-types.js +59 -0
  306. package/dist/esm/modules/formula/syntax/tokenizer.js +1074 -0
  307. package/dist/esm/modules/pdf/excel-bridge.js +9 -0
  308. package/dist/iife/excelts.iife.js +2302 -373
  309. package/dist/iife/excelts.iife.js.map +1 -1
  310. package/dist/iife/excelts.iife.min.js +34 -34
  311. package/dist/types/index.browser.d.ts +1 -1
  312. package/dist/types/index.d.ts +1 -1
  313. package/dist/types/modules/excel/cell.d.ts +17 -3
  314. package/dist/types/modules/excel/defined-names.d.ts +96 -1
  315. package/dist/types/modules/excel/image.d.ts +11 -0
  316. package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
  317. package/dist/types/modules/excel/stream/workbook-reader.d.ts +2 -1
  318. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
  319. package/dist/types/modules/excel/stream/workbook-writer.d.ts +3 -2
  320. package/dist/types/modules/excel/stream/worksheet-writer.d.ts +39 -6
  321. package/dist/types/modules/excel/types.d.ts +133 -2
  322. package/dist/types/modules/excel/utils/col-cache.d.ts +1 -0
  323. package/dist/types/modules/excel/utils/drawing-utils.d.ts +3 -3
  324. package/dist/types/modules/excel/utils/external-link-formula.d.ts +76 -0
  325. package/dist/types/modules/excel/utils/iterate-stream.d.ts +9 -3
  326. package/dist/types/modules/excel/utils/ooxml-paths.d.ts +19 -0
  327. package/dist/types/modules/excel/utils/shared-strings.d.ts +8 -3
  328. package/dist/types/modules/excel/utils/workbook-protection.d.ts +30 -0
  329. package/dist/types/modules/excel/workbook.browser.d.ts +257 -6
  330. package/dist/types/modules/excel/workbook.d.ts +1 -1
  331. package/dist/types/modules/excel/worksheet.d.ts +3 -1
  332. package/dist/types/modules/excel/xlsx/rel-type.d.ts +15 -0
  333. package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
  334. package/dist/types/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
  335. package/dist/types/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
  336. package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
  337. package/dist/types/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
  338. package/dist/types/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
  339. package/dist/types/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
  340. package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  341. package/dist/types/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
  342. package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
  343. package/dist/types/modules/excel/xlsx/xlsx.d.ts +7 -4
  344. package/dist/types/modules/formula/compile/address-utils.d.ts +62 -0
  345. package/dist/types/modules/formula/compile/binder.d.ts +42 -0
  346. package/dist/types/modules/formula/compile/bound-ast.d.ts +230 -0
  347. package/dist/types/modules/formula/compile/compiled-formula.d.ts +137 -0
  348. package/dist/types/modules/formula/compile/dependency-analysis.d.ts +93 -0
  349. package/dist/types/modules/formula/compile/structured-ref-utils.d.ts +93 -0
  350. package/dist/types/modules/formula/default-syntax-probe.d.ts +79 -0
  351. package/dist/types/modules/formula/functions/_date-context.d.ts +4 -0
  352. package/dist/types/modules/formula/functions/_shared.d.ts +121 -0
  353. package/dist/types/modules/formula/functions/conditional.d.ts +27 -0
  354. package/dist/types/modules/formula/functions/database.d.ts +37 -0
  355. package/dist/types/modules/formula/functions/date.d.ts +61 -0
  356. package/dist/types/modules/formula/functions/dynamic-array.d.ts +23 -0
  357. package/dist/types/modules/formula/functions/engineering.d.ts +57 -0
  358. package/dist/types/modules/formula/functions/financial.d.ts +202 -0
  359. package/dist/types/modules/formula/functions/lookup.d.ts +18 -0
  360. package/dist/types/modules/formula/functions/math.d.ts +114 -0
  361. package/dist/types/modules/formula/functions/statistical.d.ts +193 -0
  362. package/dist/types/modules/formula/functions/text.d.ts +86 -0
  363. package/dist/types/modules/formula/host-registry.d.ts +53 -0
  364. package/dist/types/modules/formula/index.d.ts +39 -0
  365. package/dist/types/modules/formula/install.d.ts +62 -0
  366. package/dist/types/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
  367. package/dist/types/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
  368. package/dist/types/modules/formula/integration/calculate-formulas.d.ts +67 -0
  369. package/dist/types/modules/formula/integration/formula-instance.d.ts +64 -0
  370. package/dist/types/modules/formula/integration/workbook-adapter.d.ts +26 -0
  371. package/dist/types/modules/formula/integration/workbook-snapshot.d.ts +267 -0
  372. package/dist/types/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
  373. package/dist/types/modules/formula/materialize/spill-engine.d.ts +9 -0
  374. package/dist/types/modules/formula/materialize/types.d.ts +179 -0
  375. package/dist/types/modules/formula/materialize/writeback-plan.d.ts +167 -0
  376. package/dist/types/modules/formula/runtime/evaluator.d.ts +151 -0
  377. package/dist/types/modules/formula/runtime/function-registry.d.ts +47 -0
  378. package/dist/types/modules/formula/runtime/values.d.ts +211 -0
  379. package/dist/types/modules/formula/syntax/ast.d.ts +129 -0
  380. package/dist/types/modules/formula/syntax/parser.d.ts +18 -0
  381. package/dist/types/modules/formula/syntax/token-types.d.ts +153 -0
  382. package/dist/types/modules/formula/syntax/tokenizer.d.ts +10 -0
  383. package/package.json +28 -28
@@ -0,0 +1,883 @@
1
+ "use strict";
2
+ /**
3
+ * Date / Time Functions — Native RuntimeValue implementation.
4
+ *
5
+ * All Date objects returned by `excelToDate()` represent an Excel serial on
6
+ * the UTC timeline (midnight UTC for the corresponding date). Consequently
7
+ * every field accessor must be the UTC variant (`getUTCFullYear`,
8
+ * `getUTCMonth`, …) and every `Date` constructed from y/m/d components must
9
+ * be built with `Date.UTC(...)`. Using local-time accessors would make
10
+ * results depend on the host timezone — e.g. `YEAR(DATE(2024,1,1))` would
11
+ * return 2023 when evaluated on a machine west of UTC at midnight UTC.
12
+ *
13
+ * Exceptions (intentionally use local time):
14
+ * - `TODAY` / `NOW` — read the user's wall clock, which is genuinely in the
15
+ * local timezone. The Excel serial is then constructed using
16
+ * `Date.UTC(year, month, day)` so that the resulting serial round-trips
17
+ * correctly through `excelToDate()`.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.fnWORKDAY_INTL = exports.fnNETWORKDAYS_INTL = exports.fnDAYS360 = exports.fnTIMEVALUE = exports.fnDATEVALUE = exports.fnYEARFRAC = exports.fnWORKDAY = exports.fnNETWORKDAYS = exports.fnWEEKNUM = exports.fnISOWEEKNUM = exports.fnDAYS = exports.fnDATEDIF = exports.fnEDATE = exports.fnEOMONTH = exports.fnWEEKDAY = exports.fnSECOND = exports.fnMINUTE = exports.fnHOUR = exports.fnTIME = exports.fnDATE = exports.fnDAY = exports.fnMONTH = exports.fnYEAR = exports.fnNOW = exports.fnTODAY = void 0;
21
+ const utils_base_1 = require("../../../utils/utils.base.js");
22
+ const values_1 = require("../runtime/values");
23
+ const _date_context_1 = require("./_date-context");
24
+ const _shared_1 = require("./_shared");
25
+ // ============================================================================
26
+ // Helpers
27
+ // ============================================================================
28
+ /** Convert an Excel serial to a UTC `Date`, honouring the active date1904 mode. */
29
+ function toDate(serial) {
30
+ return (0, utils_base_1.excelToDate)(serial, (0, _date_context_1.isDate1904)());
31
+ }
32
+ /** Convert a UTC `Date` back to an Excel serial, honouring the active date1904 mode. */
33
+ function fromDate(d) {
34
+ return (0, utils_base_1.dateToExcel)(d, (0, _date_context_1.isDate1904)());
35
+ }
36
+ /** Collect holiday serial numbers from a RuntimeValue argument (array or scalar). */
37
+ function collectHolidays(arg) {
38
+ const set = new Set();
39
+ if ((0, values_1.isArray)(arg)) {
40
+ for (const row of arg.rows) {
41
+ for (const cell of row) {
42
+ if (cell.kind === 1 /* RVKind.Number */) {
43
+ set.add(Math.floor(cell.value));
44
+ }
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ const n = (0, values_1.toNumberRV)(arg);
50
+ if (n.kind === 1 /* RVKind.Number */) {
51
+ set.add(Math.floor(n.value));
52
+ }
53
+ }
54
+ return set;
55
+ }
56
+ // ============================================================================
57
+ // Date Functions
58
+ // ============================================================================
59
+ /**
60
+ * TODAY — today's date (at the user's local timezone).
61
+ *
62
+ * The user's concept of "today" is based on their wall clock, so we read
63
+ * local-time fields from `new Date()`. The resulting y/m/d components are
64
+ * then packed into a UTC serial so downstream date arithmetic is consistent.
65
+ */
66
+ const fnTODAY = () => {
67
+ const now = new Date();
68
+ return (0, values_1.rvNumber)(fromDate(new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))));
69
+ };
70
+ exports.fnTODAY = fnTODAY;
71
+ /**
72
+ * NOW — current date and time.
73
+ *
74
+ * Excel stores the result as an untimezoned serial, but the user expects
75
+ * their local wall-clock reading. `dateToExcel(new Date())` effectively
76
+ * takes `Date.now()` in UTC-ms; any conversion to the user's timezone
77
+ * would require tz metadata we do not have. We therefore keep the current
78
+ * UTC-ms based conversion, matching historical behaviour.
79
+ */
80
+ const fnNOW = () => {
81
+ const now = new Date();
82
+ return (0, values_1.rvNumber)(fromDate(now));
83
+ };
84
+ exports.fnNOW = fnNOW;
85
+ const fnYEAR = args => {
86
+ const n = (0, _shared_1.argToNumber)(args[0]);
87
+ if ((0, values_1.isError)(n)) {
88
+ return n;
89
+ }
90
+ return (0, values_1.rvNumber)(toDate(n.value).getUTCFullYear());
91
+ };
92
+ exports.fnYEAR = fnYEAR;
93
+ const fnMONTH = args => {
94
+ const n = (0, _shared_1.argToNumber)(args[0]);
95
+ if ((0, values_1.isError)(n)) {
96
+ return n;
97
+ }
98
+ return (0, values_1.rvNumber)(toDate(n.value).getUTCMonth() + 1);
99
+ };
100
+ exports.fnMONTH = fnMONTH;
101
+ const fnDAY = args => {
102
+ const n = (0, _shared_1.argToNumber)(args[0]);
103
+ if ((0, values_1.isError)(n)) {
104
+ return n;
105
+ }
106
+ return (0, values_1.rvNumber)(toDate(n.value).getUTCDate());
107
+ };
108
+ exports.fnDAY = fnDAY;
109
+ const fnDATE = args => {
110
+ const year = (0, _shared_1.argToNumber)(args[0]);
111
+ if ((0, values_1.isError)(year)) {
112
+ return year;
113
+ }
114
+ const month = (0, _shared_1.argToNumber)(args[1]);
115
+ if ((0, values_1.isError)(month)) {
116
+ return month;
117
+ }
118
+ const day = (0, _shared_1.argToNumber)(args[2]);
119
+ if ((0, values_1.isError)(day)) {
120
+ return day;
121
+ }
122
+ // Excel's DATE interprets a year in [0, 1899] as (year + 1900). JavaScript's
123
+ // Date constructor already applies this convention for [0, 99], but it does
124
+ // NOT apply it for [100, 1899] — we have to do it ourselves. Years below 0
125
+ // or above 9999 are rejected as #NUM! (Excel's documented range).
126
+ let y = Math.trunc(year.value);
127
+ if (y < 0 || y > 9999) {
128
+ return values_1.ERRORS.NUM;
129
+ }
130
+ if (y < 1900) {
131
+ y += 1900;
132
+ // Excel rejects years outside [1900, 9999] after this coercion.
133
+ if (y > 9999) {
134
+ return values_1.ERRORS.NUM;
135
+ }
136
+ }
137
+ // Lotus 1-2-3 bug: DATE(1900,2,29) should return serial 60 even though
138
+ // 1900 is not a leap year. JavaScript's Date constructor rolls Feb 29, 1900
139
+ // forward to March 1, 1900, so we handle this specially. Run this check
140
+ // *after* the `y < 1900 → y + 1900` coercion so that `DATE(0, 2, 29)` and
141
+ // `DATE(1900, 2, 29)` resolve to the same serial (R6-P1-1).
142
+ if (y === 1900 && month.value === 2 && day.value === 29) {
143
+ return (0, values_1.rvNumber)(60); // The fictitious Feb 29, 1900
144
+ }
145
+ const d = new Date(Date.UTC(y, month.value - 1, day.value));
146
+ // The `Date.UTC` constructor maps two-digit years through its own legacy
147
+ // rule (+1900), so for `y` in [0, 99] we end up with the same value we
148
+ // already coerced above. Force the full year to be safe — but preserve
149
+ // month/day carry-over from out-of-range values (Excel allows DATE(2024,
150
+ // 13, 1) → 2025-01-01).
151
+ if (y < 100) {
152
+ d.setUTCFullYear(y);
153
+ }
154
+ return (0, values_1.rvNumber)(fromDate(d));
155
+ };
156
+ exports.fnDATE = fnDATE;
157
+ const fnTIME = args => {
158
+ const hour = (0, _shared_1.argToNumber)(args[0]);
159
+ if ((0, values_1.isError)(hour)) {
160
+ return hour;
161
+ }
162
+ const minute = (0, _shared_1.argToNumber)(args[1]);
163
+ if ((0, values_1.isError)(minute)) {
164
+ return minute;
165
+ }
166
+ const second = (0, _shared_1.argToNumber)(args[2]);
167
+ if ((0, values_1.isError)(second)) {
168
+ return second;
169
+ }
170
+ // Excel's TIME rejects negative arguments outright and wraps anything >= 24
171
+ // hours back into the [0, 1) fraction-of-day range. Without the modulo,
172
+ // `TIME(25, 0, 0)` would produce a value > 1, which breaks downstream
173
+ // date-time arithmetic that expects a pure time fraction.
174
+ if (hour.value < 0 || minute.value < 0 || second.value < 0) {
175
+ return values_1.ERRORS.NUM;
176
+ }
177
+ const total = (hour.value * 3600 + minute.value * 60 + second.value) / 86400;
178
+ // total could still be >= 1 if e.g. hour=25; wrap into [0, 1).
179
+ return (0, values_1.rvNumber)(total - Math.floor(total));
180
+ };
181
+ exports.fnTIME = fnTIME;
182
+ const fnHOUR = args => {
183
+ const n = (0, _shared_1.argToNumber)(args[0]);
184
+ if ((0, values_1.isError)(n)) {
185
+ return n;
186
+ }
187
+ if (n.value < 0) {
188
+ return values_1.ERRORS.NUM;
189
+ }
190
+ const totalSeconds = Math.round((n.value % 1) * 86400);
191
+ return (0, values_1.rvNumber)(Math.floor(totalSeconds / 3600) % 24);
192
+ };
193
+ exports.fnHOUR = fnHOUR;
194
+ const fnMINUTE = args => {
195
+ const n = (0, _shared_1.argToNumber)(args[0]);
196
+ if ((0, values_1.isError)(n)) {
197
+ return n;
198
+ }
199
+ if (n.value < 0) {
200
+ return values_1.ERRORS.NUM;
201
+ }
202
+ const totalSeconds = Math.round((n.value % 1) * 86400);
203
+ return (0, values_1.rvNumber)(Math.floor(totalSeconds / 60) % 60);
204
+ };
205
+ exports.fnMINUTE = fnMINUTE;
206
+ const fnSECOND = args => {
207
+ const n = (0, _shared_1.argToNumber)(args[0]);
208
+ if ((0, values_1.isError)(n)) {
209
+ return n;
210
+ }
211
+ if (n.value < 0) {
212
+ return values_1.ERRORS.NUM;
213
+ }
214
+ const totalSeconds = Math.round((n.value % 1) * 86400);
215
+ return (0, values_1.rvNumber)(totalSeconds % 60);
216
+ };
217
+ exports.fnSECOND = fnSECOND;
218
+ const fnWEEKDAY = args => {
219
+ const n = (0, _shared_1.argToNumber)(args[0]);
220
+ if ((0, values_1.isError)(n)) {
221
+ return n;
222
+ }
223
+ const d = toDate(n.value);
224
+ const returnType = args.length > 1 ? (0, _shared_1.argToNumber)(args[1]) : (0, values_1.rvNumber)(1);
225
+ if ((0, values_1.isError)(returnType)) {
226
+ return returnType;
227
+ }
228
+ const day = d.getUTCDay(); // 0=Sun, 6=Sat
229
+ switch (returnType.value) {
230
+ case 1:
231
+ return (0, values_1.rvNumber)(day + 1); // 1=Sun, 7=Sat
232
+ case 2:
233
+ return (0, values_1.rvNumber)(day === 0 ? 7 : day); // 1=Mon, 7=Sun
234
+ case 3:
235
+ return (0, values_1.rvNumber)(day === 0 ? 6 : day - 1); // 0=Mon, 6=Sun
236
+ case 11: // Mon=1..Sun=7
237
+ case 12: // Tue=1..Mon=7
238
+ case 13: // Wed=1..Tue=7
239
+ case 14: // Thu=1..Wed=7
240
+ case 15: // Fri=1..Thu=7
241
+ case 16: // Sat=1..Fri=7
242
+ case 17: // Sun=1..Sat=7
243
+ return (0, values_1.rvNumber)(((((day - (returnType.value - 10)) % 7) + 7) % 7) + 1);
244
+ default:
245
+ return values_1.ERRORS.NUM;
246
+ }
247
+ };
248
+ exports.fnWEEKDAY = fnWEEKDAY;
249
+ const fnEOMONTH = args => {
250
+ const startDate = (0, _shared_1.argToNumber)(args[0]);
251
+ if ((0, values_1.isError)(startDate)) {
252
+ return startDate;
253
+ }
254
+ const months = (0, _shared_1.argToNumber)(args[1]);
255
+ if ((0, values_1.isError)(months)) {
256
+ return months;
257
+ }
258
+ const d = toDate(startDate.value);
259
+ const result = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + months.value + 1, 0));
260
+ return (0, values_1.rvNumber)(fromDate(result));
261
+ };
262
+ exports.fnEOMONTH = fnEOMONTH;
263
+ const fnEDATE = args => {
264
+ const startDate = (0, _shared_1.argToNumber)(args[0]);
265
+ if ((0, values_1.isError)(startDate)) {
266
+ return startDate;
267
+ }
268
+ const months = (0, _shared_1.argToNumber)(args[1]);
269
+ if ((0, values_1.isError)(months)) {
270
+ return months;
271
+ }
272
+ const d = toDate(startDate.value);
273
+ const result = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + months.value, d.getUTCDate()));
274
+ return (0, values_1.rvNumber)(fromDate(result));
275
+ };
276
+ exports.fnEDATE = fnEDATE;
277
+ const fnDATEDIF = args => {
278
+ const startN = (0, _shared_1.argToNumber)(args[0]);
279
+ if ((0, values_1.isError)(startN)) {
280
+ return startN;
281
+ }
282
+ const endN = (0, _shared_1.argToNumber)(args[1]);
283
+ if ((0, values_1.isError)(endN)) {
284
+ return endN;
285
+ }
286
+ // DATEDIF requires end >= start; otherwise #NUM! per Excel.
287
+ if (endN.value < startN.value) {
288
+ return values_1.ERRORS.NUM;
289
+ }
290
+ const unit = (0, values_1.toStringRV)(args[2]).toUpperCase();
291
+ const startD = toDate(startN.value);
292
+ const endD = toDate(endN.value);
293
+ const sy = startD.getUTCFullYear();
294
+ const sm = startD.getUTCMonth();
295
+ const sd = startD.getUTCDate();
296
+ const ey = endD.getUTCFullYear();
297
+ const em = endD.getUTCMonth();
298
+ const ed = endD.getUTCDate();
299
+ switch (unit) {
300
+ case "Y":
301
+ return (0, values_1.rvNumber)(ey - sy - (em < sm || (em === sm && ed < sd) ? 1 : 0));
302
+ case "M":
303
+ return (0, values_1.rvNumber)((ey - sy) * 12 + em - sm - (ed < sd ? 1 : 0));
304
+ case "D":
305
+ return (0, values_1.rvNumber)(Math.floor((endD.getTime() - startD.getTime()) / 86400000));
306
+ case "MD": {
307
+ // Days between the dates, ignoring months and years.
308
+ // If end.day >= start.day → ed - sd; otherwise borrow days from the
309
+ // previous month of endD (last-day-of-prev-month - start.day + end.day).
310
+ if (ed >= sd) {
311
+ return (0, values_1.rvNumber)(ed - sd);
312
+ }
313
+ // days in the month before endD's month
314
+ const daysInPrevMonth = new Date(Date.UTC(ey, em, 0)).getUTCDate();
315
+ return (0, values_1.rvNumber)(daysInPrevMonth - sd + ed);
316
+ }
317
+ case "YM": {
318
+ // Months between the dates, ignoring days and years.
319
+ let months = em - sm;
320
+ if (ed < sd) {
321
+ months -= 1;
322
+ }
323
+ if (months < 0) {
324
+ months += 12;
325
+ }
326
+ return (0, values_1.rvNumber)(months);
327
+ }
328
+ case "YD": {
329
+ // Days between the dates as though they were in the same year, ignoring years.
330
+ // Align endD to startD's year (or next year if end < start in same-year terms).
331
+ const sameYearEnd = Date.UTC(sy, em, ed);
332
+ const startUTC = Date.UTC(sy, sm, sd);
333
+ let diff = sameYearEnd - startUTC;
334
+ if (diff < 0) {
335
+ // end falls earlier in the year than start → roll forward one year
336
+ const nextYearEnd = Date.UTC(sy + 1, em, ed);
337
+ diff = nextYearEnd - startUTC;
338
+ }
339
+ return (0, values_1.rvNumber)(Math.floor(diff / 86400000));
340
+ }
341
+ default:
342
+ return values_1.ERRORS.NUM;
343
+ }
344
+ };
345
+ exports.fnDATEDIF = fnDATEDIF;
346
+ const fnDAYS = args => {
347
+ const end = (0, _shared_1.argToNumber)(args[0]);
348
+ if ((0, values_1.isError)(end)) {
349
+ return end;
350
+ }
351
+ const start = (0, _shared_1.argToNumber)(args[1]);
352
+ if ((0, values_1.isError)(start)) {
353
+ return start;
354
+ }
355
+ return (0, values_1.rvNumber)(Math.floor(end.value) - Math.floor(start.value));
356
+ };
357
+ exports.fnDAYS = fnDAYS;
358
+ const fnISOWEEKNUM = args => {
359
+ const n = (0, _shared_1.argToNumber)(args[0]);
360
+ if ((0, values_1.isError)(n)) {
361
+ return n;
362
+ }
363
+ const d = toDate(n.value);
364
+ const temp = new Date(d.getTime());
365
+ temp.setUTCDate(temp.getUTCDate() + 3 - ((temp.getUTCDay() + 6) % 7));
366
+ const week1 = new Date(Date.UTC(temp.getUTCFullYear(), 0, 4));
367
+ return (0, values_1.rvNumber)(1 +
368
+ Math.round(((temp.getTime() - week1.getTime()) / 86400000 - 3 + ((week1.getUTCDay() + 6) % 7)) / 7));
369
+ };
370
+ exports.fnISOWEEKNUM = fnISOWEEKNUM;
371
+ const fnWEEKNUM = args => {
372
+ const n = (0, _shared_1.argToNumber)(args[0]);
373
+ if ((0, values_1.isError)(n)) {
374
+ return n;
375
+ }
376
+ const d = toDate(n.value);
377
+ const returnType = args.length > 1 ? (0, _shared_1.argToNumber)(args[1]) : (0, values_1.rvNumber)(1);
378
+ if ((0, values_1.isError)(returnType)) {
379
+ return returnType;
380
+ }
381
+ const rt = returnType.value;
382
+ // Type 21 is ISO 8601 week.
383
+ if (rt === 21) {
384
+ return (0, exports.fnISOWEEKNUM)(args);
385
+ }
386
+ // Excel maps `return_type` to the day-of-week that starts the week:
387
+ // 1 (default) → Sunday
388
+ // 2 or 11 → Monday
389
+ // 12 → Tuesday, 13 → Wednesday, … 17 → Saturday
390
+ // (16 → Friday, 17 → Saturday)
391
+ // Any other value is #NUM!.
392
+ let startDay; // 0 = Sunday … 6 = Saturday
393
+ switch (rt) {
394
+ case 1:
395
+ startDay = 0;
396
+ break;
397
+ case 2:
398
+ case 11:
399
+ startDay = 1;
400
+ break;
401
+ case 12:
402
+ startDay = 2;
403
+ break;
404
+ case 13:
405
+ startDay = 3;
406
+ break;
407
+ case 14:
408
+ startDay = 4;
409
+ break;
410
+ case 15:
411
+ startDay = 5;
412
+ break;
413
+ case 16:
414
+ startDay = 6;
415
+ break;
416
+ case 17:
417
+ startDay = 0;
418
+ break;
419
+ default:
420
+ return values_1.ERRORS.NUM;
421
+ }
422
+ const jan1 = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
423
+ const jan1Day = jan1.getUTCDay();
424
+ const dayOfYear = Math.floor((d.getTime() - jan1.getTime()) / 86400000);
425
+ return (0, values_1.rvNumber)(Math.floor((dayOfYear + ((jan1Day - startDay + 7) % 7)) / 7) + 1);
426
+ };
427
+ exports.fnWEEKNUM = fnWEEKNUM;
428
+ function networkdaysHelper(startN, endN, holidays) {
429
+ const s = Math.floor(Math.min(startN, endN));
430
+ const e = Math.floor(Math.max(startN, endN));
431
+ const sign = startN <= endN ? 1 : -1;
432
+ let count = 0;
433
+ for (let d = s; d <= e; d++) {
434
+ const dt = toDate(d);
435
+ const dow = dt.getUTCDay();
436
+ if (dow !== 0 && dow !== 6 && !holidays.has(d)) {
437
+ count++;
438
+ }
439
+ }
440
+ return count * sign;
441
+ }
442
+ const fnNETWORKDAYS = args => {
443
+ const startN = (0, _shared_1.argToNumber)(args[0]);
444
+ if ((0, values_1.isError)(startN)) {
445
+ return startN;
446
+ }
447
+ const endN = (0, _shared_1.argToNumber)(args[1]);
448
+ if ((0, values_1.isError)(endN)) {
449
+ return endN;
450
+ }
451
+ const holidays = args.length > 2 ? collectHolidays(args[2]) : new Set();
452
+ return (0, values_1.rvNumber)(networkdaysHelper(startN.value, endN.value, holidays));
453
+ };
454
+ exports.fnNETWORKDAYS = fnNETWORKDAYS;
455
+ const fnWORKDAY = args => {
456
+ const startN = (0, _shared_1.argToNumber)(args[0]);
457
+ if ((0, values_1.isError)(startN)) {
458
+ return startN;
459
+ }
460
+ const days = (0, _shared_1.argToNumber)(args[1]);
461
+ if ((0, values_1.isError)(days)) {
462
+ return days;
463
+ }
464
+ const holidays = args.length > 2 ? collectHolidays(args[2]) : new Set();
465
+ let current = Math.floor(startN.value);
466
+ const step = days.value >= 0 ? 1 : -1;
467
+ let remaining = Math.abs(days.value);
468
+ while (remaining > 0) {
469
+ current += step;
470
+ const dt = toDate(current);
471
+ const dow = dt.getUTCDay();
472
+ if (dow !== 0 && dow !== 6 && !holidays.has(current)) {
473
+ remaining--;
474
+ }
475
+ }
476
+ return (0, values_1.rvNumber)(current);
477
+ };
478
+ exports.fnWORKDAY = fnWORKDAY;
479
+ const fnYEARFRAC = args => {
480
+ const startN = (0, _shared_1.argToNumber)(args[0]);
481
+ if ((0, values_1.isError)(startN)) {
482
+ return startN;
483
+ }
484
+ const endN = (0, _shared_1.argToNumber)(args[1]);
485
+ if ((0, values_1.isError)(endN)) {
486
+ return endN;
487
+ }
488
+ const basis = args.length > 2 ? (0, _shared_1.argToNumber)(args[2]) : (0, values_1.rvNumber)(0);
489
+ if ((0, values_1.isError)(basis)) {
490
+ return basis;
491
+ }
492
+ const sd = toDate(Math.min(startN.value, endN.value));
493
+ const ed = toDate(Math.max(startN.value, endN.value));
494
+ const diffDays = Math.abs(Math.floor(endN.value) - Math.floor(startN.value));
495
+ switch (basis.value) {
496
+ case 0: {
497
+ // US (NASD) 30/360
498
+ let d1 = sd.getUTCDate();
499
+ const m1 = sd.getUTCMonth() + 1;
500
+ const y1 = sd.getUTCFullYear();
501
+ let d2 = ed.getUTCDate();
502
+ const m2 = ed.getUTCMonth() + 1;
503
+ const y2 = ed.getUTCFullYear();
504
+ // NASD adjustment rules
505
+ if (d1 === 31) {
506
+ d1 = 30;
507
+ }
508
+ if (d2 === 31 && d1 >= 30) {
509
+ d2 = 30;
510
+ }
511
+ // Handle end-of-Feb for start date
512
+ const feb1 = new Date(Date.UTC(y1, 1, 29)).getUTCMonth() === 1 ? 29 : 28;
513
+ if (m1 === 2 && d1 === feb1) {
514
+ d1 = 30;
515
+ if (m2 === 2) {
516
+ const feb2 = new Date(Date.UTC(y2, 1, 29)).getUTCMonth() === 1 ? 29 : 28;
517
+ if (d2 === feb2) {
518
+ d2 = 30;
519
+ }
520
+ }
521
+ }
522
+ const days30_360 = (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1);
523
+ return (0, values_1.rvNumber)(days30_360 / 360);
524
+ }
525
+ case 1: {
526
+ // Actual/Actual (ISDA convention, matches Excel's behaviour).
527
+ //
528
+ // Same-year is easy: divide by the length of that calendar year.
529
+ // Across years we split the interval into its leap-year portion and
530
+ // non-leap-year portion, then sum `leapDays/366 + nonLeapDays/365`.
531
+ // This is the ISDA "Act/Act" rule; simple averaging of year lengths
532
+ // (the previous implementation) produces visibly wrong answers like
533
+ // `YEARFRAC("2020-01-01","2021-01-01",1) ≈ 1.001368` where Excel
534
+ // returns exactly 1.
535
+ const y1 = sd.getUTCFullYear();
536
+ const y2 = ed.getUTCFullYear();
537
+ if (y1 === y2) {
538
+ const yearDays = (Date.UTC(y1 + 1, 0, 1) - Date.UTC(y1, 0, 1)) / 86400000;
539
+ return (0, values_1.rvNumber)(diffDays / yearDays);
540
+ }
541
+ let leapDays = 0;
542
+ let nonLeapDays = 0;
543
+ const sdMs = sd.getTime();
544
+ const edMs = ed.getTime();
545
+ for (let y = y1; y <= y2; y++) {
546
+ const yStart = Math.max(sdMs, Date.UTC(y, 0, 1));
547
+ const yEnd = Math.min(edMs, Date.UTC(y + 1, 0, 1));
548
+ if (yEnd <= yStart) {
549
+ continue;
550
+ }
551
+ const d = (yEnd - yStart) / 86400000;
552
+ const isLeap = (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
553
+ if (isLeap) {
554
+ leapDays += d;
555
+ }
556
+ else {
557
+ nonLeapDays += d;
558
+ }
559
+ }
560
+ return (0, values_1.rvNumber)(leapDays / 366 + nonLeapDays / 365);
561
+ }
562
+ case 2: // Actual/360
563
+ return (0, values_1.rvNumber)(diffDays / 360);
564
+ case 3: // Actual/365
565
+ return (0, values_1.rvNumber)(diffDays / 365);
566
+ case 4: {
567
+ // European 30/360
568
+ const d1 = Math.min(sd.getUTCDate(), 30);
569
+ const d2 = Math.min(ed.getUTCDate(), 30);
570
+ const m1 = sd.getUTCMonth() + 1;
571
+ const m2 = ed.getUTCMonth() + 1;
572
+ const y1 = sd.getUTCFullYear();
573
+ const y2 = ed.getUTCFullYear();
574
+ const days30_360 = (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1);
575
+ return (0, values_1.rvNumber)(days30_360 / 360);
576
+ }
577
+ default:
578
+ return values_1.ERRORS.NUM;
579
+ }
580
+ };
581
+ exports.fnYEARFRAC = fnYEARFRAC;
582
+ const fnDATEVALUE = args => {
583
+ const err = (0, _shared_1.checkError)(args[0]);
584
+ if (err) {
585
+ return err;
586
+ }
587
+ const text = (0, values_1.toStringRV)(args[0]).trim();
588
+ // Lotus 1-2-3 bug: "2/29/1900" or "February 29, 1900" etc. should return 60
589
+ const lotus29 = /^(2[/-]29[/-]1900|1900[/-]2[/-]29|1900[/-]02[/-]29|02[/-]29[/-]1900|Feb(ruary)?\s+29[,]?\s+1900)$/i;
590
+ if (lotus29.test(text)) {
591
+ return (0, values_1.rvNumber)(60);
592
+ }
593
+ const parsed = parseDateOnly(text);
594
+ if (!parsed) {
595
+ return values_1.ERRORS.VALUE;
596
+ }
597
+ return (0, values_1.rvNumber)(fromDate(new Date(Date.UTC(parsed.y, parsed.m - 1, parsed.d))));
598
+ };
599
+ exports.fnDATEVALUE = fnDATEVALUE;
600
+ const fnTIMEVALUE = args => {
601
+ const err = (0, _shared_1.checkError)(args[0]);
602
+ if (err) {
603
+ return err;
604
+ }
605
+ const text = (0, values_1.toStringRV)(args[0]).trim();
606
+ const parsed = parseTimeOnly(text);
607
+ if (parsed === null) {
608
+ return values_1.ERRORS.VALUE;
609
+ }
610
+ return (0, values_1.rvNumber)(parsed);
611
+ };
612
+ exports.fnTIMEVALUE = fnTIMEVALUE;
613
+ // ============================================================================
614
+ // Date / Time parsing (deterministic, independent of host locale)
615
+ //
616
+ // `new Date(text)` is unreliable across engines (Chrome parses "1/2/3" as
617
+ // US MDY, Node varies by version, and locale influences both). We hand-
618
+ // roll a small parser that accepts the formats Excel's DATEVALUE does and
619
+ // rejects everything else.
620
+ // ============================================================================
621
+ const MONTH_NAMES = {
622
+ jan: 1,
623
+ january: 1,
624
+ feb: 2,
625
+ february: 2,
626
+ mar: 3,
627
+ march: 3,
628
+ apr: 4,
629
+ april: 4,
630
+ may: 5,
631
+ jun: 6,
632
+ june: 6,
633
+ jul: 7,
634
+ july: 7,
635
+ aug: 8,
636
+ august: 8,
637
+ sep: 9,
638
+ sept: 9,
639
+ september: 9,
640
+ oct: 10,
641
+ october: 10,
642
+ nov: 11,
643
+ november: 11,
644
+ dec: 12,
645
+ december: 12
646
+ };
647
+ /** Parse a date-only string into `{y, m, d}` or `null` on rejection. */
648
+ function parseDateOnly(raw) {
649
+ const s = raw.trim();
650
+ // Strip a trailing time component (e.g. "2024-01-15 14:30") — but only
651
+ // split at a space that is followed by a digit, so a spelled-out date
652
+ // like "Jan 15, 2024" (which has month-name and day-number separated
653
+ // by spaces) survives for the "Mmm D, YYYY" matcher below.
654
+ // A naive `indexOf(" ")` truncated "Jan 15, 2024" to just "Jan".
655
+ const trailingTime = /^(.+?)\s(\d{1,2}:[\d:]+(?:\s*[AaPp]\.?[Mm]\.?)?)$/.exec(s);
656
+ const datePart = trailingTime ? trailingTime[1].trim() : s;
657
+ // ISO YYYY-MM-DD or YYYY/MM/DD
658
+ let m = /^(\d{4})[/-](\d{1,2})[/-](\d{1,2})$/.exec(datePart);
659
+ if (m) {
660
+ return validateYmd(+m[1], +m[2], +m[3]);
661
+ }
662
+ // US M/D/YYYY or M-D-YYYY
663
+ m = /^(\d{1,2})[/-](\d{1,2})[/-](\d{2,4})$/.exec(datePart);
664
+ if (m) {
665
+ let y = +m[3];
666
+ if (y < 100) {
667
+ // Excel's pivot: 00-29 → 2000s, 30-99 → 1900s
668
+ y += y < 30 ? 2000 : 1900;
669
+ }
670
+ return validateYmd(y, +m[1], +m[2]);
671
+ }
672
+ // D-Mmm-YY or D-Mmm-YYYY
673
+ m = /^(\d{1,2})[ /-]([A-Za-z]{3,9})[ /-]?(\d{2,4})?$/.exec(datePart);
674
+ if (m) {
675
+ const month = MONTH_NAMES[m[2].toLowerCase()];
676
+ if (!month) {
677
+ return null;
678
+ }
679
+ // Excel's DATEVALUE substitutes the host's current calendar year when
680
+ // the input omits a year (e.g. "15-Jan"). This matches Excel on the
681
+ // desktop, but note that the return value is not stable across time
682
+ // zones or years — tests that exercise this branch should freeze the
683
+ // clock (or supply a year) if they need reproducibility.
684
+ let y = m[3] ? +m[3] : new Date().getFullYear();
685
+ if (y < 100) {
686
+ y += y < 30 ? 2000 : 1900;
687
+ }
688
+ return validateYmd(y, month, +m[1]);
689
+ }
690
+ // "Mmm D, YYYY" or "Month D, YYYY"
691
+ m = /^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{2,4})$/.exec(datePart);
692
+ if (m) {
693
+ const month = MONTH_NAMES[m[1].toLowerCase()];
694
+ if (!month) {
695
+ return null;
696
+ }
697
+ let y = +m[3];
698
+ if (y < 100) {
699
+ y += y < 30 ? 2000 : 1900;
700
+ }
701
+ return validateYmd(y, month, +m[2]);
702
+ }
703
+ return null;
704
+ }
705
+ /** Validate a calendar date and return null for out-of-range components. */
706
+ function validateYmd(y, mo, d) {
707
+ if (y < 0 || y > 9999 || mo < 1 || mo > 12 || d < 1 || d > 31) {
708
+ return null;
709
+ }
710
+ // Day-of-month range check using UTC (leap years included).
711
+ const dt = new Date(Date.UTC(y, mo - 1, d));
712
+ if (dt.getUTCFullYear() !== y || dt.getUTCMonth() !== mo - 1 || dt.getUTCDate() !== d) {
713
+ return null;
714
+ }
715
+ return { y, m: mo, d };
716
+ }
717
+ /** Parse a time-only string into a fraction-of-day in [0, 1). */
718
+ function parseTimeOnly(raw) {
719
+ // Optional AM/PM suffix; captured case-insensitively.
720
+ const m = /^(\d{1,2})(?::(\d{1,2}))?(?::(\d{1,2}(?:\.\d+)?))?(?:\s*([AaPp])\.?\s*[Mm]\.?)?$/.exec(raw);
721
+ if (!m) {
722
+ return null;
723
+ }
724
+ let h = +m[1];
725
+ const min = m[2] ? +m[2] : 0;
726
+ const sec = m[3] ? +m[3] : 0;
727
+ if (min >= 60 || sec >= 60 || min < 0 || sec < 0) {
728
+ return null;
729
+ }
730
+ if (m[4]) {
731
+ const pm = m[4].toLowerCase() === "p";
732
+ if (h < 1 || h > 12) {
733
+ return null;
734
+ }
735
+ if (pm && h < 12) {
736
+ h += 12;
737
+ }
738
+ else if (!pm && h === 12) {
739
+ h = 0;
740
+ }
741
+ }
742
+ else {
743
+ if (h < 0 || h > 23) {
744
+ return null;
745
+ }
746
+ }
747
+ return (h * 3600 + min * 60 + sec) / 86400;
748
+ }
749
+ // ============================================================================
750
+ // More Date/Time Functions
751
+ // ============================================================================
752
+ const fnDAYS360 = args => {
753
+ const startN = (0, _shared_1.argToNumber)(args[0]);
754
+ if ((0, values_1.isError)(startN)) {
755
+ return startN;
756
+ }
757
+ const endN = (0, _shared_1.argToNumber)(args[1]);
758
+ if ((0, values_1.isError)(endN)) {
759
+ return endN;
760
+ }
761
+ const methodRV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : (0, values_1.rvBoolean)(false);
762
+ if ((0, values_1.isError)(methodRV)) {
763
+ return methodRV;
764
+ }
765
+ const method = methodRV.value;
766
+ const sd = toDate(startN.value);
767
+ const ed = toDate(endN.value);
768
+ let d1 = sd.getUTCDate();
769
+ let d2 = ed.getUTCDate();
770
+ const m1 = sd.getUTCMonth() + 1;
771
+ const m2 = ed.getUTCMonth() + 1;
772
+ const y1 = sd.getUTCFullYear();
773
+ const y2 = ed.getUTCFullYear();
774
+ if (method) {
775
+ if (d1 === 31) {
776
+ d1 = 30;
777
+ }
778
+ if (d2 === 31) {
779
+ d2 = 30;
780
+ }
781
+ }
782
+ else {
783
+ if (d1 === 31) {
784
+ d1 = 30;
785
+ }
786
+ if (d2 === 31 && d1 >= 30) {
787
+ d2 = 30;
788
+ }
789
+ }
790
+ return (0, values_1.rvNumber)((y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1));
791
+ };
792
+ exports.fnDAYS360 = fnDAYS360;
793
+ /** Map weekend-type code to the set of day-of-week indices (0=Sun..6=Sat) that are weekends. */
794
+ function getWeekendDays(weekendType) {
795
+ switch (weekendType) {
796
+ case 1:
797
+ return new Set([0, 6]); // Sat, Sun
798
+ case 2:
799
+ return new Set([0, 1]); // Sun, Mon
800
+ case 3:
801
+ return new Set([1, 2]); // Mon, Tue
802
+ case 4:
803
+ return new Set([2, 3]); // Tue, Wed
804
+ case 5:
805
+ return new Set([3, 4]); // Wed, Thu
806
+ case 6:
807
+ return new Set([4, 5]); // Thu, Fri
808
+ case 7:
809
+ return new Set([5, 6]); // Fri, Sat
810
+ case 11:
811
+ return new Set([0]); // Sun only
812
+ case 12:
813
+ return new Set([1]); // Mon only
814
+ case 13:
815
+ return new Set([2]); // Tue only
816
+ case 14:
817
+ return new Set([3]); // Wed only
818
+ case 15:
819
+ return new Set([4]); // Thu only
820
+ case 16:
821
+ return new Set([5]); // Fri only
822
+ case 17:
823
+ return new Set([6]); // Sat only
824
+ default:
825
+ return new Set([0, 6]); // Default: Sat, Sun
826
+ }
827
+ }
828
+ const fnNETWORKDAYS_INTL = args => {
829
+ const startN = (0, _shared_1.argToNumber)(args[0]);
830
+ if ((0, values_1.isError)(startN)) {
831
+ return startN;
832
+ }
833
+ const endN = (0, _shared_1.argToNumber)(args[1]);
834
+ if ((0, values_1.isError)(endN)) {
835
+ return endN;
836
+ }
837
+ const weekendArg = args.length > 2 ? (0, _shared_1.argToNumber)(args[2]) : (0, values_1.rvNumber)(1);
838
+ if ((0, values_1.isError)(weekendArg)) {
839
+ return weekendArg;
840
+ }
841
+ const holidays = args.length > 3 ? collectHolidays(args[3]) : new Set();
842
+ const weekendDays = getWeekendDays(weekendArg.value);
843
+ const s = Math.floor(Math.min(startN.value, endN.value));
844
+ const e = Math.floor(Math.max(startN.value, endN.value));
845
+ const sign = startN.value <= endN.value ? 1 : -1;
846
+ let count = 0;
847
+ for (let d = s; d <= e; d++) {
848
+ const dt = toDate(d);
849
+ if (!weekendDays.has(dt.getUTCDay()) && !holidays.has(d)) {
850
+ count++;
851
+ }
852
+ }
853
+ return (0, values_1.rvNumber)(count * sign);
854
+ };
855
+ exports.fnNETWORKDAYS_INTL = fnNETWORKDAYS_INTL;
856
+ const fnWORKDAY_INTL = args => {
857
+ const startN = (0, _shared_1.argToNumber)(args[0]);
858
+ if ((0, values_1.isError)(startN)) {
859
+ return startN;
860
+ }
861
+ const days = (0, _shared_1.argToNumber)(args[1]);
862
+ if ((0, values_1.isError)(days)) {
863
+ return days;
864
+ }
865
+ const weekendArg = args.length > 2 ? (0, _shared_1.argToNumber)(args[2]) : (0, values_1.rvNumber)(1);
866
+ if ((0, values_1.isError)(weekendArg)) {
867
+ return weekendArg;
868
+ }
869
+ const holidays = args.length > 3 ? collectHolidays(args[3]) : new Set();
870
+ const weekendDays = getWeekendDays(weekendArg.value);
871
+ let current = Math.floor(startN.value);
872
+ const step = days.value >= 0 ? 1 : -1;
873
+ let remaining = Math.abs(days.value);
874
+ while (remaining > 0) {
875
+ current += step;
876
+ const dt = toDate(current);
877
+ if (!weekendDays.has(dt.getUTCDay()) && !holidays.has(current)) {
878
+ remaining--;
879
+ }
880
+ }
881
+ return (0, values_1.rvNumber)(current);
882
+ };
883
+ exports.fnWORKDAY_INTL = fnWORKDAY_INTL;