@searsuite/sear-domain-formula-engine
Parse expressions
This package defines the values and service interfaces consumed by formula features. IFormulaParser describes
parsing, IFormulaEvaluator describes evaluation, IDependencyGraph describes recalculation dependencies, and
IFunctionRegistry describes function lookup. The TypeScript implementations live in
@searsuite/sear-domain-formula-engine-ts and are selected through dependency injection.
Use these interfaces when building a plugin or host that must work with a different formula implementation. Use the TypeScript package when you need its concrete parser, evaluator, or built-in functions.
- interfaceIFormulaParser
-
interface IFormulaParserIFormulaParser: unknownmethod extractDependencies(ast: FormulaAST): Dependency[]Extracts all dependencies from an AST.
Traverses all cell and range nodes in the AST and returns a Dependency list. Returned dependencies stay range-level and are not expanded per cell.
Example// =SUM(A1:C100) + D5 extractDependencies(ast) → [ { kind: FormulaNodeKind.Range, start: [0,0], end: [99,2] }, { kind: FormulaNodeKind.Cell, row: 4, col: 3 } ]method parse(formula: string): FormulaASTParses a formula string into an AST.
Input is a formula string with a leading '=', such as "=A1+B1". Uses recursive-descent parsing and supports the full operator precedence.
ReturnsParsed AST.
ThrowsWhen parsing fails because syntax is invalid.
formulaFormula string including the leading '='.
method shiftReferences(ast: FormulaAST, changes: StructureChange[]): FormulaASTShifts references.
Rewrites row/column references inside an AST after structural changes such as row/column insertions and deletions. Uses immutable updates: creates a new AST and never mutates the original AST.
Rules:
- Absolute references ($A$1) are unaffected.
- Relative references shift according to insertion/deletion position.
- Deleted referenced rows/columns produce an AST carrying #REF!.
ExampleA formula =B3 in A2, after inserting one row below row 1, becomes =B4. A formula =SUM(A1:A3) in A4, after deleting row 2, becomes =SUM(A1:#REF!).variablesymbol symbol: typeof symbol - typeBinaryOp
-
type BinaryOp = "+" | "-" | "*" | "/" | "^" | "&" | "=" | "<>" | "<" | ">" | "<=" | ">="Supported binary formula operators.
- typeFormulaAST
-
type FormulaAST = { kind: typeof FormulaNodeKind.Number; value: number } | { kind: typeof FormulaNodeKind.String; value: string } | { kind: typeof FormulaNodeKind.Boolean; value: boolean } | { code: FormulaErrorCode; kind: typeof FormulaNodeKind.Error } | { kind: typeof FormulaNodeKind.Name; name: string } | { items: FormulaAST[]; kind: typeof FormulaNodeKind.Tuple } | { kind: typeof FormulaNodeKind.Intersection; left: FormulaAST; right: FormulaAST } | { kind: typeof FormulaNodeKind.Array; rows: FormulaAST[][] } | { kind: typeof FormulaNodeKind.Missing } | { absCol: boolean; absRow: boolean; col: number; kind: typeof FormulaNodeKind.Cell; row: number } | { absEndCol: boolean; absEndRow: boolean; absStartCol: boolean; absStartRow: boolean; end: [number, number]; kind: typeof FormulaNodeKind.Range; start: [number, number] } | { absCol: boolean; absRow: boolean; col: number; kind: typeof FormulaNodeKind.WorkbookCell; row: number; sheetName: string } | { absEndCol: boolean; absEndRow: boolean; absStartCol: boolean; absStartRow: boolean; end: [number, number]; kind: typeof FormulaNodeKind.WorkbookRange; sheetName: string; start: [number, number] } | { absEndCol: boolean; absStartCol: boolean; endCol: number; kind: typeof FormulaNodeKind.ColumnRange; startCol: number } | { absEndRow: boolean; absStartRow: boolean; endRow: number; kind: typeof FormulaNodeKind.RowRange; startRow: number } | { args: FormulaAST[]; kind: typeof FormulaNodeKind.Call; name: string } | { args: FormulaAST[]; callee: FormulaAST; kind: typeof FormulaNodeKind.Invoke } | { kind: typeof FormulaNodeKind.Binary; left: FormulaAST; op: BinaryOp; right: FormulaAST } | { kind: typeof FormulaNodeKind.Unary; op: UnaryOp; operand: FormulaAST }Serializable formula abstract syntax tree.
- typeFormulaNodeKind
-
type FormulaNodeKind = typeof FormulaNodeKind[keyof typeof FormulaNodeKind]FormulaNodeKind: { Array: "array"; Binary: "binary"; Boolean: "boolean"; Call: "call"; Cell: "cell"; ColumnRange: "columnRange"; Error: "error"; Intersection: "intersection"; … }Type contract carried by the canonical FormulaNodeKind value.
- typeFormulaReferenceNode
-
type FormulaReferenceNode = Extract<FormulaAST, { kind: typeof FormulaNodeKind.Cell | typeof FormulaNodeKind.Range | typeof FormulaNodeKind.WorkbookCell | typeof FormulaNodeKind.WorkbookRange | typeof FormulaNodeKind.RowRange | typeof FormulaNodeKind.ColumnRange }>Reference leaves shared by immutable formula transformations.
- typeUnaryOp
-
type UnaryOp = "-" | "+" | "%" | "NOT"Supported unary formula operators.
Resolve references
- interfaceFormulaCellPosition
-
Position of the formula currently being evaluated.
property readonly col: numberproperty readonly row: numberproperty readonly sheetId?: stringproperty readonly sheetName?: string - interfaceFormulaMetadataCellReference
-
Platform-neutral identity of one cell visible to formula evaluation.
- interfaceFormulaRangeCell
-
One range cell with optional visibility and source metadata.
property readonly col: numberproperty readonly filtered?: booleanproperty readonly formulaName?: stringproperty readonly row: numberproperty readonly source?: "value" | "empty" | "formula"property readonly value: FormulaValue - interfaceFormulaReferenceArgument
-
A function argument that intentionally retains reference identity.
property readonly kind: "reference"property readonly reference: ResolvedFormulaRange - interfaceFormulaReferenceResolutionOptions
-
Options used when resolving text, names, or dynamic references.
- interfaceFormulaReferenceResolver
-
Host-owned resolver for names and text references.
- interfaceFormulaReferenceValue
-
Reference identity returned by reference-preserving functions.
property readonly kind: "reference"property readonly reference: ResolvedFormulaRange - interfaceFormulaSheetMetadata
-
Stable workbook sheet identity and one-based display position.
property readonly id: stringproperty readonly index: numberproperty readonly name: stringproperty readonly visible?: boolean - interfaceFormulaWorkbookMetadata
-
Read-only workbook facts consumed by information formulas.
- interfaceResolvedFormulaRange
-
Concrete finite range resolved against sheet bounds.
property readonly endCol: numberproperty readonly endRow: numberproperty readonly source: FormulaRangeSourceproperty readonly startCol: numberproperty readonly startRow: number - typeCellKey
-
type CellKey = numberNumeric key encoding one cell coordinate.
- typeFormulaRangeSource
-
type FormulaRangeSource = { kind: typeof FormulaRangeSourceKind.CurrentSheet } | { kind: typeof FormulaRangeSourceKind.WorkbookSheet; sheetName: string }Source owner for a resolved formula range.
- typeFormulaRangeSourceKind
-
type FormulaRangeSourceKind = typeof FormulaRangeSourceKind[keyof typeof FormulaRangeSourceKind]FormulaRangeSourceKind: { CurrentSheet: "currentSheet"; WorkbookSheet: "workbookSheet" }Type contract carried by the canonical FormulaRangeSourceKind value.
- typeFormulaReferenceStyle
-
type FormulaReferenceStyle = "A1" | "R1C1"Reference notation accepted by a reference resolver.
- functionmapFormulaReferenceNodes
-
mapFormulaReferenceNodes(ast: FormulaAST, map: (node: FormulaReferenceNode): FormulaAST): FormulaASTTraverses expression containers while preserving unchanged node identities.
Track structural changes
- interfaceIDependencyGraph
-
interface IDependencyGraphIDependencyGraph: unknownproperty readonly pendingCount: numberNumber of dirty formulas still waiting for evaluation.
property readonly size: numberTotal number of formula cells currently in the graph.
method clear(): voidClears all graph data.
method enforceCommandBoundary(isCommandExecuting: (): boolean): voidBinds mutations to the owning editor command dispatch after initialization.
method getDependencies(formulaKey: number): readonly Dependency[]Gets the range-level dependencies owned by one formula cell.
Returned dependencies are defensive copies and must not expose mutable graph internals. Non-formula cells return an empty array.
ReturnsRange-level Dependency list used by the formula.
formulaKeyCellKey for the formula cell.
method getDependents(key: number): number[]Gets every formula that depends on one cell.
Uses three reverse-lookup indexes:
- Per-cell reverse dependencies (cellRevDeps) — O(1)
- Column-grouped interval lookup (columnRanges) — O(log N + K)
- Overflow-list linear scan (overflowRanges) — O(M)
ReturnsCellKeys for all formulas that depend on that cell.
keyCellKey for the referenced cell.
method getFormulaKeys(): readonly number[]Gets formula cells currently registered in the graph.
The returned array is a stable snapshot for diagnostics and host status views. Mutating it must not affect graph internals.
ReturnsCellKeys for every formula cell with registered dependencies.
method getLastCycleKeys(): number[]Cycle nodes detected by the last markDirty call.
Formulas in a cycle should display the #REF! error. markDirty detects cycles by topological elimination: repeatedly remove ready nodes; the remaining nodes are part of cycles.
method getNextReadyBatch(viewport: Set<number>, maxCount: number): number[]Gets currently dirty formulas that can be evaluated immediately.
"Ready" means all dependencies for the formula are clean and there are no dirty dependencies. Viewport formulas are returned first so visible results update before off-screen ones.
ReturnsCellKeys for formulas that can be evaluated immediately.
viewportCellKeys currently inside the viewport.
maxCountMaximum number of formulas to return.
method isDirty(key: number): booleanReports whether one formula cell is currently dirty.
Non-formula cells and clean formula cells return false.
ReturnsTrue when the formula is waiting for recalculation.
keyCellKey for the formula to inspect.
method markClean(key: number): voidMarks one formula clean after evaluation completes.
Unlocks downstream dependencies by decrementing dirtyDepCount for each dirty formula that depends on key. When dirtyDepCount reaches 0, that formula becomes ready and can be returned by getNextReadyBatch.
keyCellKey for the formula that has finished evaluating.
method markDirty(changedKeys: number[]): voidMarks all affected formulas dirty.
Starts from changedKeys and propagates dirty marks along reverse-dependency edges using BFS. Complexity is O(affected formulas + edges), with no topological sort.
Cycle detection records nodes inside the cycle in lastCycleKeys, which can be read through getLastCycleKeys().
changedKeysCellKeys for cells whose values changed.
method onStructureChanged(changes: StructureChange[]): voidNotifies the graph about structural changes.
Called for row/column insertions and deletions, and updates range coordinates in spatial indexes. Large change sets may choose lazy rebuilds by clearing indexes and rebuilding on the next query.
changesStructural change list.
method removeCell(formulaKey: number): voidRemoves one formula cell.
Clears the formula's:
- forward dependencies (deps Map)
- reverse indexes (cellRevDeps + columnRanges + overflowRanges)
- dirty state (dirtySet + dirtyDepCount)
method updateCell(formulaKey: number, deps: Dependency[]): voidRegisters or updates dependencies for one formula cell.
deps is a range-level Dependency list and is not expanded per cell. Existing formula-cell dependencies are removed before the new set is registered.
formulaKeyCellKey for the formula cell.
depsRange-level Dependency list used by the formula.
variablesymbol symbol: typeof symbol - interfaceFormulaRangeMove
-
Inclusive source bounds and displacement for reference-preserving cell movement.
property readonly columnOffset: numberproperty readonly end: readonly [number, number]property readonly includeUnqualified?: booleanFalse when inspecting qualified references from a different sheet.
property readonly rowOffset: numberproperty readonly sheetName?: stringWhen supplied, qualified references to this sheet also follow the move.
property readonly start: readonly [number, number] - interfaceFormulaStructureMoveOptions
-
Selects the reference namespace rewritten by a structure permutation.
property readonly includeUnqualified?: booleanproperty readonly sheetName?: string - interfaceShiftedStructureCoordinate
-
Result of shifting one coordinate through structure changes.
property readonly deleted: booleanproperty readonly value: number - interfaceStructureMoveChange
-
Formula-aware row or column move.
- typeDependency
-
type Dependency = { col: number; kind: typeof FormulaNodeKind.Cell; row: number } | { end: [number, number]; kind: typeof FormulaNodeKind.Range; start: [number, number] } | { col: number; kind: typeof FormulaNodeKind.WorkbookCell; row: number; sheetName: string } | { end: [number, number]; kind: typeof FormulaNodeKind.WorkbookRange; sheetName: string; start: [number, number] } | { endCol: number; kind: typeof FormulaNodeKind.ColumnRange; startCol: number } | { endRow: number; kind: typeof FormulaNodeKind.RowRange; startRow: number }Formula dependency preserving cell and range reference semantics.
- typeFormulaDynamicDependencyRegistrar
-
type FormulaDynamicDependencyRegistrar = (reference: ResolvedFormulaRange): voidCallback used to publish dynamic formula dependency edges.
- typeStructureChange
-
type StructureChange = StructureInsertDeleteChange | StructureMoveChange - typeStructureChangeAxis
-
type StructureChangeAxis = typeof StructureChangeAxis[keyof typeof StructureChangeAxis]StructureChangeAxis: { Col: "col"; Row: "row" }Type contract carried by StructureChangeAxis.
- typeStructureChangeKind
-
type StructureChangeKind = typeof StructureChangeKind[keyof typeof StructureChangeKind]StructureChangeKind: { Delete: "delete"; Insert: "insert"; Move: "move" }Type contract carried by StructureChangeKind.
- typeStructureChangeType
-
type StructureChangeType = MatrixOTActionName.RowInsert | MatrixOTActionName.RowDelete | MatrixOTActionName.RowMove | MatrixOTActionName.ColInsert | MatrixOTActionName.ColDelete | MatrixOTActionName.ColMoveMatrix structure action understood by formula reference transforms.
- variableFormulaStructureChangeActionNames
-
FormulaStructureChangeActionNames: readonly StructureChangeType[]Matrix OT action names that participate in formula reference rebasing.
- functionassertSupportedStructureChange
-
assertSupportedStructureChange(change: StructureChange): voidValidates indices on a formula structure change before rebasing.
- functiongetStructureChangeAxis
-
getStructureChangeAxis(change: StructureChange): StructureChangeAxis | undefinedReturns the axis affected by one structure change.
- functiongetStructureChangeKind
-
getStructureChangeKind(change: StructureChange): StructureChangeKind | undefinedReturns whether one structure change inserts, deletes, or moves coordinates.
- functionmatrixOperationsToStructureChanges
-
matrixOperationsToStructureChanges(operations: readonly OTOperation[]): StructureChange[]Converts Matrix OT operations into formula structure changes.
- functionmatrixOperationToStructureChange
-
matrixOperationToStructureChange(operation: OTOperation): StructureChange | nullConverts one Matrix OT structure operation into a formula structure change.
- functionmoveFormulaReferences
-
moveFormulaReferences(ast: FormulaAST, move: FormulaRangeMove): FormulaASTMoves referenced identities, including absolute references, without rebasing unrelated references.
- functionreorderFormulaReferences
-
reorderFormulaReferences(ast: FormulaAST, changes: readonly StructureMoveChange[], options?: FormulaStructureMoveOptions): FormulaASTReorders reference identities (including absolute references) through the entire permutation.
- functionshiftStructureCoordinate
-
shiftStructureCoordinate(input: { absolute?: boolean; axis: StructureChangeAxis; changes: readonly StructureChange[]; coordinate: number }): ShiftedStructureCoordinateShifts one coordinate through formula structure changes.
Evaluate formulas
- interfaceIFormulaEvaluator
-
interface IFormulaEvaluatorIFormulaEvaluator: unknownmethod evaluate(ast: FormulaAST, context: EvalContext): FormulaValueEvaluates one AST.
Recursively traverses the AST, performs operations, and handles error propagation:
- Any FormulaError operand -> result is that error.
- Division by zero -> #DIV/0!.
- Type mismatch -> #VALUE!.
- Unknown function name -> #NAME?.
ReturnsCalculated result.
astParsed formula AST.
contextEvaluation context that provides cell-value reads.
method evaluateBatch(asts: { ast: FormulaAST; key: number }[], context: EvalContext): EvalResult[]Batch evaluation.
The TS implementation can call evaluate one by one. A WASM implementation can process all ASTs on the Rust side in one pass, avoiding 100K JS <-> WASM boundary crossings.
ReturnsEvaluation result list.
astsAST list to evaluate; each item contains a CellKey and its AST.
contextEvaluation context.
method registerFunction(fn: FormulaFunction): voidRegisters a custom function.
After registration, formulas can call the function by name. For example, registering AVERAGE allows =AVERAGE(A1:A10).
variablesymbol symbol: typeof symbol - interfaceIFunctionRegistry
-
interface IFunctionRegistryIFunctionRegistry: unknownmethod enforceCommandBoundary(isCommandExecuting: (): boolean, dispatchRemoval: (id: number): void): voidRequires post-initialization writes to occur during the owning editor's command dispatch.
method get(name: string): FormulaFunction | undefinedGets a function definition by name.
ReturnsFunction definition, or undefined when it is not registered.
nameFunction name, case-insensitive.
method has(name: string): booleanChecks whether a function has been registered.
nameFunction name, case-insensitive.
method list(): string[]Lists all registered function names.
ReturnsFunction names in uppercase.
method register(fn: FormulaFunction): (): voidRegisters a formula function.
fnFunction definition; name is stored in uppercase automatically.
method registerMany(functions: readonly FormulaFunction[]): (): voidRegisters a group of formula functions and publishes one combined change notification.
functionsFunction definitions in registration precedence order.
method subscribe(listener: (functionNames: readonly string[]): void): (): voidSubscribes to registrations and removals that can change formula results.
method unregisterRegistration(id: number): voidRemoves one tokenized registration; disposal may dispatch an owner command.
variablesymbol symbol: typeof symbol - interfaceFormulaFunction
-
Runtime contract implemented by built-in and third-party formula functions.
property allowReferencesOutsideHostShape?: booleanPass reference coordinates to the function even when outside the host's materialized sheet shape.
property descriptor?: FormulaFunctionDescriptorproperty lazy?: booleanproperty name: stringproperty namedConstants?: Readonly<Record<string, FormulaValue>>property volatile?: booleanmethod evaluate(args: FormulaArg[], context: EvalContext): FormulaValuemethod incrementalUpdate(prevResult: FormulaValue, changedCells: CellChange[], args: FormulaAST[], context: EvalContext): FormulaValue - interfaceIAggregationCache
-
interface IAggregationCacheIAggregationCache: unknownmethod clear(): voidClears all caches.
method enforceCommandBoundary(isCommandExecuting: (): boolean): voidBinds cache writes to the owning editor command dispatch after initialization.
method getCount(startRow: number, startCol: number, endRow: number, endCol: number): numberGets the COUNT for a range, meaning the number of numeric cells.
Uses the same cache and incremental strategy as getSum.
method getSum(startRow: number, startCol: number, endRow: number, endCol: number): numberGets the SUM for a range.
Cache hit returns directly in O(1). Cache miss requires a full O(N) scan on the first call.
Called by FormulaEvaluator while evaluating SUM, not exposed directly to users.
startRowStart row (0-based).
startColStart column (0-based).
endRowEnd row (0-based).
endColEnd column (0-based).
method onCellChanged(row: number, col: number, oldVal: FormulaValue, newVal: FormulaValue): voidNotifies the cache that one cell value changed.
Finds every cached range covering the cell and updates incrementally:
- newSum = oldSum - oldVal + newVal
- FormulaError oldVal/newVal values are treated as non-numeric and do not affect sum.
rowChanged row (0-based).
colChanged column (0-based).
oldValPrevious value.
newValNew value.
method onStructureChanged(): voidNotifies the cache that rows or columns were inserted or deleted.
Structural changes invalidate all range caches because range coordinates have changed, so the cache must be cleared.
method setCount(startRow: number, startCol: number, endRow: number, endCol: number, count: number): voidStores a successfully calculated COUNT for a rectangular range.
method setSum(startRow: number, startCol: number, endRow: number, endCol: number, sum: number): voidStores a successfully calculated SUM for a rectangular range.
variablesymbol symbol: typeof symbol - interfaceIFormulaCalculationTraceProvider
-
interface IFormulaCalculationTraceProviderIFormulaCalculationTraceProvider: unknownRead-only subscription provider for formula calculation trace events.
Hosts should subscribe through the command surface, while plugins can inject this provider directly during the editor lifecycle. Events are local runtime trace and do not participate in OT or persistence.
method subscribeFormulaCalculationTrace(listener: FormulaCalculationTraceListener): (): voidSubscribes to formula calculation trace events for one editor instance.
ReturnsFunction that removes the listener; calling it more than once is safe.
listenerCallback invoked for future calculation trace events.
variablesymbol symbol: typeof symbolDI token for resolving IFormulaCalculationTraceProvider.
- interfaceIFormulaIterationSettingsProvider
-
interface IFormulaIterationSettingsProviderIFormulaIterationSettingsProvider: unknownOptional editor-local provider for circular formula calculation.
method getSettings(): FormulaIterationSettingsvariablesymbol symbol: typeof symbol - classFormulaFunctionArguments
-
Public coercion and argument-reading SDK for built-in and third-party formula functions.
constructor FormulaFunctionArguments(args: readonly FormulaArg[], context: EvalContext): FormulaFunctionArgumentsmethod boolean(index: number, fallback?: boolean): boolean | FormulaErrorReads a boolean argument from booleans, numbers, or TRUE/FALSE text.
method integer(index: number, fallback?: number): number | FormulaErrorReads a truncated integer argument.
method isMissing(index: number): booleanReturns whether an argument was omitted.
method number(index: number, fallback?: number): number | FormulaErrorReads and coerces one argument to a finite number.
method reference(index: number): FormulaError | ResolvedFormulaRangeReads a reference argument without materializing it.
method text(index: number, fallback?: string): string | FormulaErrorReads and coerces one argument to text using spreadsheet-compatible scalar rules.
method value(index: number): FormulaValueReads one scalar argument while preserving formula errors.
- interfaceEvalContext
-
Host-provided services and data readers used during formula evaluation.
property aggregationCache?: IAggregationCacheproperty arrayFormulaMode?: "dynamic" | "legacy"property budget?: FormulaEvaluationBudgetproperty currentCell?: FormulaCellPositionproperty dateSystem?: FormulaDateSystemproperty dateTimeLocale?: FormulaDateTimeLocaleproperty externalServices?: FormulaExternalServiceReaderproperty formulaSource?: IFormulaSourceProviderproperty languageService?: FormulaLanguageServiceproperty metadata?: FormulaMetadataReaderproperty phoneticReader?: FormulaPhoneticReaderproperty referenceResolver?: FormulaReferenceResolverproperty registerDynamicDependency?: FormulaDynamicDependencyRegistrarproperty scope?: FormulaEvaluationScopeproperty textLocale?: FormulaTextLocaleproperty xmlXPath?: XmlXPathEvaluatormethod currentDateTime(): numbermethod evaluateArrayFormula(ast: FormulaAST, scope?: FormulaEvaluationScope): FormulaValuemethod evaluateFormula(ast: FormulaAST, scope?: FormulaEvaluationScope): FormulaValuemethod forFormulaCell(cell: FormulaCellPosition): EvalContextmethod getCellValue(row: number, col: number): FormulaValuemethod getSheetShape(): [rowCount: number, colCount: number]method getWorkbookCellValue(sheetName: string, row: number, col: number): FormulaValuemethod isCellInBounds(row: number, col: number): booleanmethod isCellOccupied(row: number, col: number): booleanmethod iterateRange(startRow: number, startCol: number, endRow: number, endCol: number): Iterable<FormulaValue>method iterateRangeCells(startRow: number, startCol: number, endRow: number, endCol: number): Iterable<FormulaRangeCell>method iterateWorkbookRange(sheetName: string, startRow: number, startCol: number, endRow: number, endCol: number): Iterable<FormulaValue>method iterateWorkbookRangeCells(sheetName: string, startRow: number, startCol: number, endRow: number, endCol: number): Iterable<FormulaRangeCell>method random(): numbermethod readReference(reference: ResolvedFormulaRange): FormulaValue - interfaceEvalResult
-
One result produced during formula batch evaluation.
property key: numberproperty value: FormulaValue - interfaceFormulaCalculationTraceEventBase
-
Shared metadata attached to every calculation trace event.
property readonly sequence: number - interfaceFormulaEvaluationBudget
-
Host-neutral execution budget for formula evaluation.
property readonly maxSteps: numbermethod consumeStep(): boolean - interfaceFormulaEvaluationScope
-
Lexical scope for formula-local names.
- interfaceFormulaFunctionDescriptor
-
Versioned presentation-neutral formula function metadata.
property readonly category: stringproperty readonly example: stringproperty readonly externalServices?: readonly string[]property readonly maxArguments?: numberAuthoritative upper argument bound. Omit for variadic or illustrative signatures.
property readonly minArguments?: numberAuthoritative lower argument bound. Omit when a signature is illustrative only.
property readonly parameters: readonly FormulaFunctionParameterDescriptor[]property readonly returnKind?: "array" | "scalar" | "scalar-or-array"property readonly summary: stringproperty readonly version: 1 - interfaceFormulaFunctionParameterDescriptor
-
One function parameter exposed to formula-authoring tools.
property readonly accepts?: readonly FormulaFunctionArgumentKind[]property readonly description: stringproperty readonly name: stringproperty readonly optional?: booleanproperty readonly repeating?: boolean - interfaceFormulaIterationSettings
-
Per-editor calculation policy for circular formula dependencies.
- typeFormulaCalculationTraceEvent
-
type FormulaCalculationTraceEvent = FormulaBatchFlushedEvent | FormulaRecalculationCompletedEvent | FormulaErrorChangedEvent | FormulaDependenciesChangedEventFormula calculation trace event union.
- typeFormulaCalculationTraceEventPayload
-
type FormulaCalculationTraceEventPayload = conditionalTrace event payload before the provider assigns its sequence number.
- typeFormulaCalculationTraceListener
-
type FormulaCalculationTraceListener = (event: FormulaCalculationTraceEvent): voidListener invoked synchronously for calculation trace events.
- typeFormulaFunctionArgumentKind
-
type FormulaFunctionArgumentKind = "any" | "number" | "text" | "boolean" | "cell" | "range" | "array" | "reference" | "function" | "rich"Coarse argument kinds stable across formula-engine implementations.
- variableFormulaCalculationTraceEventType
-
FormulaCalculationTraceEventType: { BatchFlushed: "formula.batchFlushed"; DependenciesChanged: "formula.dependenciesChanged"; ErrorChanged: "formula.errorChanged"; RecalculationCompleted: "formula.recalculationCompleted" }Stable formula calculation trace event ids.
Formula values and errors
FormulaAST is the parsed expression. FormulaValue is the result a function or evaluator can return;
FormulaArg represents an argument passed to a function. References and ranges use the FormulaReference*
and FormulaRange* contracts, so a function can read cells without owning the Sheet document.
If you are implementing a function, start with FormulaFunction and EvalContext. If you are integrating an
evaluator, start with IFormulaEvaluator and the reference-resolution contracts.
- interfaceCellChange
-
Value transition for one formula-visible cell.
property col: numberproperty key: numberproperty newVal: FormulaValueproperty oldVal: FormulaValueproperty row: number - interfaceFormulaError
-
Serializable formula error value.
property code: FormulaErrorCodeproperty kind: "error" - interfaceFormulaText
-
Text value carrying an explicit numeric coercion policy.
- interfaceFormulaTupleValue
-
Tuple expression preserving the identity of its items.
property readonly items: readonly FormulaValue[]property readonly kind: "tuple" - typeErrorCode
-
type ErrorCode = FormulaErrorCodeStandard Excel-compatible error code.
- typeFormulaArg
-
type FormulaArg = { kind: "value"; sourceAst?: FormulaAST; sourceKind?: FormulaNodeKind; value: FormulaValue } | { ast: FormulaAST; kind: "expression" } | { kind: "missing" } | { col: number; kind: typeof FormulaNodeKind.Cell; row: number } | { end: [number, number]; kind: typeof FormulaNodeKind.Range; start: [number, number] } | { col: number; kind: typeof FormulaNodeKind.WorkbookCell; row: number; sheetName: string } | { end: [number, number]; kind: typeof FormulaNodeKind.WorkbookRange; sheetName: string; start: [number, number] } | { endCol: number; kind: typeof FormulaNodeKind.ColumnRange; startCol: number } | { endRow: number; kind: typeof FormulaNodeKind.RowRange; startRow: number } | FormulaReferenceArgumentFunction argument preserving lazy reference and expression semantics.
- typeFormulaArray
-
type FormulaArray = FormulaValue[][]Rectangular two-dimensional formula result represented as nested rows.
- typeFormulaErrorCode
-
type FormulaErrorCode = typeof FormulaErrorCode[keyof typeof FormulaErrorCode]FormulaErrorCode: { DivisionByZero: "#DIV/0!"; Name: "#NAME?"; NotAvailable: "#N/A"; NullIntersection: "#NULL!"; Number: "#NUM!"; Reference: "#REF!"; Spill: "#SPILL!"; Value: "#VALUE!" }Type contract carried by the canonical FormulaErrorCode value.
- typeFormulaRichResult
-
type FormulaRichResult = FormulaHyperlinkResult | FormulaImageResultHost-neutral result projected by a formula cell renderer.
- typeFormulaValue
-
type FormulaValue = null | number | string | boolean | FormulaText | FormulaError | FormulaReferenceValue | FormulaTupleValue | FormulaCubeMemberValue | FormulaCubeSetValue | FormulaValue[]Scalar, collection, error, or reference result produced by formulas.
- functioncreateFormulaError
-
createFormulaError<T>(code: T): FormulaError & { code: T }Creates a validated serializable formula error value.
- functionisFormulaArgumentKind
-
isFormulaArgumentKind<K>(arg: FormulaArgumentLike | null | undefined, ...kinds: readonly K[]): argNarrows a formula argument to one or more discriminant kinds.
- functionisFormulaError
-
isFormulaError(value: unknown): valueReturns whether a formula value is an error value.
- functionisFormulaErrorCode
-
isFormulaErrorCode(code: unknown): codeReports whether a runtime value is a canonical formula error code.
Results and status
- interfaceIFormulaResultProvider
-
interface IFormulaResultProviderIFormulaResultProvider: unknownRead-only provider for calculated formula results.
Rendering and other consumers use this interface to read per-client derived formula values without depending on a concrete formula plugin implementation.
method forEachFormulaResultInRange(startRow: number, startColumn: number, endRow: number, endColumn: number, visit: (row: number, column: number): void): voidVisits calculated result coordinates in an inclusive range. Providers that project results into cells without persisted data must implement this so range consumers can discover those cells without probing empty positions.
method getFormulaResult(row: number, col: number): FormulaValue | undefinedGets the calculated result for a formula anchor or one of its dynamic-array spill cells.
ReturnsFormulaValue, or undefined when not calculated or not a formula cell.
rowRow index (0-based).
colColumn index (0-based).
variablesymbol symbol: typeof symbolDI token for resolving IFormulaResultProvider.
- interfaceIFormulaRichResultProvider
-
interface IFormulaRichResultProviderIFormulaRichResultProvider: unknownRead-only provider for non-text visual results produced by formula cells.
method getFormulaRichResult(row: number, col: number): FormulaRichResult | undefinedvariablesymbol symbol: typeof symbol - interfaceIFormulaSourceProvider
-
interface IFormulaSourceProviderIFormulaSourceProvider: unknownRead-only provider for the formula source text shown while editing.
method getFormulaSource(row: number, col: number): string | undefinedGets the formula source that should be presented to the user for one cell.
Providers may return undefined when they do not own the queried cell. The default sheet formula provider returns the persisted formula text, while workbook-aware providers can return display text formatted from stable workbook bindings and the current sheet names.
variablesymbol symbol: typeof symbolDI token for resolving IFormulaSourceProvider.
- interfaceIFormulaStatusProvider
-
interface IFormulaStatusProviderIFormulaStatusProvider: unknownRead-only provider for formula result, source, dependency, and dirty status.
Hosts should prefer the command surface that delegates to this provider, while plugins can inject the provider directly when they run inside the editor lifecycle.
method getFormulaCellStatus(row: number, col: number): FormulaCellStatusGets a stable formula status snapshot for one sheet cell.
ReturnsFormula status with defensive copies of dependency arrays.
rowRow index (0-based).
colColumn index (0-based).
variablesymbol symbol: typeof symbolDI token for resolving IFormulaStatusProvider.
- interfaceFormulaBatchFlushedEvent
-
interface FormulaBatchFlushedEvent extends FormulaCalculationTraceEventBaseEvent emitted when one batch of derived results is flushed.
- interfaceFormulaCellMetadata
-
Read-only cell facts consumed by information formulas.
property readonly formula?: stringproperty readonly locked?: booleanproperty readonly numberFormat?: stringproperty readonly reference: FormulaMetadataCellReferenceproperty readonly source: FormulaCellSourceproperty readonly value: FormulaValueproperty readonly width?: number - interfaceFormulaCellStatus
-
Read-only formula status snapshot for one sheet cell.
property readonly col: numberproperty readonly dependencies: readonly Dependency[]property readonly dependents: readonly number[]property readonly dirty: booleanproperty readonly errorCode: FormulaErrorCode | undefinedproperty readonly formula: string | undefinedproperty readonly isFormulaCell: booleanproperty readonly result: FormulaValue | undefinedproperty readonly row: number - interfaceFormulaDependenciesChangedEvent
-
interface FormulaDependenciesChangedEvent extends FormulaCalculationTraceEventBaseEvent emitted when one formula cell's dependency edges change.
property readonly col: numberproperty readonly dependencies: readonly Dependency[]property readonly key: numberproperty readonly previousDependencies: readonly Dependency[]property readonly row: numberproperty readonly type: "formula.dependenciesChanged" - interfaceFormulaErrorChangedEvent
-
interface FormulaErrorChangedEvent extends FormulaCalculationTraceEventBaseEvent emitted when one formula cell's error code changes.
property readonly col: numberproperty readonly errorCode: FormulaErrorCode | undefinedproperty readonly generation: numberproperty readonly key: numberproperty readonly previousErrorCode: FormulaErrorCode | undefinedproperty readonly row: numberproperty readonly type: "formula.errorChanged" - interfaceFormulaFlushedCellResult
-
One cell result written during a formula batch flush.
property readonly col: numberproperty readonly errorCode: FormulaErrorCode | undefinedproperty readonly key: numberproperty readonly previousResult: FormulaValue | undefinedproperty readonly result: FormulaValueproperty readonly row: number - interfaceFormulaMetadataReader
-
Host-owned, synchronous metadata projection consumed during formula evaluation.
- interfaceFormulaRecalculationCompletedEvent
-
interface FormulaRecalculationCompletedEvent extends FormulaCalculationTraceEventBaseEvent emitted when one recalculation generation completes.
property readonly batchCount: numberproperty readonly flushedCellCount: numberproperty readonly generation: numberproperty readonly pendingCount: 0property readonly type: "formula.recalculationCompleted" - typeFormulaCellSource
-
type FormulaCellSource = "empty" | "value" | "formula"Origin of a persisted cell, kept distinct from its calculated value.
- variableFormulaBatchFlushedEventType
-
FormulaBatchFlushedEventType: "formula.batchFlushed"Stable event id for a formula batch flush.
- variableFormulaDependenciesChangedEventType
-
FormulaDependenciesChangedEventType: "formula.dependenciesChanged"Stable event id for a formula dependency transition.
- variableFormulaErrorChangedEventType
-
FormulaErrorChangedEventType: "formula.errorChanged"Stable event id for a formula error transition.
- variableFormulaRecalculationCompletedEventType
-
FormulaRecalculationCompletedEventType: "formula.recalculationCompleted"Stable event id for formula recalculation completion.
Dates and locales
- interfaceIFormulaDateSystemProvider
-
interface IFormulaDateSystemProviderIFormulaDateSystemProvider: unknownEditor-local source for the workbook date serial system.
method getDateSystem(): FormulaDateSystemvariablesymbol symbol: typeof symbol - interfaceIFormulaLocaleProvider
-
interface IFormulaLocaleProviderIFormulaLocaleProvider: unknownEditor-local locale provider consumed by formula evaluation hosts.
method getDateTimeLocale(): FormulaDateTimeLocaleReturns the current date/time locale strategy for formula functions.
method getTextLocale(): FormulaTextLocaleReturns the current text byte/width locale strategy for formula functions.
variablesymbol symbol: typeof symbolDI token for resolving IFormulaLocaleProvider.
- interfaceIFormulaTextServiceProvider
-
interface IFormulaTextServiceProviderIFormulaTextServiceProvider: unknownOptional editor-local providers for metadata- and service-backed text formulas.
method enforceCommandBoundary(isCommandExecuting: (): boolean, dispatchRemoval: (id: number): void): voidmethod getLanguageService(): FormulaLanguageService | undefinedmethod getPhoneticReader(): FormulaPhoneticReader | undefinedmethod registerLanguageService(service: FormulaLanguageService): (): voidmethod registerPhoneticReader(reader: FormulaPhoneticReader): (): voidmethod subscribeInvalidation(listener: (): void): (): voidmethod unregisterRegistration(id: number): voidvariablesymbol symbol: typeof symbolDI token for host adapters that supply text-formula services.
- interfaceFormulaDateTimeLocale
-
Locale-specific date/time parsing and formatting used by formulas.
- interfaceFormulaDateTimeMeridiemSymbol
-
Locale-specific AM/PM token.
property readonly period: "am" | "pm"property readonly text: string - interfaceFormulaDateTimeMonthSymbol
-
Locale-specific month-name token.
property readonly month: numberproperty readonly text: string - interfaceFormulaDateTimeParseOptions
-
Options passed to locale-aware formula date/time parsers.
- interfaceFormulaDateTimeParseResult
-
Parsed Excel-compatible date/time serial and source components.
- interfaceFormulaDateTimeSymbols
-
Locale-specific symbols consumed by the shared date/time parser.
- interfaceFormulaDateTimeUnitSymbols
-
Locale-specific date-unit tokens.
property readonly day?: readonly string[]property readonly month?: readonly string[]property readonly year?: readonly string[] - interfaceFormulaLanguageService
-
Synchronous cache view for host-managed language services.
- interfaceFormulaPhoneticReader
-
Reads persisted phonetic text without coupling formulas to a cell schema.
- interfaceFormulaTextLocale
-
Locale-specific byte and width transforms for legacy text functions.
property readonly currencySymbol?: stringproperty readonly locale: stringmethod byteLength(text: string): numbermethod calculationModeLabel(mode: "Automatic" | "Manual"): stringmethod characterCode(text: string): numbermethod characterFromCode(code: number): string | undefinedmethod compareText(left: string, right: string): numbermethod findByBytes(text: string, search: string, startByte: number, caseSensitive: boolean): numbermethod formatCurrency(number: number, decimals: number): stringmethod replaceByBytes(text: string, startByte: number, byteLength: number, replacement: string): stringmethod sliceByBytes(text: string, startByte: number, byteLength: number): stringmethod toFullWidth(text: string): stringmethod toHalfWidth(text: string): stringmethod toJis(text: string): string - typeFormulaDateSystem
-
type FormulaDateSystem = typeof FormulaDateSystem[keyof typeof FormulaDateSystem]FormulaDateSystem: { Excel1900: 1900; Excel1904: 1904 }Workbook date serial systems supported by formula evaluation.
- typeFormulaLanguageServiceResult
-
type FormulaLanguageServiceResult = FormulaServiceCacheResult<string>Synchronous result exposed by a host-managed language-service cache.
- variableFormulaLanguageServiceDefinition
-
FormulaLanguageServiceDefinition: FormulaExternalServiceDefinition<FormulaLanguageService>Canonical service identity used by cached language formulas and their hosts.
Add-ins and external services
- interfaceIFormulaExternalServiceProvider
-
interface IFormulaExternalServiceProvider extends FormulaExternalServiceReaderIFormulaExternalServiceProvider: unknownEditor-owned registry used by hosts to publish services and cache invalidation.
method destroy(ownerToken?: object): voidmethod enforceCommandBoundary(isCommandExecuting: (): boolean, dispatchRemoval: (id: number): void): voidmethod enforceTeardownBoundary(ownerToken: object): voidmethod invalidate<T>(definition: FormulaExternalServiceDefinition<T>): voidmethod register<T>(definition: FormulaExternalServiceDefinition<T>, service: T): (): voidmethod subscribeInvalidation(listener: (serviceIds: readonly string[]): void): (): voidmethod unregisterRegistration(id: number): voidvariablesymbol symbol: symbol - interfaceFormulaAddInRegistrationRequest
-
Identifies one procedure exposed by a host-managed add-in.
property readonly module: stringproperty readonly procedure: stringproperty readonly typeText?: string - interfaceFormulaAddInService
-
Host-owned native add-in boundary used by CALL and REGISTER.ID. Implementations must enforce authorization and isolation outside formula evaluation.
- interfaceFormulaDirectAddInCall
-
interface FormulaDirectAddInCall extends FormulaAddInRegistrationRequestInvokes a host-authorized procedure by module signature.
property readonly arguments: readonly FormulaValue[]property readonly kind: "direct"property readonly typeText: string - interfaceFormulaEnvironmentMetadata
-
Optional host facts exposed without leaking platform-native APIs.
property readonly calculationMode?: "Automatic" | "Manual"property readonly directory?: stringproperty readonly operatingSystem?: stringproperty readonly system?: stringproperty readonly version?: string - interfaceFormulaExternalServiceDefinition
-
interface FormulaExternalServiceDefinition<T>Typed identity for one synchronous service view consumed by formulas.
- interfaceFormulaExternalServiceReader
-
Read-only external-service view exposed during formula evaluation.
- interfaceFormulaRegisteredAddInCall
-
Invokes a procedure previously resolved by REGISTER.ID.
property readonly arguments: readonly FormulaValue[]property readonly kind: "registered"property readonly registrationId: number - typeFormulaAddInCall
-
type FormulaAddInCall = FormulaRegisteredAddInCall | FormulaDirectAddInCallSupported host add-in invocation request.
- typeFormulaAddInRegistrationId
-
type FormulaAddInRegistrationId = numberStable numeric handle for one host-authorized add-in procedure.
- typeFormulaServiceCacheResult
-
type FormulaServiceCacheResult = { status: typeof FormulaServiceCacheStatus.Ready; value: T } | { status: typeof FormulaServiceCacheStatus.Pending | typeof FormulaServiceCacheStatus.Unavailable }Synchronous cache result; asynchronous work stays outside formula evaluation.
- variableFormulaAddInServiceDefinition
-
FormulaAddInServiceDefinition: FormulaExternalServiceDefinition<FormulaAddInService>Typed identity used to publish a host-specific add-in implementation.
- variableFormulaServiceCacheStatus
-
FormulaServiceCacheStatus: { Pending: "pending"; Ready: "ready"; Unavailable: "unavailable" }Canonical states of a host-managed formula service cache.
- functiondefineFormulaExternalService
-
defineFormulaExternalService<T>(id: string, options?: Pick<FormulaExternalServiceDefinition<T>, "subscribeInvalidation">): FormulaExternalServiceDefinition<T>Creates a stable external-service definition shared by hosts and plugins.
Cube and pivot services
- interfaceFormulaCubeMemberValue
-
CUBE member or tuple identity with its display caption.
property readonly caption: stringproperty readonly connection: stringproperty readonly expression: stringproperty readonly kind: "cube-member" - interfaceFormulaCubeService
-
Host-owned synchronous OLAP cache view. Loading and connection I/O stay outside evaluation.
- interfaceFormulaCubeSetValue
-
CUBE set identity with its display caption.
property readonly caption: stringproperty readonly connection: stringproperty readonly count?: numberproperty readonly expression: stringproperty readonly kind: "cube-set" - interfaceFormulaPivotDataQuery
-
Query passed to a host-owned pivot data provider.
- interfaceFormulaPivotDataService
-
Host service used by GETPIVOTDATA.
- typeFormulaCubeKpiProperty
-
type FormulaCubeKpiProperty = typeof FormulaCubeKpiProperty[keyof typeof FormulaCubeKpiProperty]FormulaCubeKpiProperty: { KPICurrentTimeMember: 6; KPIGoal: 2; KPIStatus: 3; KPITrend: 4; KPIValue: 1; KPIWeight: 5 }Type contract carried by the canonical FormulaCubeKpiProperty value.
- typeFormulaCubeMemberExpression
-
type FormulaCubeMemberExpression = string | FormulaCubeMemberValue | readonly FormulaCubeMemberExpression[]Serializable member or tuple expression accepted by CUBE services.
- typeFormulaCubeQuery
-
type FormulaCubeQuery = { caption?: string; connection: string; kind: "kpi-member"; kpiName: string; property: FormulaCubeKpiProperty } | { caption?: string; connection: string; expression: FormulaCubeMemberExpression; kind: "member" } | { connection: string; kind: "member-property"; member: FormulaCubeMemberExpression; property: string } | { caption?: string; connection: string; kind: "ranked-member"; rank: number; set: string | FormulaCubeSetValue } | { caption?: string; connection: string; expression: string; kind: "set"; sortBy?: string; sortOrder?: number } | { kind: "set-count"; set: FormulaCubeSetValue } | { connection: string; kind: "value"; members: readonly FormulaCubeMemberExpression[] }Serializable query handled by a host-owned CUBE service.
- typeFormulaCubeResult
-
type FormulaCubeResult = FormulaValue | FormulaCubeMemberValue | FormulaCubeSetValue | FormulaErrorValue returned from a host-owned CUBE service.
- variableFormulaCubeServiceDefinition
-
FormulaCubeServiceDefinition: FormulaExternalServiceDefinition<FormulaCubeService>Typed identity used to publish a host-specific CUBE implementation.
- variableFormulaPivotDataServiceDefinition
-
FormulaPivotDataServiceDefinition: FormulaExternalServiceDefinition<FormulaPivotDataService>Typed identity for the host pivot-data service.
- variableFormulaCubeKpiPropertyValue
-
FormulaCubeKpiPropertyValue: { KPICurrentTimeMember: 6; KPIGoal: 2; KPIStatus: 3; KPITrend: 4; KPIValue: 1; KPIWeight: 5 }Stable CUBE KPI property identifiers.
Web and data services
- interfaceFormulaGoogleRequest
-
Serializable request used by host-backed Google-compatible formulas.
- interfaceFormulaGoogleService
-
Synchronous cache view. Hosts load values outside formula evaluation.
- interfaceFormulaHyperlinkResult
-
Host-neutral hyperlink result projected by a formula renderer.
- interfaceFormulaHyperlinkService
-
Host policy for validating and normalizing hyperlink targets.
- interfaceFormulaImageResource
-
Host-neutral image resource returned by an image loader.
property readonly assetId: stringproperty readonly intrinsicHeight?: numberproperty readonly intrinsicWidth?: numberproperty readonly source: string - interfaceFormulaImageResult
-
Host-neutral image result projected by a formula renderer.
property readonly altText?: stringproperty readonly height?: numberproperty readonly kind: "image"property readonly resource: FormulaImageResourceproperty readonly sizing?: numberproperty readonly width?: number - interfaceFormulaImageService
-
Host-owned image loader used by IMAGE.
- interfaceFormulaRtdKey
-
Stable key used to read one RTD subscription.
property readonly progId: stringproperty readonly server?: stringproperty readonly topics: readonly string[] - interfaceFormulaRtdService
-
Host-owned RTD service.
- interfaceFormulaStockHistoryRequest
-
Normalized request key for a historical market-data lookup.
property readonly endDate?: numberproperty readonly headers: 0 | 1 | 2property readonly interval: 0 | 1 | 2property readonly properties: readonly number[]property readonly startDate: numberproperty readonly stock: string - interfaceFormulaStockHistoryService
-
Synchronous view over historical market data loaded outside formula evaluation.
- interfaceFormulaWebService
-
Synchronous view of HTTP response text loaded explicitly by the host.
- variableFormulaGoogleServiceDefinition
-
FormulaGoogleServiceDefinition: FormulaExternalServiceDefinition<FormulaGoogleService>Host-neutral service identity shared by Google-compatible cached formulas.
- variableFormulaHyperlinkServiceDefinition
-
FormulaHyperlinkServiceDefinition: FormulaExternalServiceDefinition<FormulaHyperlinkService>Typed identity for the host hyperlink service.
- variableFormulaImageServiceDefinition
-
FormulaImageServiceDefinition: FormulaExternalServiceDefinition<FormulaImageService>Typed identity for the host image service.
- variableFormulaRtdServiceDefinition
-
FormulaRtdServiceDefinition: FormulaExternalServiceDefinition<FormulaRtdService>Typed identity for the host RTD service.
- variableFormulaStockHistoryServiceDefinition
-
FormulaStockHistoryServiceDefinition: FormulaExternalServiceDefinition<FormulaStockHistoryService>Stable external-service identity used by STOCKHISTORY and host caches.
- variableFormulaWebLimits
-
FormulaWebLimits: Readonly<{ textLength: 32767; urlLength: 2048 }>Excel limits applied independently of the host's transport/security policy.
- variableFormulaWebServiceDefinition
-
FormulaWebServiceDefinition: FormulaExternalServiceDefinition<FormulaWebService>Shared identity for WEBSERVICE cache registration and recalculation.
No matching API entries.