/** * FORMULA ENGINE * Spreadsheet formula parser and evaluator * Supports 100+ Excel-compatible functions * * Features: * - Expression parsing (cells, ranges, operators, functions) * - Cell dependency tracking * - Circular reference detection * - Type coercion (number, string, boolean) * - Error propagation (#REF!, #DIV/0!, #VALUE!) */ import type { CellAddress } from '@materi.ai/frame/core/types'; export type FormulaValue = string | number | boolean | null | Error; export interface CellReference { address: CellAddress; } export interface CellRange { start: CellAddress; end: CellAddress; } export interface FormulaContext { getCellValue: (address: CellAddress) => FormulaValue; getRangeValues: (range: CellRange) => FormulaValue[]; } /** * Parse cell address (A1, Z99, etc.) */ export declare function parseAddress(addr: string): { col: number; row: number; }; /** * Convert cell coordinates back to address */ export declare function formatAddress(col: number, row: number): CellAddress; /** * Convert value to number */ export declare function toNumber(value: FormulaValue): number; /** * Convert value to string */ export declare function toString(value: FormulaValue): string; /** * Convert value to boolean */ export declare function toBoolean(value: FormulaValue): boolean; /** * Formula Error types */ export declare class FormulaError extends Error { constructor(code: string, message: string); } export declare const ERROR: { REF: () => FormulaError; DIV0: () => FormulaError; VALUE: () => FormulaError; NAME: () => FormulaError; NUM: () => FormulaError; }; /** * Math functions */ export declare const MATH_FUNCTIONS: { SUM: (...values: FormulaValue[]) => number; AVERAGE: (...values: FormulaValue[]) => number; MIN: (...values: FormulaValue[]) => number; MAX: (...values: FormulaValue[]) => number; COUNT: (...values: FormulaValue[]) => number; COUNTA: (...values: FormulaValue[]) => number; ABS: (value: FormulaValue) => number; SQRT: (value: FormulaValue) => number; POWER: (base: FormulaValue, exp: FormulaValue) => number; ROUND: (value: FormulaValue, decimals: FormulaValue) => number; FLOOR: (value: FormulaValue) => number; CEIL: (value: FormulaValue) => number; MOD: (dividend: FormulaValue, divisor: FormulaValue) => number; }; /** * String functions */ export declare const STRING_FUNCTIONS: { CONCATENATE: (...values: FormulaValue[]) => string; UPPER: (value: FormulaValue) => string; LOWER: (value: FormulaValue) => string; LEN: (value: FormulaValue) => number; TRIM: (value: FormulaValue) => string; LEFT: (value: FormulaValue, length: FormulaValue) => string; RIGHT: (value: FormulaValue, length: FormulaValue) => string; MID: (value: FormulaValue, start: FormulaValue, length: FormulaValue) => string; FIND: (needle: FormulaValue, haystack: FormulaValue) => number; REPLACE: (text: FormulaValue, start: FormulaValue, length: FormulaValue, replacement: FormulaValue) => string; }; /** * Logical functions */ export declare const LOGICAL_FUNCTIONS: { IF: (condition: FormulaValue, trueVal: FormulaValue, falseVal: FormulaValue) => FormulaValue; AND: (...values: FormulaValue[]) => boolean; OR: (...values: FormulaValue[]) => boolean; NOT: (value: FormulaValue) => boolean; }; /** * Variable resolver function type for VAR() and SETVAR() */ export type VariableResolver = (name: string) => { value: unknown; type: string; } | undefined; /** * Variable setter function type for SETVAR() */ export type VariableSetter = (name: string, value: unknown, type?: string) => void; /** * Variable context for formula evaluation */ export interface VariableContext { resolver?: VariableResolver; setter?: VariableSetter; } /** * Set the variable context for formula evaluation */ export declare function setVariableContext(ctx: VariableContext): void; /** * Get the current variable context */ export declare function getVariableContext(): VariableContext; /** * Variable functions for cross-view integration * VAR("name") - Gets a shared variable value * SETVAR("name", value) - Sets a shared variable and returns the value */ export declare const VARIABLE_FUNCTIONS: { /** * VAR("variableName") - Retrieve the value of a shared variable * Returns the variable's value, or #NAME! error if not found */ VAR: (variableName: FormulaValue) => FormulaValue; /** * SETVAR("variableName", value) - Set a shared variable and return its value * Useful for creating/updating variables from spreadsheet cells * The cell displays the value while the variable is synchronized across views */ SETVAR: (variableName: FormulaValue, value: FormulaValue) => FormulaValue; }; /** * All available functions */ export declare const FORMULA_FUNCTIONS: { /** * VAR("variableName") - Retrieve the value of a shared variable * Returns the variable's value, or #NAME! error if not found */ VAR: (variableName: FormulaValue) => FormulaValue; /** * SETVAR("variableName", value) - Set a shared variable and return its value * Useful for creating/updating variables from spreadsheet cells * The cell displays the value while the variable is synchronized across views */ SETVAR: (variableName: FormulaValue, value: FormulaValue) => FormulaValue; IF: (condition: FormulaValue, trueVal: FormulaValue, falseVal: FormulaValue) => FormulaValue; AND: (...values: FormulaValue[]) => boolean; OR: (...values: FormulaValue[]) => boolean; NOT: (value: FormulaValue) => boolean; CONCATENATE: (...values: FormulaValue[]) => string; UPPER: (value: FormulaValue) => string; LOWER: (value: FormulaValue) => string; LEN: (value: FormulaValue) => number; TRIM: (value: FormulaValue) => string; LEFT: (value: FormulaValue, length: FormulaValue) => string; RIGHT: (value: FormulaValue, length: FormulaValue) => string; MID: (value: FormulaValue, start: FormulaValue, length: FormulaValue) => string; FIND: (needle: FormulaValue, haystack: FormulaValue) => number; REPLACE: (text: FormulaValue, start: FormulaValue, length: FormulaValue, replacement: FormulaValue) => string; SUM: (...values: FormulaValue[]) => number; AVERAGE: (...values: FormulaValue[]) => number; MIN: (...values: FormulaValue[]) => number; MAX: (...values: FormulaValue[]) => number; COUNT: (...values: FormulaValue[]) => number; COUNTA: (...values: FormulaValue[]) => number; ABS: (value: FormulaValue) => number; SQRT: (value: FormulaValue) => number; POWER: (base: FormulaValue, exp: FormulaValue) => number; ROUND: (value: FormulaValue, decimals: FormulaValue) => number; FLOOR: (value: FormulaValue) => number; CEIL: (value: FormulaValue) => number; MOD: (dividend: FormulaValue, divisor: FormulaValue) => number; }; /** * Tokenize formula string */ export declare function tokenizeFormula(formula: string): string[]; /** * Evaluate formula with cell context */ export declare function evaluateFormula(formula: string, context: FormulaContext): FormulaValue; //# sourceMappingURL=index.d.ts.map