@devmm/puredocs-excel-formula 1.1.0 → 1.1.2

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.
package/dist/index.cjs CHANGED
@@ -282,7 +282,7 @@ var _FormulaValue = class _FormulaValue {
282
282
  if (value2 === null || value2 === void 0) return _FormulaValue.blank;
283
283
  if (typeof value2 === "number") return isNaN(value2) ? _FormulaValue.errorValue : _FormulaValue.number(value2);
284
284
  if (typeof value2 === "boolean") return _FormulaValue.boolean(value2);
285
- if (typeof value2 === "string") return value2 === "" ? _FormulaValue.blank : _FormulaValue.text(value2);
285
+ if (typeof value2 === "string") return _FormulaValue.text(value2);
286
286
  if (value2 instanceof Date) {
287
287
  return _FormulaValue.number(puredocsExcel.toOADate(value2));
288
288
  }
@@ -1820,11 +1820,14 @@ function count(a, c) {
1820
1820
  function countA(a, c) {
1821
1821
  return FormulaValue.number(exports.FormulaHelper.flattenArgs(a, c).filter((v) => !v.isBlank).length);
1822
1822
  }
1823
+ function isCountBlank(v) {
1824
+ return v.isBlank || v.isText && v.textValue === "";
1825
+ }
1823
1826
  function countBlank(a, c) {
1824
1827
  const v = a[0].evaluate(c);
1825
- if (!v.isArray) return FormulaValue.number(v.isBlank ? 1 : 0);
1828
+ if (!v.isArray) return FormulaValue.number(isCountBlank(v) ? 1 : 0);
1826
1829
  let n = 0;
1827
- for (const item of v.arrayVal.values()) if (item.isBlank) n++;
1830
+ for (const item of v.arrayVal.values()) if (isCountBlank(item)) n++;
1828
1831
  return FormulaValue.number(n);
1829
1832
  }
1830
1833
  function countIf(a, c) {
@@ -1832,11 +1835,12 @@ function countIf(a, c) {
1832
1835
  if (range.isError) return range;
1833
1836
  const crit = a[1].evaluate(c);
1834
1837
  if (crit.isError) return crit;
1835
- const criteria = crit.asText();
1836
- if (!range.isArray) return FormulaValue.number(exports.FormulaHelper.matchesCriteria(range, criteria) ? 1 : 0);
1838
+ const compiled = exports.FormulaHelper.compileCriteria(crit.asText());
1839
+ if (!range.isArray) return FormulaValue.number(compiled.test(range) ? 1 : 0);
1840
+ const countBlanks = compiled.kind === "blankness";
1837
1841
  let n = 0;
1838
1842
  for (const item of range.arrayVal.values()) {
1839
- if (!item.isBlank && exports.FormulaHelper.matchesCriteria(item, criteria)) n++;
1843
+ if ((countBlanks || !item.isBlank) && compiled.test(item)) n++;
1840
1844
  }
1841
1845
  return FormulaValue.number(n);
1842
1846
  }
@@ -2813,6 +2817,8 @@ function registerLookup(r) {
2813
2817
  r.register("COLUMNS", columns, 1, 1);
2814
2818
  r.register("OFFSET", offset, 3, 5, true);
2815
2819
  r.register("INDIRECT", indirect, 1, 2, true);
2820
+ r.register("ANCHORARRAY", anchorArray, 1, 1);
2821
+ r.register("SINGLE", single, 1, 1);
2816
2822
  }
2817
2823
  function num2(a, c, i) {
2818
2824
  const r = exports.FormulaHelper.evalDouble(a[i], c);
@@ -3260,6 +3266,15 @@ function offset(a, c) {
3260
3266
  puredocsExcel.cellRefFromRowCol(newRow + height - 1, newCol + width - 1)
3261
3267
  );
3262
3268
  }
3269
+ function anchorArray(a, c) {
3270
+ const arg2 = a[0];
3271
+ if (arg2 instanceof CellReferenceNode) return c.resolveSpillRange(arg2.reference);
3272
+ if (arg2 instanceof SheetCellReferenceNode) return c.resolveSheetSpillRange(arg2.sheetName, arg2.cellReference);
3273
+ return FormulaValue.errorRef;
3274
+ }
3275
+ function single(a, c) {
3276
+ return new ImplicitIntersectionNode(a[0]).evaluate(c);
3277
+ }
3263
3278
 
3264
3279
  // src/functions/statistical-functions.ts
3265
3280
  function registerStatistical(r) {
@@ -4728,6 +4743,8 @@ exports.FormulaHelper = void 0;
4728
4743
  const rhsVal = parseFloat(rhs);
4729
4744
  const rhsNum = isNaN(rhsVal) ? null : rhsVal;
4730
4745
  const rhsValue = rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs);
4746
+ if (rhs === "" && op === "=") return { kind: "blankness", test: (v) => v.isBlank };
4747
+ if (rhs === "" && op === "<>") return { kind: "other", test: (v) => !v.isBlank };
4731
4748
  if (op === "=") {
4732
4749
  return rhsNum !== null ? numberEquality(rhsNum) : textEquality(rhs);
4733
4750
  }
@@ -4743,6 +4760,9 @@ exports.FormulaHelper = void 0;
4743
4760
  const pattern = wildcardToRegex(trimmed);
4744
4761
  return { kind: "other", test: (v) => pattern.test(v.asText()) };
4745
4762
  }
4763
+ if (trimmed === "") {
4764
+ return { kind: "blankness", test: (v) => v.isBlank || v.isText && v.textValue === "" };
4765
+ }
4746
4766
  const num5 = parseFloat(trimmed);
4747
4767
  return isNaN(num5) ? textEquality(trimmed) : numberEquality(num5);
4748
4768
  }
@@ -4921,6 +4941,15 @@ var _FormulaContext = class _FormulaContext {
4921
4941
  if (colon < 0) return this.getCellValue(spillRef);
4922
4942
  return this.getRangeValues(spillRef.slice(0, colon), spillRef.slice(colon + 1));
4923
4943
  }
4944
+ /** {@link resolveSpillRange} for an anchor on another sheet ('S'!A1#). */
4945
+ resolveSheetSpillRange(sheetName, anchorRef) {
4946
+ if (!this.workbook) return FormulaValue.errorRef;
4947
+ try {
4948
+ return __privateMethod(this, _FormulaContext_instances, forSheet_fn).call(this, sheetName).resolveSpillRange(anchorRef);
4949
+ } catch {
4950
+ return FormulaValue.errorRef;
4951
+ }
4952
+ }
4924
4953
  getRangeBounds(startRef, endRef) {
4925
4954
  const s = puredocsExcel.parseCellRef(startRef);
4926
4955
  const e = puredocsExcel.parseCellRef(endRef);
@@ -5539,6 +5568,7 @@ function createWorkbookRecalcModel(workbook) {
5539
5568
  };
5540
5569
  }
5541
5570
  var MAX_ADOPTED_SPILL_CELLS = 262144;
5571
+ var resultOf = (fv2) => fv2.isBlank ? 0 : fv2.toObject();
5542
5572
  var normSheet = (s) => s.toUpperCase();
5543
5573
  var normRef = (r) => r.replace(/\$/g, "").toUpperCase();
5544
5574
  var keyOf = (sheet, ref) => `${normSheet(sheet)}!${normRef(ref)}`;
@@ -6199,7 +6229,7 @@ writeResult_fn = function(e) {
6199
6229
  if (!fv2.isArray) {
6200
6230
  __privateMethod(this, _RecalcEngine_instances, clearSpill_fn).call(this, anchorKey, changed);
6201
6231
  __privateGet(this, _model).setCellArrayRef?.(e.sheetName, e.ref, null);
6202
- const value2 = fv2.toObject();
6232
+ const value2 = resultOf(fv2);
6203
6233
  __privateMethod(this, _RecalcEngine_instances, writeCell_fn).call(this, e.sheetName, e.ref, value2, e.row, e.col);
6204
6234
  changed.push({ sheet: e.sheet, row: e.row, col: e.col });
6205
6235
  return { result: { sheet: e.sheetName, ref: e.ref, value: value2 }, changed };
@@ -6230,7 +6260,7 @@ writeResult_fn = function(e) {
6230
6260
  for (let dc = 0; dc < cols; dc++) {
6231
6261
  const r = e.row + dr, c = e.col + dc;
6232
6262
  const ref = puredocsExcel.cellRefFromRowCol(r, c);
6233
- __privateMethod(this, _RecalcEngine_instances, writeCell_fn).call(this, e.sheetName, ref, arr.get(dr, dc).toObject(), r, c);
6263
+ __privateMethod(this, _RecalcEngine_instances, writeCell_fn).call(this, e.sheetName, ref, resultOf(arr.get(dr, dc)), r, c);
6234
6264
  changed.push({ sheet: e.sheet, row: r, col: c });
6235
6265
  if (dr !== 0 || dc !== 0) {
6236
6266
  const cellKey2 = keyOf(e.sheet, ref);
@@ -6250,7 +6280,7 @@ writeResult_fn = function(e) {
6250
6280
  const spillRef = `${e.ref}:${puredocsExcel.cellRefFromRowCol(e.row + rows2 - 1, e.col + cols - 1)}`;
6251
6281
  __privateGet(this, _model).setCellArrayRef?.(e.sheetName, e.ref, spillRef);
6252
6282
  return {
6253
- result: { sheet: e.sheetName, ref: e.ref, value: arr.get(0, 0).toObject(), spill: { rows: rows2, cols } },
6283
+ result: { sheet: e.sheetName, ref: e.ref, value: resultOf(arr.get(0, 0)), spill: { rows: rows2, cols } },
6254
6284
  changed
6255
6285
  };
6256
6286
  };