Skip to content

Changelog

  • Cell.edit and DefinedName.edit are now @deprecated aliases that forward to internal _edit methods. Consumers should use Workbook.editCell instead — editCell keeps the dependency graph and recalc bookkeeping in sync, which the raw edit paths do not. No runtime behaviour change.
  • Workbook.editCell({ v: '#N/A' }) (and Cell.edit) no longer coerces error-looking strings to error values — v is preserved as a string, matching the Cell constructor. Coercion still happens when the input includes t: 'e'.
  • Workbook.editCell no longer clears existing ModelErrors on a cell before its per-branch validation guards run, so a formula edit rejected by the merge-follower guard now leaves prior errors intact.
  • toJSF typing fix: External.names entries are typed as ExternalDefinedName (was JSFDefinedName, structurally compatible but wrong). Type-only fix, no behaviour change.
  • Model.fromJSF external-load loop is no longer O(externals × main-cells). _addExternals defers per-external recalculate() and optimize() to a single trailing pass; on a real 125-external, 18k-cell workbook, Model.fromJSF drops from ~16s to ~2s. Callers passing recalcVolatiles: false, recalcErrors: false (the round-trip harnesses) still see no recalc.
  • numfmt moved from peerDependencies to dependencies (range unchanged, ~3.2.2). Apiary uses numfmt internally and consumers never pass instances in or out of the API; the peer-dependency placement was incidental, and demoting it means npm install @grid-is/apiary works without consumers having to add a matching numfmt entry.
  • @types/node moved from dependencies to optional peerDependencies (range: >=20.19.23 <21 || >=22.19.0 <23 || >=24.10.0). The published dist/index.d.ts still references Node’s Buffer, so a TypeScript Node consumer needs @types/node resolvable — but the consumer’s own pin now wins. Pure-JS consumers see no missing-peer warning thanks to optional: true. The per-major minimum reflects the late-2025 DefinitelyTyped round that narrowed Buffer.buffer from ArrayBufferLike to ArrayBuffer; below that, our public Workbook.fromXLSX / Model.fromXlsx types are unsound.
  • @borgar/xlsx-convert bumped to 5.2.0, picking up an XLSX color/theme parsing fix that surfaced through Model.fromXlsx in an add-ins consumer (undefined is not an object (evaluating 'readColor(elm.children[0], …)')).
  • Removed the NamedStyle and Style re-exports from the package entry point. These were unintentionally exposed during the 16.0 cycle and were never meant to be part of Apiary’s public API; import them from @jsfkit/types directly. Type-only change with no runtime impact.
  • Model now emits addsheet when a sheet is added (previously dropped silently), and no longer emits a spurious recalc for that operation.
  • Three independent deserialization-fidelity bugs in the binary cache, jointly affecting autoNoTable-mode roundtrips, are fixed:
    • Workbook._calcMode is restored from the payload (was silently reverting to 'auto').
    • Cells._dataTableCells (the data-table-anchor index) is repopulated, so iterDataTableCells() works on deserialized workbooks — unblocking the Model.deferDataTables = true setter and Model.attachWorkbook’s autoNoTable handling.
    • Model._deferDataTables and the deferral cell Sets (cellsToDefer, staleDeferredCells) are now serialized and restored, so a model in deferral mode no longer loses it through a roundtrip.
  • toJSF compacts full-row/full-column spill ranges in cell.F (A3:XFD33:3, B1:B1048576B:B), eliminating spurious roundtrip diffs when a code path holds an expanded F.
  • Error subclasses now set their own name field, so stack traces, console.log, inspect(), and Sentry display the actual class name (e.g. FormulaSyntaxError) instead of the inherited Error.
  • @jsfkit/types moved from devDependencies to dependencies so it is installed transitively when consumers npm install @grid-is/apiary. The published dist/index.d.{ts,cts} references @jsfkit/types directly because those types appear in Apiary’s public API; consumers’ type-checking previously failed unless they happened to depend on @jsfkit/types for other reasons.
  • typescript moved from dependencies to devDependencies. It is only used here as a CLI build tool (tsc --noEmit, tsup); nothing in lib/ imports it and the published types do not reference it. There is no public-API reason for consumers to receive Apiary’s pinned typescript version transitively. Originally added to dependencies during the apiary monorepo extraction without a deliberate placement choice.
  • CURRENT_SERIALIZATION_VERSION bumped 5 → 6 to carry the previously-omitted Model._deferDataTables boolean and the two deferral cell Sets. MINIMUM_ACCEPTABLE_SERIALIZATION_VERSION is unchanged — older payloads still load, with the new fields defaulted to off / empty.
  • JSF types referenced from the generated API reference (NamedStyle, Note, Style, Theme, ThemeColorScheme, ThemeCustomColor, ThemeFontCollection, ThreadedComment) now link to jsfkit.github.io instead of being mirrored as local Apiary type-alias pages.
  • EvaluateExpressionOptions.cropTo is now documented.
  • Cleaned up a confusing JSF-normalizer docstring.
  • Workbook.views is now a ViewManager (was WorkbookView[] | undefined). Workbook.getViews() and WorkSheet.getViews() are removed; WorkSheet.views is now @internal. Per-sheet view state is now read/written via workbook.views.get(index).getSheetView(sheetName).
  • Workbook.theme is now a ThemeManager (always present), not Theme | undefined.
  • WorkSheet.showGridLines property removed; gridline visibility now lives on WorkSheet.views[].showGridLines (per-view).
  • @jsfkit/types 1.x → 2.x: colours are now structured Color objects instead of hex strings, themes are restructured, and several types are reshaped.
  • Workbook.rowHeight(rowIndex, sheetName) now throws SheetNotFoundError when the sheet does not exist (previously returned the default 16 silently), and consults sheet.defaults.rowHeight before falling back to the Excel default. The new Workbook.columnWidth() follows the same precedence on its axis.
  • WorkSheet.rowHeights and WorkSheet.colWidths fields removed. Per-row height and per-column width are now read from WorkSheet.rows and WorkSheet.columns (the GridSize[] span arrays).

