Changelog
v16.0.2
Section titled “v16.0.2”API changes
Section titled “API changes”Cell.editandDefinedName.editare now@deprecatedaliases that forward to internal_editmethods. Consumers should useWorkbook.editCellinstead —editCellkeeps the dependency graph and recalc bookkeeping in sync, which the raweditpaths do not. No runtime behaviour change.
Bug fixes
Section titled “Bug fixes”Workbook.editCell({ v: '#N/A' })(andCell.edit) no longer coerces error-looking strings to error values —vis preserved as a string, matching theCellconstructor. Coercion still happens when the input includest: 'e'.Workbook.editCellno longer clears existingModelErrors 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.toJSFtyping fix:External.namesentries are typed asExternalDefinedName(wasJSFDefinedName, structurally compatible but wrong). Type-only fix, no behaviour change.
Performance
Section titled “Performance”Model.fromJSFexternal-load loop is no longer O(externals × main-cells)._addExternalsdefers per-externalrecalculate()andoptimize()to a single trailing pass; on a real 125-external, 18k-cell workbook,Model.fromJSFdrops from ~16s to ~2s. Callers passingrecalcVolatiles: false, recalcErrors: false(the round-trip harnesses) still see no recalc.
Packaging
Section titled “Packaging”numfmtmoved frompeerDependenciestodependencies(range unchanged,~3.2.2). Apiary usesnumfmtinternally and consumers never pass instances in or out of the API; the peer-dependency placement was incidental, and demoting it meansnpm install @grid-is/apiaryworks without consumers having to add a matchingnumfmtentry.@types/nodemoved fromdependenciesto optionalpeerDependencies(range:>=20.19.23 <21 || >=22.19.0 <23 || >=24.10.0). The publisheddist/index.d.tsstill references Node’sBuffer, so a TypeScript Node consumer needs@types/noderesolvable — but the consumer’s own pin now wins. Pure-JS consumers see no missing-peer warning thanks tooptional: true. The per-major minimum reflects the late-2025 DefinitelyTyped round that narrowedBuffer.bufferfromArrayBufferLiketoArrayBuffer; below that, our publicWorkbook.fromXLSX/Model.fromXlsxtypes are unsound.@borgar/xlsx-convertbumped to 5.2.0, picking up an XLSX color/theme parsing fix that surfaced throughModel.fromXlsxin an add-ins consumer (undefined is not an object (evaluating 'readColor(elm.children[0], …)')).
v16.0.1
Section titled “v16.0.1”API changes
Section titled “API changes”- Removed the
NamedStyleandStylere-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/typesdirectly. Type-only change with no runtime impact.
Bug fixes
Section titled “Bug fixes”Modelnow emitsaddsheetwhen a sheet is added (previously dropped silently), and no longer emits a spuriousrecalcfor that operation.- Three independent deserialization-fidelity bugs in the binary cache, jointly affecting
autoNoTable-mode roundtrips, are fixed:Workbook._calcModeis restored from the payload (was silently reverting to'auto').Cells._dataTableCells(the data-table-anchor index) is repopulated, soiterDataTableCells()works on deserialized workbooks — unblocking theModel.deferDataTables = truesetter andModel.attachWorkbook’sautoNoTablehandling.Model._deferDataTablesand the deferral cell Sets (cellsToDefer,staleDeferredCells) are now serialized and restored, so a model in deferral mode no longer loses it through a roundtrip.
toJSFcompacts full-row/full-column spill ranges incell.F(A3:XFD3→3:3,B1:B1048576→B:B), eliminating spurious roundtrip diffs when a code path holds an expandedF.- Error subclasses now set their own
namefield, so stack traces,console.log,inspect(), and Sentry display the actual class name (e.g.FormulaSyntaxError) instead of the inheritedError. @jsfkit/typesmoved fromdevDependenciestodependenciesso it is installed transitively when consumersnpm install @grid-is/apiary. The publisheddist/index.d.{ts,cts}references@jsfkit/typesdirectly because those types appear in Apiary’s public API; consumers’ type-checking previously failed unless they happened to depend on@jsfkit/typesfor other reasons.typescriptmoved fromdependenciestodevDependencies. It is only used here as a CLI build tool (tsc --noEmit,tsup); nothing inlib/imports it and the published types do not reference it. There is no public-API reason for consumers to receive Apiary’s pinnedtypescriptversion transitively. Originally added todependenciesduring the apiary monorepo extraction without a deliberate placement choice.
Serialization
Section titled “Serialization”CURRENT_SERIALIZATION_VERSIONbumped 5 → 6 to carry the previously-omittedModel._deferDataTablesboolean and the two deferral cell Sets.MINIMUM_ACCEPTABLE_SERIALIZATION_VERSIONis unchanged — older payloads still load, with the new fields defaulted to off / empty.
Documentation
Section titled “Documentation”- JSF types referenced from the generated API reference (
NamedStyle,Note,Style,Theme,ThemeColorScheme,ThemeCustomColor,ThemeFontCollection,ThreadedComment) now link tojsfkit.github.ioinstead of being mirrored as local Apiary type-alias pages. EvaluateExpressionOptions.cropTois now documented.- Cleaned up a confusing JSF-normalizer docstring.
v16.0.0 (2026-04-30)
Section titled “v16.0.0 (2026-04-30)”Breaking changes
Section titled “Breaking changes”Workbook.viewsis now aViewManager(wasWorkbookView[] | undefined).Workbook.getViews()andWorkSheet.getViews()are removed;WorkSheet.viewsis now@internal. Per-sheet view state is now read/written viaworkbook.views.get(index).getSheetView(sheetName).Workbook.themeis now aThemeManager(always present), notTheme | undefined.WorkSheet.showGridLinesproperty removed; gridline visibility now lives onWorkSheet.views[].showGridLines(per-view).@jsfkit/types1.x → 2.x: colours are now structuredColorobjects instead of hex strings, themes are restructured, and several types are reshaped.Workbook.rowHeight(rowIndex, sheetName)now throwsSheetNotFoundErrorwhen the sheet does not exist (previously returned the default16silently), and consultssheet.defaults.rowHeightbefore falling back to the Excel default. The newWorkbook.columnWidth()follows the same precedence on its axis.WorkSheet.rowHeightsandWorkSheet.colWidthsfields removed. Per-row height and per-column width are now read fromWorkSheet.rowsandWorkSheet.columns(theGridSize[]span arrays).
Removed @deprecated symbols (each deprecation note already pointed at the replacement shown here):
Cell.hasValue()/DefinedName.hasValue()andCell.isBlank()/DefinedName.isBlank()removed. UsehasValueOrFormula().Workbook.getTables()andWorkbook.getTable(name)removed. Useworkbook.tables.getAll()andworkbook.tables.get(name).WorkSheet.getComments()andWorkSheet.getNotes()removed. Useworkbook.comments.get(sheetName)andworkbook.notes.get(sheetName).Model.fromDataremoved. UseModel.fromCsf.Workbook.lazyImportPromise,Model.lazyImportPromise,loadLazy(), and theloadLazyre-export removed. All four were already no-ops; just delete the calls.- A batch of
@deprecated @internalre-exports removed from the package entry point: formula-evaluation helpers (run,errorForCode,errorTable, …) and dependency graph helpers (cellToVertexId,wbNameToKey, …). Usecell.vertexId/definedName.vertexIdinstead ofcellToVertexId(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.)
Features
Section titled “Features”- Views CRUD via
Workbook.views, with two new public typesViewManagerandWorkbookView. - Theme CRUD via
Workbook.theme(newThemeManager): read/write the theme as a whole, the 12-colour scheme, major/minor fonts, and custom colours. - Named-style CRUD via
styleManager.named(newNamedStylescollection), with case-insensitive lookup and original casing preserved onNamedStyle.name. Workbook.reorderSheet(name, newIndex)andWorkbook.copySheet(name, newName?).Tableis now a public type export with new methods (appendRow,insertRow,rename,rowRef) and a newdataRowCountgetter.TableManageris also exported as a type. (The runtime classes are not re-exported: instances come fromworkbook.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. NotesManagerandCommentsManagerare now exported so they show up in the generated public docs.Workbook.toXLSX(outputType?, options?)gains both arguments.outputTypeis'nodebuffer'(default) or'arraybuffer'for browser-compatible XLSX export.options(typed asToXLSXOptions) carries acompressionLevelsetting (DEFLATE 0–9), now defaulting to6, down from9— measurably faster export with negligible size impact on typical XLSX payloads.Workbook.columnWidth(columnIndex, sheetName)— analogous toWorkbook.rowHeight(). Returns the column width in pixels.Workbook.moveCellsandWorkbook.rewriteFormulasaccept an optionalrecalcNow(defaulttrue); passfalseto defer the trailingrecalculate().
API changes
Section titled “API changes”Workbook.editCell()added as the preferred name forwriteCellData()(which stays as a@deprecatedalias). Its parameter type simplifies to plainCellData, which now includes the optionalftfield.- Identifier casing standardized on uppercase
JSF/XLSX:Model.fromJSF,toJSF,csfToJSF,normalizeJSFForComparison,toXLSX,toXLSXFile,validateXLSXFilePath, plus typeXLSXOutputType. The old title-case spellings remain as@deprecatedaliases with identical signatures — no breaking change.
Bug fixes
Section titled “Bug fixes”moveCellsnow 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.Mmerge 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 aModelError. - Iterative calculation now converges correctly when the iterative set contains a spill; previously the calc ran to
maxIterationsevery time and dependents of unchanged spills could be flagged as false-positive circular references. getEntitiesno longer crashes on workbooks containing sheet-scoped defined names.SORTNsilently ignores out-of-bounds sort-column indices instead of returning#VALUE!, matching verified Google Sheets behavior.toJSFpreserves values in merged-cell “ghosts” (non-anchor cells);mergeCellskeeps 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/rowsproperties or on thestable.csf->stable.jsfTable key rename. replaceTableReferencesnow correctly rewrites bare-name references to tables (not just bracketed structured references).- Dynamic dependencies of LAMBDA closures passed to
BYROW/BYCOL/MAP/REDUCE/SCANwithINDIRECT/OFFSET/ANCHORARRAYin the body are now tracked, so edits to referenced cells correctly trigger recalc. - Lambda parameter resolution during reference analysis no longer crashes on
INDIRECT/OFFSETinside directly-called lambdas or nested lambda scopes. toJSFno longer crashes on full-row or full-column spill ranges.rewriteFormulasskips 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 crasheddescribeWorkbookin some cases. - Cells in JSF with error-looking string values (
"#VALUE!","#N/A", …) but no explicitt: 'e'marker are preserved as strings, not coerced to errors.
Performance
Section titled “Performance”- Faster label detection in
describeWorkbookvia cheaper subordinate-style checks (weighted geomean ~23.5% faster, worst-case workbooks up to 43% faster).
Serialization
Section titled “Serialization”CURRENT_SERIALIZATION_VERSIONbumped 3 → 5 over the v16 cycle. The 3 → 4 step was a marker for shape changes that had already landed without a version bump (Tablecsf→jsfkey,cellsWithDynamicDependencies, notes/comments/views/tables), giving consumers that cached v3 payloads a proper signal to invalidate. The 4 → 5 step adds thenamedStylesfield and folds the legacy parallelrowHeights/colWidthsmaps into theWorkSheet.rows/WorkSheet.columnsspan arrays.MINIMUM_ACCEPTABLE_SERIALIZATION_VERSIONstays at 1 — older cached payloads still load.
Documentation
Section titled “Documentation”ModelError.toJSONAPI documentation cleaned up (the raw inferred-return-type property list is gone); the MDN link gets a readable link text.
Dependencies
Section titled “Dependencies”@jsfkit/types^1.4.1→^2.2.0(see Breaking changes for the structural shifts).@borgar/xlsx-convertand@grid-is/jsf2xlsxupgraded 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.
v16.0.0-rc.0 (2026-04-16)
Section titled “v16.0.0-rc.0 (2026-04-16)”First release candidate for the 16.0 major line. Covers the deprecation cleanup, API additions, and fixes landed since v16.0.0-alpha.0.
Breaking changes
Section titled “Breaking changes”All of the following remove symbols that were already @deprecated, with their deprecation notes pointing at the replacement shown here.
Cell.hasValue()/DefinedName.hasValue()andCell.isBlank()/DefinedName.isBlank()removed. UsehasValueOrFormula().Workbook.getTables()andWorkbook.getTable(name)removed. Useworkbook.tables.getAll()andworkbook.tables.get(name).WorkSheet.getComments()andWorkSheet.getNotes()removed. Useworkbook.comments.get(sheetName)andworkbook.notes.get(sheetName).Model.fromDataremoved. UseModel.fromCsf.Workbook.lazyImportPromise,Model.lazyImportPromise,loadLazy(), and theloadLazyre-export removed. All four were already no-ops; just delete the calls.- A batch of
@deprecated @internalre-exports removed from the package entry point: formula-evaluation helpers (run,errorForCode,errorTable, …) and dependency graph helpers (cellToVertexId,wbNameToKey, …). Usecell.vertexId/definedName.vertexIdinstead ofcellToVertexId(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.)
Features
Section titled “Features”- 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(newNamedStylescollection), with case-insensitive lookup and original casing preserved onNamedStyle.name.
API changes
Section titled “API changes”Workbook.editCell()added as the preferred name forwriteCellData()(which stays as a@deprecatedalias). Its parameter type simplifies to plainCellData, which now includes the optionalftfield.- Identifier casing standardized on uppercase
JSF/XLSX:Model.fromJSF,toJSF,csfToJSF,normalizeJSFForComparison,toXLSX,toXLSXFile,validateXLSXFilePath, plus typesXLSXOutputMapandXLSXOutputType. The old title-case spellings remain as@deprecatedaliases with identical signatures — no breaking change.
Bug fixes
Section titled “Bug fixes”moveCellsnow 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.Mmerge 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 aModelError.
Serialization
Section titled “Serialization”CURRENT_SERIALIZATION_VERSIONbumped 3 → 4 as a marker for shape changes that had landed without a version bump (Tablecsf→jsfkey,cellsWithDynamicDependencies, notes/comments/views/tables), giving consumers that cached v3 payloads a proper signal to invalidate.CURRENT_SERIALIZATION_VERSIONbumped 4 → 5 for the named-styles addition.MINIMUM_ACCEPTABLE_SERIALIZATION_VERSIONstays at 1 — older cached payloads still load.
Documentation
Section titled “Documentation”ModelError.toJSONAPI documentation cleaned up (the raw inferred-return-type property list is gone); the MDN link gets a readable link text.
v16.0.0-alpha.0 (2026-04-08)
Section titled “v16.0.0-alpha.0 (2026-04-08)”First alpha of the 16.0 major line. Subject to further breaking changes before the stable release.
Breaking changes
Section titled “Breaking changes”Workbook.viewsis now aViewManager(wasWorkbookView[] | undefined).Workbook.getViews()andWorkSheet.getViews()are removed;WorkSheet.viewsis now@internal. Per-sheet view state is now read/written viaworkbook.views.get(index).getSheetView(sheetName).Workbook.themeis now aThemeManager(always present), notTheme | undefined.WorkSheet.showGridLinesproperty removed; gridline visibility now lives onWorkSheet.views[].showGridLines(per-view).@jsfkit/types1.x → 2.0.0: colours are now structuredColorobjects instead of hex strings, themes are restructured, andGridSizegains an optionalsize.
Features
Section titled “Features”- Views CRUD via
Workbook.views, with two new public typesViewManagerandWorkbookView. - Theme CRUD via
Workbook.theme(newThemeManager): read/write the theme as a whole, the 12-colour scheme, major/minor fonts, and custom colours. Workbook.reorderSheet(name, newIndex)andWorkbook.copySheet(name, newName?).Tableclass is now a public export with new methods (appendRow,insertRow,rename,rowRef) and a newdataRowCountgetter.TableManageris also exported.toXlsxaccepts an optionaloutputTypeargument ('nodebuffer'(default) or'arraybuffer') for browser-compatible XLSX export. New exportsXlsxOutputTypeandXlsxOutputMap.NotesManagerandCommentsManagerare now exported so they show up in the generated public docs.Workbook.moveCellsandWorkbook.rewriteFormulasaccept an optionalrecalcNow(defaulttrue); passfalseto defer the trailingrecalculate().
Bug fixes
Section titled “Bug fixes”getEntitiesno longer crashes on workbooks containing sheet-scoped defined names.SORTNsilently ignores out-of-bounds sort-column indices instead of returning#VALUE!, matching verified Google Sheets behavior.toJsfpreserves values in merged-cell “ghosts” (non-anchor cells);mergeCellskeeps 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/rowsproperties or on thestable.csf->stable.jsfTable key rename. replaceTableReferencesnow correctly rewrites bare-name references to tables (not just bracketed structured references).- Dynamic dependencies of LAMBDA closures passed to
BYROW/BYCOL/MAP/REDUCE/SCANwithINDIRECT/OFFSET/ANCHORARRAYin the body are now tracked, so edits to referenced cells correctly trigger recalc. - Lambda parameter resolution during reference analysis no longer crashes on
INDIRECT/OFFSETinside directly-called lambdas or nested lambda scopes. toJsfno longer crashes on full-row or full-column spill ranges.rewriteFormulasskips 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 crasheddescribeWorkbookin some cases. - Cells in JSF with error-looking string values (
"#VALUE!","#N/A", …) but no explicitt: 'e'marker are preserved as strings, not coerced to errors.
Performance
Section titled “Performance”- Faster label detection in
describeWorkbookvia cheaper subordinate-style checks (weighted geomean ~23.5% faster, worst-case workbooks up to 43% faster).
Dependencies
Section titled “Dependencies”@jsfkit/types^1.4.1->^2.0.0(see Breaking changes).@grid-is/waspiary->1.11.0for structured-reference bare-name rewrite.
v15.5.0 (2026-03-05)
Section titled “v15.5.0 (2026-03-05)”Features
Section titled “Features”- Cell notes CRUD via
NotesManager(workbook.notes):add,get,getByCell,update,delete
Bug fixes
Section titled “Bug fixes”AND/OR/XOR/NOTevaluation with strings and other edge-case arguments, matching Excel and Google Sheets behaviorTEXTJOINandJOINnow apply cell display formats (e.g. date formats) in Google mode
Interface changes
Section titled “Interface changes”These are technically breaking, but very minor and in very recent features, so did not demand a major-version bump.
CommentsManagernow throwsSheetNotFoundError(instead of plainError) for missing sheets, with a differently worded message.WorkSheet.notestype changed toNote[](no longer possibly undefined)
Dependencies
Section titled “Dependencies”- Update
@grid-is/jsf2xlsxto ^1.3.2, updating default column width and fixing extraneousactiveTab="0"attributes inworkbookViewelements.
v15.4.0 (2026-03-02)
Section titled “v15.4.0 (2026-03-02)”Features
Section titled “Features”- Respect ‘autoNoTables’ from XLSX file, plus
deferDataTablesoption for manual control- And more generally, mark any formula cells to be deferred in recalculation
- Threaded comments CRUD via
CommentsManager(workbook.comments)
Bug fixes
Section titled “Bug fixes”MATCHreturned#N/Ainstead of#REF!in Excel missing-sheet edge casetoJsfexport 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
toJsfexport
Performance
Section titled “Performance”- Much faster worst-case
describeWorkbook(label-detection) performance
Documentation
Section titled “Documentation”- Update quickstart to use
Model.fromXlsxFileinstead of manualxlsx-convert
v15.3.1 (2026-02-23)
Section titled “v15.3.1 (2026-02-23)”Bug fixes
Section titled “Bug fixes”- 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
Documentation
Section titled “Documentation”- Add changelog to public docs
v15.3.0 (2026-02-19)
Section titled “v15.3.0 (2026-02-19)”Features
Section titled “Features”- Excel data tables
- Function
SORTN getViewsmethod inWorkSheetandWorkbook- Google Sheets
FLATTENfunction - Merge/unmerge cells
Bug fixes
Section titled “Bug fixes”- Make
HYPERLINK()-derived hyperlinks ephemeral - Preserve external workbooks in JSF roundtrip
- Update comment and note cell refs on move, insert, and delete
- Wrap
fs/promisesimports in try-catch to avoid bundler errors
Performance
Section titled “Performance”- Speed up
describeWorkbookby pre-filteringparseDatecalls
Documentation
Section titled “Documentation”- Pare down public API, marking stuff
@deprecatedand/or@internal - Use code blocks in Typedoc-generated docs
v15.2.0 (2026-02-10)
Section titled “v15.2.0 (2026-02-10)”Features
Section titled “Features”- Support JSF cell notes and threaded comments
Bug fixes
Section titled “Bug fixes”describeWorkbookcrash on cross-workbook ref to formula cell- Support
QUERYwithCOUNT(DISTINCT value)
v15.1.1 (2026-02-10)
Section titled “v15.1.1 (2026-02-10)”Bug fixes
Section titled “Bug fixes”- Missed dynamic dependencies in lambda-calling functions at init time
- Preserve cells with explicit empty styles through round-trip
- Strip
numberFormatFromFormulafrom exported styles intoJSF
v15.1.0 (2026-02-04)
Section titled “v15.1.0 (2026-02-04)”Features
Section titled “Features”toJsftoXlsx- Add
fromXlsxmethods for direct XLSX loading - Native
QUERYwithoutpg-mem(calling it “feat” because it supports a lot that the old one did not) - Output style indexes on rows and columns
Bug fixes
Section titled “Bug fixes”- Real workbooks override external workbooks with same name
- Fix invariant error on insert after row is deleted
- Export
ftproperty intoCSFfor array formulas - Init recalc was skipped if
!recalcVolatiles && !recalcErrors - Load XLSX files in Excel mode by default
- Respect
recalcVolatilesoption during initial recalculation - Preserve text strings that look like errors in JSF loading
ERROR.TYPEdid not support modern error codesdescribeWorkbookthrows on JSF workbook with externals- Upgrade
xlsx-convertto 3.6.4 for bugfixes - Fix
handlerRelsto work with absolute paths - Fix external refs order
- The
rproperty on cells is optional
Breaking changes
Section titled “Breaking changes”- Remove
Flagsmodule andflagsexport
v15.0.0 (2026-01-14)
Section titled “v15.0.0 (2026-01-14)”Features
Section titled “Features”- Public
Model.attachWorkbook, and documentaddWorkbookas just a wrapper - Export
StyleManager - Export
CellDatatype - Add support for JSF workbook/worksheet view props
- Specific
Errorsubclass for invalid reference strings - Add missing detail messages on
#CALC!errors
Bug fixes
Section titled “Bug fixes”- Google-mode early-date date function discrepancies
Matrix.expandmakes fully-populated matrices, causing performance disasters- Nonresolving name in
LOOKUPvector arg borks reference analysis - Propagate
markDirtyto all dependents of spill ranges - Blank spill anchor missing in
Cells.getCells - Don’t propagate recalc from unchanged spill matrix
numberFormatFromFormulapropagationSUMIFSetc. wrong forMatrixwith defaulted regions- Incorrect swap in Brent root-finding setup
QUERYwithnow()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
Tableserialization property name mismatch - Fix serialization invariant violation
- Fix errors in
toCSFexport structures - Fix GSDV spill range inference: use offset not absolute row
- Fix regression in
evaluateExpression - Preserve CSF style array when loading workbooks
Performance
Section titled “Performance”- Add
vertexIdtoCellandDefinedName - Non-volatile
OFFSETandINDIRECTandANCHORARRAYwith dynamic dependencies
Breaking changes
Section titled “Breaking changes”- CSF type should have
filename, notname - Change
NameReference.widthand.heightto beundefined, not throw
Dependencies
Section titled “Dependencies”- Update
fxto 5.0 - Upgrade Waspiary to 1.10.0 to permit
RandCnames
v15.0.0-rc3 (2026-01-08)
Section titled “v15.0.0-rc3 (2026-01-08)”Features
Section titled “Features”- Add missing detail messages on
#CALC!errors - Export
CellDatatype - Specific
Errorsubclass for invalid reference strings - Add support for JSF workbook/worksheet view props
- Preserve CSF style array when loading workbooks
Bug fixes
Section titled “Bug fixes”- GSDV blocker in extended range should not block other columns
numberFormatFromFormulapropagationSUMIFSetc. wrong forMatrixwith defaulted regions- Incorrect swap in Brent root-finding setup
QUERYwithnow()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
Tableserialization property name mismatch - Fix serialization invariant violation
- Fix errors in
toCSFexport structures
v15.0.0-rc2 (2025-12-10)
Section titled “v15.0.0-rc2 (2025-12-10)”Bug fixes
Section titled “Bug fixes”- Blank spill anchor missing in
Cells.getCells - Don’t propagate recalc from unchanged spill matrix
- Fix regression in
evaluateExpression - CSF type should have
filename, notname
Performance
Section titled “Performance”- Non-volatile
OFFSETandINDIRECTandANCHORARRAYwith dynamic dependencies
v15.0.0-rc1 (2025-12-08)
Section titled “v15.0.0-rc1 (2025-12-08)”Features
Section titled “Features”- Public
Model.attachWorkbook, and documentaddWorkbookas just a wrapper - Export
StyleManager
Bug fixes
Section titled “Bug fixes”- Google-mode early-date date function discrepancies
Matrix.expandmakes fully-populated matrices, causing performance disasters- Non-resolving name in
LOOKUPvector arg borks reference analysis - Propagate
markDirtyto all dependents of spill ranges - Fix default column-width units discrepancy
Performance
Section titled “Performance”- Add
vertexIdtoCellandDefinedName
Breaking changes
Section titled “Breaking changes”- Change
NameReference.widthand.heightto beundefined, not throw
Dependencies
Section titled “Dependencies”- Update
fxto 5.0
v14.13.0 (2025-11-19)
Section titled “v14.13.0 (2025-11-19)”Features
Section titled “Features”- Read JSF directly
Bug fixes
Section titled “Bug fixes”- 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/HLOOKUPcan return non-up-to-date value- Direct call to
UPLUSfails with internal error - Recalculate affected formulas if
clearGsdvclears cells
Breaking changes
Section titled “Breaking changes”- Remove
resetvalue fromDefinedNameandCellInterface
Dependencies
Section titled “Dependencies”- Switch to
@jsfkit/typesfor JSF type definitions
- Install from, and publish to, npmjs.com registry
v14.12.0 (2025-10-17)
Section titled “v14.12.0 (2025-10-17)”Breaking changes
Section titled “Breaking changes”- Make
FormulaErrorandReferencefully immutable
Features
Section titled “Features”- Store origin cell in
FormulaError - Add and improve error-value detail messages
- Add detail messages to
#SPILL!errors
Bug fixes
Section titled “Bug fixes”- Make
Cell.isBlank()closer to what its name implies - Minor bugs in reference intersection and add a test
- Rename and deprecate
Cellmethods
Documentation
Section titled “Documentation”- Deploy public API docs to GitHub Pages site
- Remove internal stuff from docs
- Mention case-insensitivity in name parameters
v14.11.0 (2025-10-15)
Section titled “v14.11.0 (2025-10-15)”Features
Section titled “Features”- Recalculate error-valued cells at init time
- Remove defined name
Bug fixes
Section titled “Bug fixes”- Wrong spill-operator result for blocked spill
QUERYcoerces dates to string by local timezone- Support structured references in
INDIRECT IFresult should not be marked dynamic- Make apiary bin work again
v14.10.1 (2025-10-01)
Section titled “v14.10.1 (2025-10-01)”Features
Section titled “Features”- Allow disabling common-subexpression extraction
Bug fixes
Section titled “Bug fixes”- Fix 1904 epoch bug when converting JSF to CSF
v14.10.0 (2025-09-25)
Section titled “v14.10.0 (2025-09-25)”Features
Section titled “Features”- Export
FormulaSyntaxErrorandEvaluationError - Add
Model.empty()convenience method - Export recalculation option symbols
Bug fixes
Section titled “Bug fixes”ADDRESSwith invalid coordinates yields wrong results or throws exception- Use source number format in
TO_TEXT - Set number format in
TO_*functions XLOOKUPthird argument wrongly forced up-to-dateROWetc. fail to update when name ref updates- False-pos circdep in
SUMIF/AVERAGEIFon target range extension Workbook.iterFormulaCellshad a bug and a redundant sibling- Update JSF support
Documentation
Section titled “Documentation”- Add a quick start guide
- Add Starlight-based documentation system
- Add tutorial for creating a spreadsheet from scratch
- Document some methods on the
Modelclass
v14.9.5 (2025-09-01)
Section titled “v14.9.5 (2025-09-01)”Features
Section titled “Features”- Add support for loading and converting JSF format
v14.9.3 (2025-08-12)
Section titled “v14.9.3 (2025-08-12)”Bug fixes
Section titled “Bug fixes”CONVERTfailed to handle reference value argument
Dependencies
Section titled “Dependencies”- Bump
fxfrom 4.11.2 to 4.12.0 [bot] - Bump
msgpackrfrom 1.11.4 to 1.11.5 [bot]
v14.9.2 (2025-07-23)
Section titled “v14.9.2 (2025-07-23)”Bug fixes
Section titled “Bug fixes”- Fix defined names causing slow iterative calculation
v14.9.1 (2025-07-22)
Section titled “v14.9.1 (2025-07-22)”Version revoked due to incorrect fix.
v14.9.0 (2025-06-27)
Section titled “v14.9.0 (2025-06-27)”- Detect parent labels
v14.8.7 (2025-06-26)
Section titled “v14.8.7 (2025-06-26)”Bug fixes
Section titled “Bug fixes”- Label sequence confusion from sparse values at island top/left
Dependencies
Section titled “Dependencies”- Bump
component-emitterfrom 1.3.0 to 2.0.0 - Upgrade
pg-memto 2.6.15
v14.8.6 (2025-06-12)
Section titled “v14.8.6 (2025-06-12)”Bug fixes
Section titled “Bug fixes”- Leftmost-column data mistaken for a label sequence
v14.8.5 (2025-06-08)
Section titled “v14.8.5 (2025-06-08)”Bug fixes
Section titled “Bug fixes”- Skip over gaps in mixed-type label subsequences
v14.8.4 (2025-06-08)
Section titled “v14.8.4 (2025-06-08)”- Improve island-based label detection