Removed @deprecated symbols (each deprecation note already pointed at the replacement shown here):

  • Cell.hasValue() / DefinedName.hasValue() and Cell.isBlank() / DefinedName.isBlank() removed. Use hasValueOrFormula().
  • Workbook.getTables() and Workbook.getTable(name) removed. Use workbook.tables.getAll() and workbook.tables.get(name).
  • WorkSheet.getComments() and WorkSheet.getNotes() removed. Use workbook.comments.get(sheetName) and workbook.notes.get(sheetName).
  • Model.fromData removed. Use Model.fromCsf.
  • Workbook.lazyImportPromise, Model.lazyImportPromise, loadLazy(), and the loadLazy re-export removed. All four were already no-ops; just delete the calls.
  • A batch of @deprecated @internal re-exports removed from the package entry point: formula-evaluation helpers (run, errorForCode, errorTable, …) and dependency graph helpers (cellToVertexId, wbNameToKey, …). Use cell.vertexId / definedName.vertexId instead of cellToVertexId(cell).

(Several dependency-graph items previously marked @deprecated @internal (or not exported at all) are now part of the public API: VertexId, CellVertexId, NameVertexId, RangeVertexId, KnownVertexId, VertexIdSet. The helpers referenceToVertexId, vertexIdToCell, and vertexIdToReference are re-exported with @internal markers — available, but excluded from documentation.)

  • Views CRUD via Workbook.views, with two new public types ViewManager and WorkbookView.
  • Theme CRUD via Workbook.theme (new ThemeManager): read/write the theme as a whole, the 12-colour scheme, major/minor fonts, and custom colours.
  • Named-style CRUD via styleManager.named (new NamedStyles collection), with case-insensitive lookup and original casing preserved on NamedStyle.name.
  • Workbook.reorderSheet(name, newIndex) and Workbook.copySheet(name, newName?).
  • Table is now a public type export with new methods (appendRow, insertRow, rename, rowRef) and a new dataRowCount getter. TableManager is also exported as a type. (The runtime classes are not re-exported: instances come from workbook.tables.get(name) / workbook.tables.add().)
  • Public-API types now exported from the package entry point (previously reachable only via Parameters<typeof model.write>[2]-style tricks): WriteOptions, AddWorkbookOptions, WorkbookOptions, ReplaceTableReferencesFn, ModelEventArgs, ModelEventType, ModelEventListener, EvaluateExpressionOptions, ModelMeta.
  • NotesManager and CommentsManager are now exported so they show up in the generated public docs.
  • Workbook.toXLSX(outputType?, options?) gains both arguments. outputType is 'nodebuffer' (default) or 'arraybuffer' for browser-compatible XLSX export. options (typed as ToXLSXOptions) carries a compressionLevel setting (DEFLATE 0–9), now defaulting to 6, down from 9 — measurably faster export with negligible size impact on typical XLSX payloads.
  • Workbook.columnWidth(columnIndex, sheetName) — analogous to Workbook.rowHeight(). Returns the column width in pixels.
  • Workbook.moveCells and Workbook.rewriteFormulas accept an optional recalcNow (default true); pass false to defer the trailing recalculate().
  • Workbook.editCell() added as the preferred name for writeCellData() (which stays as a @deprecated alias). Its parameter type simplifies to plain CellData, which now includes the optional ft field.
  • Identifier casing standardized on uppercase JSF/XLSX: Model.fromJSF, toJSF, csfToJSF, normalizeJSFForComparison, toXLSX, toXLSXFile, validateXLSXFilePath, plus type XLSXOutputType. The old title-case spellings remain as @deprecated aliases with identical signatures — no breaking change.
  • moveCells now handles merged cells. Destination merges are dissolved silently (matching Excel Scripts and Office.js behavior), and cells moved out of a source merge no longer carry stale .M merge pointers.
  • Loading a workbook with a table whose name is not valid as a defined name (e.g. T1, A1, R1C1) now sanitizes and uniquifies the name instead of dropping the table with a ModelError.
  • Iterative calculation now converges correctly when the iterative set contains a spill; previously the calc ran to maxIterations every time and dependents of unchanged spills could be flagged as false-positive circular references.
  • getEntities no longer crashes on workbooks containing sheet-scoped defined names.
  • SORTN silently ignores out-of-bounds sort-column indices instead of returning #VALUE!, matching verified Google Sheets behavior.
  • toJSF preserves values in merged-cell “ghosts” (non-anchor cells); mergeCells keeps styles on follower cells and only clears values, matching Excel.
  • Deserializing models serialized by older Apiary versions no longer crashes on missing views/comments/notes/people/externals/rows properties or on the stable.csf -> stable.jsf Table key rename.
  • replaceTableReferences now correctly rewrites bare-name references to tables (not just bracketed structured references).
  • Dynamic dependencies of LAMBDA closures passed to BYROW/BYCOL/MAP/REDUCE/SCAN with INDIRECT/OFFSET/ANCHORARRAY in the body are now tracked, so edits to referenced cells correctly trigger recalc.
  • Lambda parameter resolution during reference analysis no longer crashes on INDIRECT/OFFSET inside directly-called lambdas or nested lambda scopes.
  • toJSF no longer crashes on full-row or full-column spill ranges.
  • rewriteFormulas skips unparseable formulas instead of throwing.
  • Loading CSF workbooks: the literal string "#SPILL!" in a cell is no longer coerced to an error value, fixing an R-tree invariant violation that crashed describeWorkbook in some cases.
  • Cells in JSF with error-looking string values ("#VALUE!", "#N/A", …) but no explicit t: 'e' marker are preserved as strings, not coerced to errors.
  • Faster label detection in describeWorkbook via cheaper subordinate-style checks (weighted geomean ~23.5% faster, worst-case workbooks up to 43% faster).
  • CURRENT_SERIALIZATION_VERSION bumped 3 → 5 over the v16 cycle. The 3 → 4 step was a marker for shape changes that had already landed without a version bump (Table csfjsf key, cellsWithDynamicDependencies, notes/comments/views/tables), giving consumers that cached v3 payloads a proper signal to invalidate. The 4 → 5 step adds the namedStyles field and folds the legacy parallel rowHeights/colWidths maps into the WorkSheet.rows/WorkSheet.columns span arrays. MINIMUM_ACCEPTABLE_SERIALIZATION_VERSION stays at 1 — older cached payloads still load.
  • ModelError.toJSON API documentation cleaned up (the raw inferred-return-type property list is gone); the MDN link gets a readable link text.
  • @jsfkit/types ^1.4.1^2.2.0 (see Breaking changes for the structural shifts).
  • @borgar/xlsx-convert and @grid-is/jsf2xlsx upgraded for XLSX import/export of named styles and the CSE array-formula flag, plus round-trip and repair-dialog fixes.
  • @grid-is/waspiary → 1.11.0 for structured-reference bare-name rewrite.

First release candidate for the 16.0 major line. Covers the deprecation cleanup, API additions, and fixes landed since v16.0.0-alpha.0.

All of the following remove symbols that were already @deprecated, with their deprecation notes pointing at the replacement shown here.

  • Cell.hasValue() / DefinedName.hasValue() and Cell.isBlank() / DefinedName.isBlank() removed. Use hasValueOrFormula().
  • Workbook.getTables() and Workbook.getTable(name) removed. Use workbook.tables.getAll() and workbook.tables.get(name).
  • WorkSheet.getComments() and WorkSheet.getNotes() removed. Use workbook.comments.get(sheetName) and workbook.notes.get(sheetName).
  • Model.fromData removed. Use Model.fromCsf.
  • Workbook.lazyImportPromise, Model.lazyImportPromise, loadLazy(), and the loadLazy re-export removed. All four were already no-ops; just delete the calls.
  • A batch of @deprecated @internal re-exports removed from the package entry point: formula-evaluation helpers (run, errorForCode, errorTable, …) and dependency graph helpers (cellToVertexId, wbNameToKey, …). Use cell.vertexId / definedName.vertexId instead of cellToVertexId(cell).

(Some dependency graph classes and utilities were previously marked @deprecated @internal but are now instead made public: VertexId, CellVertexId, NameVertexId, RangeVertexId, KnownVertexId, VertexIdSet, referenceToVertexId, vertexIdToCell, vertexIdToReference.)

  • Public-API types now exported from the package entry point (previously reachable only via Parameters<typeof model.write>[2]-style tricks): WriteOptions, AddWorkbookOptions, WorkbookOptions, ReplaceTableReferencesFn, ModelEventArgs, ModelEventType, ModelEventListener, EvaluateExpressionOptions, ModelMeta.
  • Named-style CRUD via styleManager.named (new NamedStyles collection), with case-insensitive lookup and original casing preserved on NamedStyle.name.
  • Workbook.editCell() added as the preferred name for writeCellData() (which stays as a @deprecated alias). Its parameter type simplifies to plain CellData, which now includes the optional ft field.
  • Identifier casing standardized on uppercase JSF/XLSX: Model.fromJSF, toJSF, csfToJSF, normalizeJSFForComparison, toXLSX, toXLSXFile, validateXLSXFilePath, plus types XLSXOutputMap and XLSXOutputType. The old title-case spellings remain as @deprecated aliases with identical signatures — no breaking change.
  • moveCells now handles merged cells. Destination merges are dissolved silently (matching Excel Scripts and Office.js behavior), and cells moved out of a source merge no longer carry stale .M merge pointers.
  • Loading a workbook with a table whose name is not valid as a defined name (e.g. T1, A1, R1C1) now sanitizes and uniquifies the name instead of dropping the table with a ModelError.
  • CURRENT_SERIALIZATION_VERSION bumped 3 → 4 as a marker for shape changes that had landed without a version bump (Table csfjsf key, cellsWithDynamicDependencies, notes/comments/views/tables), giving consumers that cached v3 payloads a proper signal to invalidate.
  • CURRENT_SERIALIZATION_VERSION bumped 4 → 5 for the named-styles addition. MINIMUM_ACCEPTABLE_SERIALIZATION_VERSION stays at 1 — older cached payloads still load.
  • ModelError.toJSON API documentation cleaned up (the raw inferred-return-type property list is gone); the MDN link gets a readable link text.

First alpha of the 16.0 major line. Subject to further breaking changes before the stable release.

  • Workbook.views is now a ViewManager (was WorkbookView[] | undefined). Workbook.getViews() and WorkSheet.getViews() are removed; WorkSheet.views is now @internal. Per-sheet view state is now read/written via workbook.views.get(index).getSheetView(sheetName).
  • Workbook.theme is now a ThemeManager (always present), not Theme | undefined.
  • WorkSheet.showGridLines property removed; gridline visibility now lives on WorkSheet.views[].showGridLines (per-view).
  • @jsfkit/types 1.x → 2.0.0: colours are now structured Color objects instead of hex strings, themes are restructured, and GridSize gains an optional size.
  • Views CRUD via Workbook.views, with two new public types ViewManager and WorkbookView.
  • Theme CRUD via Workbook.theme (new ThemeManager): read/write the theme as a whole, the 12-colour scheme, major/minor fonts, and custom colours.
  • Workbook.reorderSheet(name, newIndex) and Workbook.copySheet(name, newName?).
  • Table class is now a public export with new methods (appendRow, insertRow, rename, rowRef) and a new dataRowCount getter. TableManager is also exported.
  • toXlsx accepts an optional outputType argument ('nodebuffer' (default) or 'arraybuffer') for browser-compatible XLSX export. New exports XlsxOutputType and XlsxOutputMap.
  • NotesManager and CommentsManager are now exported so they show up in the generated public docs.
  • Workbook.moveCells and Workbook.rewriteFormulas accept an optional recalcNow (default true); pass false to defer the trailing recalculate().
  • getEntities no longer crashes on workbooks containing sheet-scoped defined names.
  • SORTN silently ignores out-of-bounds sort-column indices instead of returning #VALUE!, matching verified Google Sheets behavior.
  • toJsf preserves values in merged-cell “ghosts” (non-anchor cells); mergeCells keeps styles on follower cells and only clears values, matching Excel.
  • Deserializing models serialized by older Apiary versions no longer crashes on missing views/comments/notes/people/externals/rows properties or on the stable.csf -> stable.jsf Table key rename.
  • replaceTableReferences now correctly rewrites bare-name references to tables (not just bracketed structured references).
  • Dynamic dependencies of LAMBDA closures passed to BYROW/BYCOL/MAP/REDUCE/SCAN with INDIRECT/OFFSET/ANCHORARRAY in the body are now tracked, so edits to referenced cells correctly trigger recalc.
  • Lambda parameter resolution during reference analysis no longer crashes on INDIRECT/OFFSET inside directly-called lambdas or nested lambda scopes.
  • toJsf no longer crashes on full-row or full-column spill ranges.
  • rewriteFormulas skips unparseable formulas instead of throwing.
  • Loading CSF workbooks: the literal string "#SPILL!" in a cell is no longer coerced to an error value, fixing an R-tree invariant violation that crashed describeWorkbook in some cases.
  • Cells in JSF with error-looking string values ("#VALUE!", "#N/A", …) but no explicit t: 'e' marker are preserved as strings, not coerced to errors.
  • Faster label detection in describeWorkbook via cheaper subordinate-style checks (weighted geomean ~23.5% faster, worst-case workbooks up to 43% faster).
  • @jsfkit/types ^1.4.1 -> ^2.0.0 (see Breaking changes).
  • @grid-is/waspiary -> 1.11.0 for structured-reference bare-name rewrite.
  • Cell notes CRUD via NotesManager (workbook.notes): add, get, getByCell, update, delete
  • AND/OR/XOR/NOT evaluation with strings and other edge-case arguments, matching Excel and Google Sheets behavior
  • TEXTJOIN and JOIN now apply cell display formats (e.g. date formats) in Google mode

These are technically breaking, but very minor and in very recent features, so did not demand a major-version bump.

  • CommentsManager now throws SheetNotFoundError (instead of plain Error) for missing sheets, with a differently worded message.
  • WorkSheet.notes type changed to Note[] (no longer possibly undefined)
  • Update @grid-is/jsf2xlsx to ^1.3.2, updating default column width and fixing extraneous activeTab="0" attributes in workbookView elements.
  • Respect ‘autoNoTables’ from XLSX file, plus deferDataTables option for manual control
    • And more generally, mark any formula cells to be deferred in recalculation
  • Threaded comments CRUD via CommentsManager (workbook.comments)
  • MATCH returned #N/A instead of #REF! in Excel missing-sheet edge case
  • toJsf export expanded external workbooks to nonexistent cells if referenced in ranges
  • Error-like strings (e.g. #REF!) not treated as error values when loading styled cells from CSF
  • Default (named) styles were not preserved in toJsf export
  • Much faster worst-case describeWorkbook (label-detection) performance
  • Update quickstart to use Model.fromXlsxFile instead of manual xlsx-convert
  • Preserve formula type (array or not) when result is 1x1, and classify correctly on edit
  • Serialization did not preserve views, annotations, rows, and externals
  • Remove Node.js util imports so consumers need not polyfill for browser compatibility
  • Add changelog to public docs
  • Excel data tables
  • Function SORTN
  • getViews method in WorkSheet and Workbook
  • Google Sheets FLATTEN function
  • Merge/unmerge cells
  • Make HYPERLINK()-derived hyperlinks ephemeral
  • Preserve external workbooks in JSF roundtrip
  • Update comment and note cell refs on move, insert, and delete
  • Wrap fs/promises imports in try-catch to avoid bundler errors
  • Speed up describeWorkbook by pre-filtering parseDate calls
  • Pare down public API, marking stuff @deprecated and/or @internal
  • Use code blocks in Typedoc-generated docs
  • Support JSF cell notes and threaded comments
  • describeWorkbook crash on cross-workbook ref to formula cell
  • Support QUERY with COUNT(DISTINCT value)
  • Missed dynamic dependencies in lambda-calling functions at init time
  • Preserve cells with explicit empty styles through round-trip
  • Strip numberFormatFromFormula from exported styles in toJSF
  • toJsf
  • toXlsx
  • Add fromXlsx methods for direct XLSX loading
  • Native QUERY without pg-mem (calling it “feat” because it supports a lot that the old one did not)
  • Output style indexes on rows and columns
  • Real workbooks override external workbooks with same name
  • Fix invariant error on insert after row is deleted
  • Export ft property in toCSF for array formulas
  • Init recalc was skipped if !recalcVolatiles && !recalcErrors
  • Load XLSX files in Excel mode by default
  • Respect recalcVolatiles option during initial recalculation
  • Preserve text strings that look like errors in JSF loading
  • ERROR.TYPE did not support modern error codes
  • describeWorkbook throws on JSF workbook with externals
  • Upgrade xlsx-convert to 3.6.4 for bugfixes
  • Fix handlerRels to work with absolute paths
  • Fix external refs order
  • The r property on cells is optional
  • Remove Flags module and flags export
  • Public Model.attachWorkbook, and document addWorkbook as just a wrapper
  • Export StyleManager
  • Export CellData type
  • Add support for JSF workbook/worksheet view props
  • Specific Error subclass for invalid reference strings
  • Add missing detail messages on #CALC! errors
  • Google-mode early-date date function discrepancies
  • Matrix.expand makes fully-populated matrices, causing performance disasters
  • Nonresolving name in LOOKUP vector arg borks reference analysis
  • Propagate markDirty to all dependents of spill ranges
  • Blank spill anchor missing in Cells.getCells
  • Don’t propagate recalc from unchanged spill matrix
  • numberFormatFromFormula propagation
  • SUMIFS etc. wrong for Matrix with defaulted regions
  • Incorrect swap in Brent root-finding setup
  • QUERY with now() not treated as volatile if no dependencies
  • GSDV blocker in extended range should not block other columns
  • Evaluate array expressions with mismatched row widths as #VALUE!
  • Fix default column-width units discrepancy
  • Fix Table serialization property name mismatch
  • Fix serialization invariant violation
  • Fix errors in toCSF export structures
  • Fix GSDV spill range inference: use offset not absolute row
  • Fix regression in evaluateExpression
  • Preserve CSF style array when loading workbooks
  • Add vertexId to Cell and DefinedName
  • Non-volatile OFFSET and INDIRECT and ANCHORARRAY with dynamic dependencies
  • CSF type should have filename, not name
  • Change NameReference.width and .height to be undefined, not throw
  • Update fx to 5.0
  • Upgrade Waspiary to 1.10.0 to permit R and C names
  • Add missing detail messages on #CALC! errors
  • Export CellData type
  • Specific Error subclass for invalid reference strings
  • Add support for JSF workbook/worksheet view props
  • Preserve CSF style array when loading workbooks
  • GSDV blocker in extended range should not block other columns
  • numberFormatFromFormula propagation
  • SUMIFS etc. wrong for Matrix with defaulted regions
  • Incorrect swap in Brent root-finding setup
  • QUERY with now() not treated as volatile if no dependencies
  • Evaluate array expressions with mismatched row widths as #VALUE!
  • Fix GSDV spill range inference: use offset not absolute row
  • Fix Table serialization property name mismatch
  • Fix serialization invariant violation
  • Fix errors in toCSF export structures
  • Blank spill anchor missing in Cells.getCells
  • Don’t propagate recalc from unchanged spill matrix
  • Fix regression in evaluateExpression
  • CSF type should have filename, not name
  • Non-volatile OFFSET and INDIRECT and ANCHORARRAY with dynamic dependencies
  • Public Model.attachWorkbook, and document addWorkbook as just a wrapper
  • Export StyleManager
  • Google-mode early-date date function discrepancies
  • Matrix.expand makes fully-populated matrices, causing performance disasters
  • Non-resolving name in LOOKUP vector arg borks reference analysis
  • Propagate markDirty to all dependents of spill ranges
  • Fix default column-width units discrepancy
  • Add vertexId to Cell and DefinedName
  • Change NameReference.width and .height to be undefined, not throw
  • Update fx to 5.0
  • Read JSF directly
  • Bugs in row and column deletion and moves
  • Support R1C1 syntax in INDIRECT
  • Handle changed serialization
  • Replace ERROR_SPILL 'foo' placeholder with proper detail message
  • Serialize model with lambdas in arrays
  • VLOOKUP/HLOOKUP can return non-up-to-date value
  • Direct call to UPLUS fails with internal error
  • Recalculate affected formulas if clearGsdv clears cells
  • Remove reset value from DefinedName and CellInterface
  • Switch to @jsfkit/types for JSF type definitions
  • Install from, and publish to, npmjs.com registry
  • Make FormulaError and Reference fully immutable
  • Store origin cell in FormulaError
  • Add and improve error-value detail messages
  • Add detail messages to #SPILL! errors
  • Make Cell.isBlank() closer to what its name implies
  • Minor bugs in reference intersection and add a test
  • Rename and deprecate Cell methods
  • Deploy public API docs to GitHub Pages site
  • Remove internal stuff from docs
  • Mention case-insensitivity in name parameters
  • Recalculate error-valued cells at init time
  • Remove defined name
  • Wrong spill-operator result for blocked spill
  • QUERY coerces dates to string by local timezone
  • Support structured references in INDIRECT
  • IF result should not be marked dynamic
  • Make apiary bin work again
  • Allow disabling common-subexpression extraction
  • Fix 1904 epoch bug when converting JSF to CSF
  • Export FormulaSyntaxError and EvaluationError
  • Add Model.empty() convenience method
  • Export recalculation option symbols
  • ADDRESS with invalid coordinates yields wrong results or throws exception
  • Use source number format in TO_TEXT
  • Set number format in TO_* functions
  • XLOOKUP third argument wrongly forced up-to-date
  • ROW etc. fail to update when name ref updates
  • False-pos circdep in SUMIF/AVERAGEIF on target range extension
  • Workbook.iterFormulaCells had a bug and a redundant sibling
  • Update JSF support
  • Add a quick start guide
  • Add Starlight-based documentation system
  • Add tutorial for creating a spreadsheet from scratch
  • Document some methods on the Model class
  • Add support for loading and converting JSF format
  • CONVERT failed to handle reference value argument
  • Bump fx from 4.11.2 to 4.12.0 [bot]
  • Bump msgpackr from 1.11.4 to 1.11.5 [bot]
  • Fix defined names causing slow iterative calculation

Version revoked due to incorrect fix.

  • Detect parent labels
  • Label sequence confusion from sparse values at island top/left
  • Bump component-emitter from 1.3.0 to 2.0.0
  • Upgrade pg-mem to 2.6.15
  • Leftmost-column data mistaken for a label sequence
  • Skip over gaps in mixed-type label subsequences
  • Improve island-based label detection