@gridsheet/core 3.0.0-rc.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +28 -0
- package/dist/constants.js.map +1 -0
- package/dist/formula/evaluator.d.ts +134 -0
- package/dist/formula/evaluator.d.ts.map +1 -0
- package/dist/formula/evaluator.js +585 -0
- package/dist/formula/evaluator.js.map +1 -0
- package/dist/formula/formula-error.d.ts +10 -0
- package/dist/formula/formula-error.d.ts.map +1 -0
- package/dist/formula/formula-error.js +15 -0
- package/dist/formula/formula-error.js.map +1 -0
- package/dist/formula/functions/__async.d.ts +67 -0
- package/dist/formula/functions/__async.d.ts.map +1 -0
- package/dist/formula/functions/__async.js +70 -0
- package/dist/formula/functions/__async.js.map +1 -0
- package/dist/formula/functions/__base.d.ts +112 -0
- package/dist/formula/functions/__base.d.ts.map +1 -0
- package/dist/formula/functions/__base.js +265 -0
- package/dist/formula/functions/__base.js.map +1 -0
- package/dist/formula/functions/__utils.d.ts +28 -0
- package/dist/formula/functions/__utils.d.ts.map +1 -0
- package/dist/formula/functions/__utils.js +179 -0
- package/dist/formula/functions/__utils.js.map +1 -0
- package/dist/formula/functions/abs.d.ts +9 -0
- package/dist/formula/functions/abs.d.ts.map +1 -0
- package/dist/formula/functions/abs.js +15 -0
- package/dist/formula/functions/abs.js.map +1 -0
- package/dist/formula/functions/add.d.ts +10 -0
- package/dist/formula/functions/add.d.ts.map +1 -0
- package/dist/formula/functions/add.js +37 -0
- package/dist/formula/functions/add.js.map +1 -0
- package/dist/formula/functions/and.d.ts +9 -0
- package/dist/formula/functions/and.d.ts.map +1 -0
- package/dist/formula/functions/and.js +23 -0
- package/dist/formula/functions/and.js.map +1 -0
- package/dist/formula/functions/arrayformula.d.ts +12 -0
- package/dist/formula/functions/arrayformula.d.ts.map +1 -0
- package/dist/formula/functions/arrayformula.js +24 -0
- package/dist/formula/functions/arrayformula.js.map +1 -0
- package/dist/formula/functions/average.d.ts +9 -0
- package/dist/formula/functions/average.d.ts.map +1 -0
- package/dist/formula/functions/average.js +40 -0
- package/dist/formula/functions/average.js.map +1 -0
- package/dist/formula/functions/concat.d.ts +9 -0
- package/dist/formula/functions/concat.d.ts.map +1 -0
- package/dist/formula/functions/concat.js +27 -0
- package/dist/formula/functions/concat.js.map +1 -0
- package/dist/formula/functions/count.d.ts +9 -0
- package/dist/formula/functions/count.d.ts.map +1 -0
- package/dist/formula/functions/count.js +32 -0
- package/dist/formula/functions/count.js.map +1 -0
- package/dist/formula/functions/counta.d.ts +9 -0
- package/dist/formula/functions/counta.d.ts.map +1 -0
- package/dist/formula/functions/counta.js +32 -0
- package/dist/formula/functions/counta.js.map +1 -0
- package/dist/formula/functions/divide.d.ts +10 -0
- package/dist/formula/functions/divide.d.ts.map +1 -0
- package/dist/formula/functions/divide.js +34 -0
- package/dist/formula/functions/divide.js.map +1 -0
- package/dist/formula/functions/eq.d.ts +9 -0
- package/dist/formula/functions/eq.d.ts.map +1 -0
- package/dist/formula/functions/eq.js +19 -0
- package/dist/formula/functions/eq.js.map +1 -0
- package/dist/formula/functions/gt.d.ts +9 -0
- package/dist/formula/functions/gt.d.ts.map +1 -0
- package/dist/formula/functions/gt.js +19 -0
- package/dist/formula/functions/gt.js.map +1 -0
- package/dist/formula/functions/gte.d.ts +9 -0
- package/dist/formula/functions/gte.d.ts.map +1 -0
- package/dist/formula/functions/gte.js +19 -0
- package/dist/formula/functions/gte.js.map +1 -0
- package/dist/formula/functions/if.d.ts +9 -0
- package/dist/formula/functions/if.d.ts.map +1 -0
- package/dist/formula/functions/if.js +29 -0
- package/dist/formula/functions/if.js.map +1 -0
- package/dist/formula/functions/iferror.d.ts +10 -0
- package/dist/formula/functions/iferror.d.ts.map +1 -0
- package/dist/formula/functions/iferror.js +28 -0
- package/dist/formula/functions/iferror.js.map +1 -0
- package/dist/formula/functions/len.d.ts +9 -0
- package/dist/formula/functions/len.d.ts.map +1 -0
- package/dist/formula/functions/len.js +21 -0
- package/dist/formula/functions/len.js.map +1 -0
- package/dist/formula/functions/lt.d.ts +9 -0
- package/dist/formula/functions/lt.d.ts.map +1 -0
- package/dist/formula/functions/lt.js +19 -0
- package/dist/formula/functions/lt.js.map +1 -0
- package/dist/formula/functions/lte.d.ts +9 -0
- package/dist/formula/functions/lte.d.ts.map +1 -0
- package/dist/formula/functions/lte.js +19 -0
- package/dist/formula/functions/lte.js.map +1 -0
- package/dist/formula/functions/max.d.ts +9 -0
- package/dist/formula/functions/max.d.ts.map +1 -0
- package/dist/formula/functions/max.js +37 -0
- package/dist/formula/functions/max.js.map +1 -0
- package/dist/formula/functions/min.d.ts +9 -0
- package/dist/formula/functions/min.d.ts.map +1 -0
- package/dist/formula/functions/min.js +37 -0
- package/dist/formula/functions/min.js.map +1 -0
- package/dist/formula/functions/minus.d.ts +10 -0
- package/dist/formula/functions/minus.d.ts.map +1 -0
- package/dist/formula/functions/minus.js +41 -0
- package/dist/formula/functions/minus.js.map +1 -0
- package/dist/formula/functions/multiply.d.ts +9 -0
- package/dist/formula/functions/multiply.d.ts.map +1 -0
- package/dist/formula/functions/multiply.js +19 -0
- package/dist/formula/functions/multiply.js.map +1 -0
- package/dist/formula/functions/ne.d.ts +9 -0
- package/dist/formula/functions/ne.d.ts.map +1 -0
- package/dist/formula/functions/ne.js +19 -0
- package/dist/formula/functions/ne.js.map +1 -0
- package/dist/formula/functions/not.d.ts +9 -0
- package/dist/formula/functions/not.d.ts.map +1 -0
- package/dist/formula/functions/not.js +22 -0
- package/dist/formula/functions/not.js.map +1 -0
- package/dist/formula/functions/now.d.ts +9 -0
- package/dist/formula/functions/now.d.ts.map +1 -0
- package/dist/formula/functions/now.js +14 -0
- package/dist/formula/functions/now.js.map +1 -0
- package/dist/formula/functions/or.d.ts +9 -0
- package/dist/formula/functions/or.d.ts.map +1 -0
- package/dist/formula/functions/or.js +23 -0
- package/dist/formula/functions/or.js.map +1 -0
- package/dist/formula/functions/power.d.ts +9 -0
- package/dist/formula/functions/power.d.ts.map +1 -0
- package/dist/formula/functions/power.js +18 -0
- package/dist/formula/functions/power.js.map +1 -0
- package/dist/formula/functions/sum.d.ts +9 -0
- package/dist/formula/functions/sum.d.ts.map +1 -0
- package/dist/formula/functions/sum.js +34 -0
- package/dist/formula/functions/sum.js.map +1 -0
- package/dist/formula/functions/uminus.d.ts +9 -0
- package/dist/formula/functions/uminus.d.ts.map +1 -0
- package/dist/formula/functions/uminus.js +17 -0
- package/dist/formula/functions/uminus.js.map +1 -0
- package/dist/formula/mapping.d.ts +11 -0
- package/dist/formula/mapping.d.ts.map +1 -0
- package/dist/formula/mapping.js +82 -0
- package/dist/formula/mapping.js.map +1 -0
- package/dist/formula/solver.d.ts +39 -0
- package/dist/formula/solver.d.ts.map +1 -0
- package/dist/formula/solver.js +71 -0
- package/dist/formula/solver.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/autofill.d.ts +22 -0
- package/dist/lib/autofill.d.ts.map +1 -0
- package/dist/lib/autofill.js +276 -0
- package/dist/lib/autofill.js.map +1 -0
- package/dist/lib/book.d.ts +131 -0
- package/dist/lib/book.d.ts.map +1 -0
- package/dist/lib/book.js +53 -0
- package/dist/lib/book.js.map +1 -0
- package/dist/lib/cell.d.ts +17 -0
- package/dist/lib/cell.d.ts.map +1 -0
- package/dist/lib/cell.js +17 -0
- package/dist/lib/cell.js.map +1 -0
- package/dist/lib/coords.d.ts +22 -0
- package/dist/lib/coords.d.ts.map +1 -0
- package/dist/lib/coords.js +73 -0
- package/dist/lib/coords.js.map +1 -0
- package/dist/lib/date.d.ts +2 -0
- package/dist/lib/date.d.ts.map +1 -0
- package/dist/lib/date.js +91 -0
- package/dist/lib/date.js.map +1 -0
- package/dist/lib/dom.d.ts +7 -0
- package/dist/lib/dom.d.ts.map +1 -0
- package/dist/lib/dom.js +28 -0
- package/dist/lib/dom.js.map +1 -0
- package/dist/lib/filter.d.ts +7 -0
- package/dist/lib/filter.d.ts.map +1 -0
- package/dist/lib/filter.js +122 -0
- package/dist/lib/filter.js.map +1 -0
- package/dist/lib/input.d.ts +28 -0
- package/dist/lib/input.d.ts.map +1 -0
- package/dist/lib/input.js +73 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/label.d.ts +4 -0
- package/dist/lib/label.d.ts.map +1 -0
- package/dist/lib/label.js +10 -0
- package/dist/lib/label.js.map +1 -0
- package/dist/lib/operation.d.ts +31 -0
- package/dist/lib/operation.d.ts.map +1 -0
- package/dist/lib/operation.js +36 -0
- package/dist/lib/operation.js.map +1 -0
- package/dist/lib/palette.d.ts +2 -0
- package/dist/lib/palette.d.ts.map +1 -0
- package/dist/lib/palette.js +26 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/popup.d.ts +24 -0
- package/dist/lib/popup.d.ts.map +1 -0
- package/dist/lib/popup.js +21 -0
- package/dist/lib/popup.js.map +1 -0
- package/dist/lib/reference.d.ts +19 -0
- package/dist/lib/reference.d.ts.map +1 -0
- package/dist/lib/reference.js +40 -0
- package/dist/lib/reference.js.map +1 -0
- package/dist/lib/sheet.d.ts +512 -0
- package/dist/lib/sheet.d.ts.map +1 -0
- package/dist/lib/sheet.js +1530 -0
- package/dist/lib/sheet.js.map +1 -0
- package/dist/lib/sheet_utils.d.ts +55 -0
- package/dist/lib/sheet_utils.d.ts.map +1 -0
- package/dist/lib/sheet_utils.js +125 -0
- package/dist/lib/sheet_utils.js.map +1 -0
- package/dist/lib/spatial.d.ts +79 -0
- package/dist/lib/spatial.d.ts.map +1 -0
- package/dist/lib/spatial.js +227 -0
- package/dist/lib/spatial.js.map +1 -0
- package/dist/lib/time.d.ts +29 -0
- package/dist/lib/time.d.ts.map +1 -0
- package/dist/lib/time.js +113 -0
- package/dist/lib/time.js.map +1 -0
- package/dist/lib/virtualization.d.ts +22 -0
- package/dist/lib/virtualization.d.ts.map +1 -0
- package/dist/lib/virtualization.js +91 -0
- package/dist/lib/virtualization.js.map +1 -0
- package/dist/policy/core.d.ts +161 -0
- package/dist/policy/core.d.ts.map +1 -0
- package/dist/policy/core.js +248 -0
- package/dist/policy/core.js.map +1 -0
- package/dist/policy/thousand_separator.d.ts +4 -0
- package/dist/policy/thousand_separator.d.ts.map +1 -0
- package/dist/policy/thousand_separator.js +13 -0
- package/dist/policy/thousand_separator.js.map +1 -0
- package/dist/sentinels.d.ts +40 -0
- package/dist/sentinels.d.ts.map +1 -0
- package/dist/sentinels.js +41 -0
- package/dist/sentinels.js.map +1 -0
- package/dist/styles/embedder.d.ts +2 -0
- package/dist/styles/embedder.d.ts.map +1 -0
- package/dist/styles/embedder.js +11 -0
- package/dist/styles/embedder.js.map +1 -0
- package/dist/styles/minified.d.ts +3 -0
- package/dist/styles/minified.d.ts.map +1 -0
- package/dist/styles/minified.js +6 -0
- package/dist/styles/minified.js.map +1 -0
- package/dist/types.d.ts +310 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sources":["../../src/formula/evaluator.ts"],"sourcesContent":["import { a2p, buildIdentifiedRef, grantAddressAbsolute, p2a } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport { Id, PointType } from '../types';\nimport { FormulaError } from './formula-error';\n\ntype EvaluateProps = {\n sheet: Sheet;\n};\n\ntype IdentityBaseProps = {\n slideY?: number;\n slideX?: number;\n operation?: 'move' | 'removeRows' | 'removeCols';\n dependency: Id;\n};\n\nexport type ProcessFormulaProps = IdentityBaseProps & {\n idMap?: { [id: string]: string };\n};\n\nexport type IdentifyProps = IdentityBaseProps & {\n sheet: Sheet;\n};\n\nexport type DisplayProps = {\n sheet: Sheet;\n slideY?: number;\n slideX?: number;\n};\n\n// strip sharp and dollars\nconst stripId = (idString: string, stripAbsolute = true) => {\n let id = idString;\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id.replace('#', '');\n};\n\nclass Entity<T = any> {\n public value: T;\n public ids: string[] = [];\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const { y, x } = a2p(parsed.addresses[0]);\n const t = parsed.sheet.trim({ top: y, left: x, bottom: y, right: x });\n return t;\n }\n\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const address = parsed.addresses[0];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids = [id];\n return `#${parsed.sheet.id}!${buildIdentifiedRef(id, absX, absY)}`;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const area = parsed.sheet.rangeToArea(parsed.addresses.join(':'));\n const t = parsed.sheet.trim(area);\n return t;\n }\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const formulas: string[] = [];\n for (let i = 0; i < parsed.addresses.length; i++) {\n const address = parsed.addresses[i];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids.push(id);\n formulas.push(buildIdentifiedRef(id, absX, absY));\n }\n return `#${parsed.sheet.id}!${formulas.join(':')}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [sheetIdStr, id] = this.value.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, id: stripId(id, false) };\n }\n return { sheet, id: stripId(this.value, false) };\n }\n public evaluate({ sheet }: EvaluateProps) {\n const parsed = this.parse(sheet);\n if (parsed.id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const { y, x } = parsed.sheet.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.sheet.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const address = parsed.sheet.getAddressById(parsed.id, slideY, slideX);\n if (!address) {\n return '#REF!';\n }\n if (parsed.sheet.id === sheet.id) {\n return address;\n }\n return `${parsed.sheet.sheetPrefix()}${address}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const address = this.display({ sheet, slideY, slideX });\n if (address == null || address.length < 2) {\n return '#?';\n }\n const { formula, ids } = parseRef(address, props);\n this.ids = ids;\n return formula || '#?';\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetIdStr, idRange] = range.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, ids: idRange.split(':') };\n }\n return { sheet, ids: range.split(':') };\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = this.parse(sheet);\n const ids = parsed.ids.map((id) => stripId(id));\n const ps: PointType[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const p = parsed.sheet.getPointById(id);\n ps.push(p);\n }\n const [p1, p2] = ps;\n const [top, left, bottom, right] = [p1.y, p1.x, p2.y || parsed.sheet.numRows, p2.x || parsed.sheet.numCols];\n return parsed.sheet.trim({ top, left, bottom, right });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const range = parsed.ids\n .map((id) => stripId(id, false))\n .map((id) => parsed.sheet.getAddressById(id, slideY, slideX) || '#REF!')\n .join(':');\n if (parsed.sheet.id === sheet.id) {\n return range;\n }\n return `${parsed.sheet.sheetPrefix()}${range}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const range = this.display({ sheet, slideY, slideX });\n const { formula, ids } = parseRef(range, props);\n this.ids = ids;\n return formula ?? '';\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private at?: Id;\n constructor(name: string, precedence = 0, args: Expression[] = [], at?: Id) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.at = at;\n }\n\n public evaluate({ sheet }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = sheet.getFunctionByName(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, sheet, at: this.at });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n closed: boolean;\n private at?: Id;\n\n constructor(type: TokenType, entity: any, precedence = 0, at?: Id, closed = true) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.at = at;\n this.closed = closed;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + (this.closed ? 2 : 1);\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return this.closed ? `\"${this.entity}\"` : `\"${this.entity}`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.at);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ',');\n\nconst INFIX_OPERATOR = 'INFIX_OPERATOR';\nconst PREFIX_OPERATOR = 'PREFIX_OPERATOR';\nconst POSTFIX_OPERATOR = 'POSTFIX_OPERATOR';\n\ntype LexerOption = {\n at?: Id;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n public identifiedFormula: string = '';\n public dependencyIds: string[] = [];\n private at?: Id;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n this.at = options?.at;\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number): [number, boolean] {\n // return [index, edge]\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return [i, pos === start || pos === end];\n }\n start = end;\n }\n return [-1, false];\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public identify(props: IdentifyProps): void {\n const parts: string[] = [];\n const ids: string[] = [];\n for (const t of this.tokens) {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n parts.push(String(t.entity));\n } else {\n parts.push(t.closed ? `\"${t.entity}\"` : `\"${t.entity}`);\n }\n break;\n case 'ID': {\n const entity = new IdEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'ID_RANGE': {\n const entity = new IdRangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'REF': {\n const entity = new RefEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'RANGE': {\n const entity = new RangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n default:\n parts.push(t.entity);\n break;\n }\n }\n this.identifiedFormula = parts.join('');\n this.dependencyIds = ids;\n }\n\n public display({ sheet }: DisplayProps) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return t.closed ? `\"${t.entity}\"` : `\"${t.entity}`;\n case 'ID':\n return new IdEntity(t.entity as string).display({ sheet });\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).display({ sheet });\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize(idMap: { [id: Id]: Id } = {}) {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n // TOKEN_PLUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '+', 3, this.at));\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === INFIX_OPERATOR || (prev1 === 'SPACE' && prev2 === INFIX_OPERATOR)) {\n // TOKEN_UMINUS(6)\n this.tokens.push(new Token(PREFIX_OPERATOR, '-', 6, this.at));\n } else {\n // TOKEN_MINUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '-', 3, this.at));\n }\n continue;\n }\n case '/':\n // TOKEN_DIVIDE(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '/', 4, this.at));\n continue;\n case '*':\n // TOKEN_MULTIPLY(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '*', 4, this.at));\n continue;\n case '^':\n // TOKEN_POWER(5)\n this.tokens.push(new Token(INFIX_OPERATOR, '^', 5, this.at));\n continue;\n case '&':\n // TOKEN_CONCAT(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '&', 4, this.at));\n continue;\n case '=':\n // TOKEN_EQ(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '=', 1, this.at));\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n // TOKEN_GTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>=', 2, this.at));\n continue;\n }\n // TOKEN_GT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>', 2, this.at));\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n // TOKEN_LTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<=', 2, this.at));\n continue;\n }\n if (this.get() === '>') {\n this.next();\n // TOKEN_NE(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '<>', 1, this.at));\n continue;\n }\n // TOKEN_LT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<', 2, this.at));\n continue;\n case '\"': {\n const { buf, closed } = this.getString('\"');\n // TOKEN_VALUE(0)\n this.tokens.push(new Token('VALUE', buf, 0, this.at, closed));\n continue;\n }\n case \"'\": {\n const { buf } = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n // TOKEN_PERCENT(4)\n this.tokens.push(new Token(POSTFIX_OPERATOR, '%', 4, this.at));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n // TOKEN_FUNCTION(0)\n this.tokens.push(new Token('FUNCTION', buf, 0, this.at), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n this.tokens.push(new Token('VALUE', parseFloat(buf), 0, this.at));\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool, 0, this.at));\n } else if (buf.startsWith('#')) {\n if (buf.indexOf('#REF!') !== -1) {\n this.tokens.push(new Token('UNREFERENCED', buf, 0, this.at));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', resolveIdRange(buf, idMap), 0, this.at));\n } else {\n this.tokens.push(new Token('ID', buf, 0, this.at));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf, 0, this.at));\n } else {\n // A token containing '.' alongside letters is a partial function name\n // (e.g. \"RANGE.1\" before the opening paren), not a cell reference.\n const looksLikeFunctionName = buf.includes('.') && /[a-zA-Z]/.test(buf);\n if (looksLikeFunctionName || isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf, 0, this.at));\n } else {\n this.tokens.push(new Token('REF', buf, 0, this.at));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space, 0, this.at));\n }\n }\n\n private getString(quote = '\"'): { buf: string; closed: boolean } {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n return { buf, closed: false };\n }\n if (c === quote) {\n if (quote === '\"' && this.get() === quote) {\n // escape for double quotes\n buf += quote;\n this.next();\n continue;\n } else if (quote === \"'\" && this.get() === quote) {\n // keep consecutive single quotes as is\n buf += c;\n continue;\n } else {\n return { buf, closed: true };\n }\n } else {\n buf += c;\n }\n }\n }\n}\n\nconst resolveIdRange = (range: string, idMap: { [id: Id]: Id }) => {\n const [sheetId, refString] = range.split('!');\n const refs = refString.split(':');\n const done = new Set<number>();\n Object.keys(idMap).forEach((before) => {\n const after = idMap[before];\n // #x -> #y, #$x -> #$y, #x$ -> #y$, #$x$ -> #$y$\n const regex = new RegExp(`(\\\\$)?#${before}\\\\b(\\\\$)?`);\n for (let i = 0; i < refs.length; i++) {\n if (done.has(i)) {\n continue;\n }\n const ref = refs[i];\n const replaced = ref.replace(regex, (_: string, prefix: string, suffix: string) => {\n return `${prefix || ''}#${after}${suffix || ''}`;\n });\n if (replaced === ref) {\n continue;\n }\n refs[i] = replaced;\n done.add(i);\n }\n });\n return `${sheetId}!${refs.join(':')}`;\n};\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\n/** Alias for Parser, exported for external tooling (e.g. Debugger). */\nexport const FormulaParser = Parser;\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n\nexport function splitRef(ref: string): { sheetName: string | undefined; addresses: string[] } {\n let sheetName: string | undefined = undefined;\n let addresses: string[] = [];\n\n if (ref.startsWith(\"'\")) {\n let i = 1;\n let name = '';\n\n while (i < ref.length) {\n const char = ref[i];\n const nextChar = ref[i + 1];\n\n if (char === \"'\") {\n if (nextChar === \"'\") {\n name += \"'\";\n i += 2;\n } else if (nextChar === '!') {\n i += 2;\n break;\n } else {\n return { sheetName: undefined, addresses: [] };\n }\n } else {\n name += char;\n i++;\n }\n }\n\n sheetName = name;\n const addressPart = ref.slice(i).trim();\n addresses = addressPart.split(':');\n } else {\n const excl = ref.indexOf('!');\n if (excl !== -1) {\n sheetName = ref.slice(0, excl);\n const addressPart = ref.slice(excl + 1).trim();\n addresses = addressPart.split(':');\n } else {\n addresses = ref.trim().split(':');\n }\n }\n return { sheetName, addresses };\n}\n\nexport const parseRef = (\n ref: string,\n { sheet, operation, dependency }: IdentifyProps,\n): {\n sheet: Sheet;\n sheetId?: number;\n formula?: string;\n sheetName?: string;\n addresses: string[];\n ids: string[];\n} => {\n const { sheetName, addresses } = splitRef(ref);\n const ids: string[] = [];\n if (sheetName) {\n sheet = sheet.getSheetBySheetName(sheetName)!;\n if (sheet == null) {\n return { sheet, sheetName, addresses, ids };\n }\n }\n if (addresses.length === 0) {\n return { sheet, sheetName, addresses, ids };\n }\n const refs: string[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const { y, x, absX, absY } = a2p(address);\n let id = sheet.getId({ y, x });\n\n // if the id is the same as the dependency by the operation,\n // we need to adjust the id based on the operation\n if (id === dependency) {\n if (operation === 'removeRows') {\n id = sheet.getId({ y: y - 1, x });\n } else if (operation === 'removeCols') {\n id = sheet.getId({ y, x: x - 1 });\n }\n }\n if (id == null) {\n refs.push(grantAddressAbsolute(address, !!absX, !!absY) || '?');\n continue;\n }\n ids.push(id);\n refs.push(`${absX ? '$' : ''}#${id}${absY ? '$' : ''}`);\n }\n let formula = `#${sheet.id}!${refs.join(':')}`;\n return {\n sheet,\n sheetName,\n addresses,\n ids,\n formula,\n };\n};\n"],"names":["stripId","idString","stripAbsolute","id","Entity","value","ValueEntity","UnreferencedEntity","FormulaError","InvalidRefEntity","RefEntity","sheet","parsed","parseRef","y","x","a2p","props","slideY","slideX","address","absX","absY","newPoint","buildIdentifiedRef","RangeEntity","area","formulas","i","IdEntity","sheetIdStr","sheetId","formula","ids","IdRangeEntity","range","idRange","ps","p","p1","p2","top","left","bottom","right","FunctionEntity","name","precedence","args","at","Func","ZERO","INFIX_FUNCTION_NAME_MAP","PREFIX_FUNCTION_NAME_MAP","WHITESPACE_CHARS","SPECIAL_CHARS","Token","type","entity","closed","isWhiteSpace","char","BOOLS","TOKEN_OPEN","TOKEN_CLOSE","TOKEN_COMMA","INFIX_OPERATOR","PREFIX_OPERATOR","POSTFIX_OPERATOR","Lexer","options","base","pos","start","end","token","index","slide","t","parts","idMap","prev1","_a","prev2","_b","buf","c","bool","resolveIdRange","space","quote","refString","refs","done","before","after","regex","ref","replaced","_","prefix","suffix","Parser","tokens","expr","underFunction","stack","lastOperator","complement","hasNext","outer","divideBy100","func","operator","FormulaParser","stripSheetName","sheetName","splitRef","addresses","nextChar","excl","operation","dependency","grantAddressAbsolute"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class FormulaError {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
error?: Error;
|
|
5
|
+
readonly __gsType: "FormulaError";
|
|
6
|
+
constructor(code: string, message: string, error?: Error);
|
|
7
|
+
static is(obj: any): obj is FormulaError;
|
|
8
|
+
toString(): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=formula-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-error.d.ts","sourceRoot":"","sources":["../../src/formula/formula-error.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACrB,SAAgB,QAAQ,EAAG,cAAc,CAAU;gBACvC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAKxD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,YAAY;IAGxC,QAAQ;CAGT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class s {
|
|
2
|
+
constructor(r, t, e) {
|
|
3
|
+
this.__gsType = "FormulaError", this.code = r, this.message = t, this.error = e;
|
|
4
|
+
}
|
|
5
|
+
static is(r) {
|
|
6
|
+
return r instanceof s || (r == null ? void 0 : r.__gsType) === "FormulaError";
|
|
7
|
+
}
|
|
8
|
+
toString() {
|
|
9
|
+
return this.code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
s as FormulaError
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=formula-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-error.js","sources":["../../src/formula/formula-error.ts"],"sourcesContent":["export class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n public readonly __gsType = 'FormulaError' as const;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n static is(obj: any): obj is FormulaError {\n return obj instanceof FormulaError || obj?.__gsType === 'FormulaError';\n }\n toString() {\n return this.code;\n }\n}\n"],"names":["FormulaError","code","message","error","obj"],"mappings":"AAAO,MAAMA,EAAa;AAAA,EAKxB,YAAYC,GAAcC,GAAiBC,GAAe;AAD1D,SAAgB,WAAW,gBAEzB,KAAK,OAAOF,GACZ,KAAK,UAAUC,GACf,KAAK,QAAQC;AAAA,EAAA;AAAA,EAEf,OAAO,GAAGC,GAA+B;AAChC,WAAAA,aAAeJ,MAAgBI,KAAA,gBAAAA,EAAK,cAAa;AAAA,EAAA;AAAA,EAE1D,WAAW;AACT,WAAO,KAAK;AAAA,EAAA;AAEhB;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Pending, Sentinel } from '../../sentinels';
|
|
2
|
+
import { Registry } from '../../lib/book';
|
|
3
|
+
import { Id, PointType } from '../../types';
|
|
4
|
+
/**
|
|
5
|
+
* Sentinel value to distinguish cache miss from user-returned undefined/null.
|
|
6
|
+
* Since user functions can return undefined or null, we need a special marker
|
|
7
|
+
* to indicate "no cache entry found" vs "cache entry is undefined".
|
|
8
|
+
*/
|
|
9
|
+
export declare const asyncCacheMiss: Sentinel;
|
|
10
|
+
/** Returns true if any element of `args` is a Pending sentinel. */
|
|
11
|
+
export declare const hasPendingArg: (args: any[]) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Recursively check whether any value in the structure is a Pending sentinel.
|
|
14
|
+
* Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).
|
|
15
|
+
*/
|
|
16
|
+
export declare const hasDeepPending: (values: any[], at: Id) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Build a cache key from function name + hashed serialised arguments.
|
|
19
|
+
*
|
|
20
|
+
* Format: `funcName:length:hash1-hash2-...`
|
|
21
|
+
* - length: byte length of the JSON-serialised args
|
|
22
|
+
* - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds
|
|
23
|
+
*
|
|
24
|
+
* When a Sheet appears as an argument its trimmed area is converted to a
|
|
25
|
+
* value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the
|
|
26
|
+
* actual cell values the function will operate on.
|
|
27
|
+
*/
|
|
28
|
+
export declare const buildAsyncCacheKey: (funcName: string, args: any[], hashPrecision?: number) => string;
|
|
29
|
+
/**
|
|
30
|
+
* Try to retrieve a cached or pending async result for the given cache key.
|
|
31
|
+
*
|
|
32
|
+
* Returns:
|
|
33
|
+
* - Cached value if present, valid, and not expired
|
|
34
|
+
* - Pending if there is an in-flight promise for this cell
|
|
35
|
+
* - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)
|
|
36
|
+
*/
|
|
37
|
+
export declare const getAsyncCache: (sheet: {
|
|
38
|
+
registry: Registry;
|
|
39
|
+
getId: (p: PointType) => string;
|
|
40
|
+
}, id: Id, key: string, useInflight?: boolean) => any;
|
|
41
|
+
/**
|
|
42
|
+
* Handle an async (Promise) result returned by BaseFunction.main().
|
|
43
|
+
*
|
|
44
|
+
* Cache is stored per-cell in cell.asyncCache.
|
|
45
|
+
* In-flight tracking uses Binding.asyncPending (keyed by cell ID).
|
|
46
|
+
* If useInflight is true, also tracks by cache key in Binding.asyncInflight.
|
|
47
|
+
*
|
|
48
|
+
* Flow:
|
|
49
|
+
* 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value
|
|
50
|
+
* 2. If there is already an in-flight promise for this cell → return its Pending
|
|
51
|
+
* 3. If useInflight is true and there is an in-flight promise for this key → return its Pending
|
|
52
|
+
* 4. Otherwise start the async work, return a new Pending, and on completion
|
|
53
|
+
* write the result into cell.asyncCache and trigger a re-render.
|
|
54
|
+
*
|
|
55
|
+
* @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.
|
|
56
|
+
* @param useInflight - If true, reuse the same promise for matching cache keys across different cells.
|
|
57
|
+
*/
|
|
58
|
+
export declare const awaitAndSave: (promise: Promise<any>, sheet: {
|
|
59
|
+
registry: Registry;
|
|
60
|
+
getId: (p: PointType) => string;
|
|
61
|
+
}, id: Id, key: string, ttlMilliseconds?: number, useInflight?: boolean) => Pending;
|
|
62
|
+
/**
|
|
63
|
+
* Create a Pending sentinel that resolves immediately.
|
|
64
|
+
* Used when an argument is already pending — the result is propagated.
|
|
65
|
+
*/
|
|
66
|
+
export declare const createPropagatedPending: () => Pending;
|
|
67
|
+
//# sourceMappingURL=__async.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__async.d.ts","sourceRoot":"","sources":["../../../src/formula/functions/__async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAY,MAAM,iBAAiB,CAAC;AAG9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAY,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI3D;;;;GAIG;AACH,eAAO,MAAM,cAAc,UAAiC,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,aAAa,GAAI,MAAM,GAAG,EAAE,KAAG,OAE3C,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,KAAG,OAsBtD,CAAC;AAqBF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,gBAAe,MAAU,KAAG,MAY7F,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,MAAM,CAAA;CAAE,EAC9D,IAAI,EAAE,EACN,KAAK,MAAM,EACX,cAAa,OAAe,KAC3B,GA6DF,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,OAAO,CAAC,GAAG,CAAC,EACrB,OAAO;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,MAAM,CAAA;CAAE,EAC9D,IAAI,EAAE,EACN,KAAK,MAAM,EACX,kBAAkB,MAAM,EACxB,cAAa,OAAe,KAC3B,OAmDF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAAO,OAE1C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Sentinel as A, Pending as h, Spilling as C } from "../../sentinels.js";
|
|
2
|
+
import { FormulaError as u } from "../formula-error.js";
|
|
3
|
+
import { ensureSys as P, setAsyncCache as m } from "../../lib/cell.js";
|
|
4
|
+
import { toValueMatrix as S } from "../../lib/sheet_utils.js";
|
|
5
|
+
const p = new A("asyncCacheMiss"), I = (a) => a.some((r) => h.is(r)), d = (a) => (a == null ? void 0 : a.__gsType) === "Sheet", y = (a, r) => {
|
|
6
|
+
for (const n of a)
|
|
7
|
+
if (h.is(n) || Array.isArray(n) && y(n, r) || C.is(n) && y(n.matrix, r) || d(n) && y(n._toValueMatrix({ at: r }), r))
|
|
8
|
+
return !0;
|
|
9
|
+
return !1;
|
|
10
|
+
}, x = (a, r = 0) => {
|
|
11
|
+
let n = 3735928559 ^ r, e = 1103547991 ^ r;
|
|
12
|
+
for (let s = 0; s < a.length; s++) {
|
|
13
|
+
const o = a.charCodeAt(s);
|
|
14
|
+
n = Math.imul(n ^ o, 2654435761), e = Math.imul(e ^ o, 1597334677);
|
|
15
|
+
}
|
|
16
|
+
return n = Math.imul(n ^ n >>> 16, 2246822507), n ^= Math.imul(e ^ e >>> 13, 3266489909), e = Math.imul(e ^ e >>> 16, 2246822507), e ^= Math.imul(n ^ n >>> 13, 3266489909), 4294967296 * (2097151 & e) + (n >>> 0);
|
|
17
|
+
}, v = (a, r, n = 1) => {
|
|
18
|
+
const e = JSON.stringify(r, (o, i) => d(i) ? S(i) : h.is(i) ? null : i), s = Array.from({ length: n }, (o, i) => x(e, i).toString(36));
|
|
19
|
+
return `${a}:${e.length}:${s.join("-")}`;
|
|
20
|
+
}, _ = (a, r, n, e = !1) => {
|
|
21
|
+
var g;
|
|
22
|
+
const s = a.registry, o = s.data[r];
|
|
23
|
+
if (o == null)
|
|
24
|
+
return p;
|
|
25
|
+
const i = P(s, r, { tmpAsyncCaches: {} });
|
|
26
|
+
if (o.asyncCaches != null) {
|
|
27
|
+
const c = o.asyncCaches[n];
|
|
28
|
+
if (c != null && (c.expireTime == null || Date.now() < c.expireTime))
|
|
29
|
+
return i.tmpAsyncCaches[n] = c, c.value;
|
|
30
|
+
}
|
|
31
|
+
const f = `${r}:${n}`;
|
|
32
|
+
if (s.asyncPending.has(f))
|
|
33
|
+
return s.asyncPending.get(f);
|
|
34
|
+
if (e && ((g = s.asyncInflight) != null && g.has(n))) {
|
|
35
|
+
const c = s.asyncInflight.get(n);
|
|
36
|
+
return s.asyncPending.set(f, c.pending), c.pending.promise.then((t) => {
|
|
37
|
+
const l = s.data[r];
|
|
38
|
+
l != null && m(l, n, { value: t, expireTime: c.expireTime });
|
|
39
|
+
}).catch((t) => {
|
|
40
|
+
u.is(t) || (t = new u("#ASYNC!", (t == null ? void 0 : t.message) ?? String(t), t instanceof Error ? t : void 0));
|
|
41
|
+
const l = s.data[r];
|
|
42
|
+
l != null && m(l, n, { value: t, expireTime: c.expireTime });
|
|
43
|
+
}).finally(() => {
|
|
44
|
+
s.asyncPending.delete(f);
|
|
45
|
+
}), c.pending;
|
|
46
|
+
}
|
|
47
|
+
return p;
|
|
48
|
+
}, D = (a, r, n, e, s, o = !1) => {
|
|
49
|
+
const i = r.registry, f = s != null ? Date.now() + s : void 0, g = `${n}:${e}`, c = new h(a);
|
|
50
|
+
return i.asyncPending.set(g, c), o && (i.asyncInflight || (i.asyncInflight = /* @__PURE__ */ new Map()), i.asyncInflight.set(e, { pending: c, expireTime: f })), a.then((t) => {
|
|
51
|
+
const l = i.data[n];
|
|
52
|
+
l != null && m(l, e, { value: t, expireTime: f });
|
|
53
|
+
}).catch((t) => {
|
|
54
|
+
u.is(t) || (t = new u("#ASYNC!", (t == null ? void 0 : t.message) ?? String(t), t instanceof Error ? t : void 0));
|
|
55
|
+
const l = i.data[n];
|
|
56
|
+
l != null && m(l, e, { value: t, expireTime: f });
|
|
57
|
+
}).finally(() => {
|
|
58
|
+
i.asyncPending.delete(g), o && i.asyncInflight && i.asyncInflight.delete(e), i.solvedCaches.clear(), i.transmit();
|
|
59
|
+
}), c;
|
|
60
|
+
}, E = () => new h(Promise.resolve());
|
|
61
|
+
export {
|
|
62
|
+
p as asyncCacheMiss,
|
|
63
|
+
D as awaitAndSave,
|
|
64
|
+
v as buildAsyncCacheKey,
|
|
65
|
+
E as createPropagatedPending,
|
|
66
|
+
_ as getAsyncCache,
|
|
67
|
+
y as hasDeepPending,
|
|
68
|
+
I as hasPendingArg
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=__async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__async.js","sources":["../../../src/formula/functions/__async.ts"],"sourcesContent":["import { Pending, Sentinel, Spilling } from '../../sentinels';\nimport { FormulaError } from '../formula-error';\nimport { ensureSys, setAsyncCache } from '../../lib/cell';\nimport type { Registry } from '../../lib/book';\nimport type { CellType, Id, PointType } from '../../types';\nimport type { Sheet } from '../../lib/sheet';\nimport { toValueMatrix } from '../../lib/sheet_utils';\n\n/**\n * Sentinel value to distinguish cache miss from user-returned undefined/null.\n * Since user functions can return undefined or null, we need a special marker\n * to indicate \"no cache entry found\" vs \"cache entry is undefined\".\n */\nexport const asyncCacheMiss = new Sentinel('asyncCacheMiss');\n\n/** Returns true if any element of `args` is a Pending sentinel. */\nexport const hasPendingArg = (args: any[]): boolean => {\n return args.some((v) => Pending.is(v));\n};\n\nconst isSheet = (value: any): value is Sheet => {\n return value?.__gsType === 'Sheet';\n};\n\n/**\n * Recursively check whether any value in the structure is a Pending sentinel.\n * Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).\n */\nexport const hasDeepPending = (values: any[], at: Id): boolean => {\n for (const v of values) {\n if (Pending.is(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n if (hasDeepPending(v, at)) {\n return true;\n }\n }\n if (Spilling.is(v)) {\n if (hasDeepPending(v.matrix, at)) {\n return true;\n }\n }\n if (isSheet(v)) {\n if (hasDeepPending(v._toValueMatrix({ at }), at)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * cyrb53 – a fast, high-quality 53-bit string hash.\n * Returns a non-negative integer that fits safely in a JS Number.\n */\nconst cyrb53 = (str: string, seed = 0): number => {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\n/**\n * Build a cache key from function name + hashed serialised arguments.\n *\n * Format: `funcName:length:hash1-hash2-...`\n * - length: byte length of the JSON-serialised args\n * - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds\n *\n * When a Sheet appears as an argument its trimmed area is converted to a\n * value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the\n * actual cell values the function will operate on.\n */\nexport const buildAsyncCacheKey = (funcName: string, args: any[], hashPrecision: number = 1): string => {\n const argsJson = JSON.stringify(args, (_key, value) => {\n if (isSheet(value)) {\n return toValueMatrix(value);\n }\n if (Pending.is(value)) {\n return null;\n }\n return value;\n });\n const hashes = Array.from({ length: hashPrecision }, (_, i) => cyrb53(argsJson, i).toString(36));\n return `${funcName}:${argsJson.length}:${hashes.join('-')}`;\n};\n\n/**\n * Try to retrieve a cached or pending async result for the given cache key.\n *\n * Returns:\n * - Cached value if present, valid, and not expired\n * - Pending if there is an in-flight promise for this cell\n * - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)\n */\nexport const getAsyncCache = (\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n useInflight: boolean = false,\n): any => {\n const registry = sheet.registry;\n const cell: CellType | undefined = registry.data[id];\n\n if (cell == null) {\n return asyncCacheMiss;\n }\n\n const sys = ensureSys(registry, id, { tmpAsyncCaches: {} });\n\n // Check for a cached result from a previous async run\n if (cell.asyncCaches != null) {\n const ac = cell.asyncCaches[key];\n if (ac != null) {\n // Check expiry\n if (ac.expireTime == null || Date.now() < ac.expireTime) {\n sys.tmpAsyncCaches![key] = ac;\n return ac.value;\n }\n // Expired — will not be copied to tmpAsyncCaches\n }\n }\n\n const compositeKey = `${id}:${key}`;\n\n // Check if there is already a pending promise for this cell+key\n if (registry.asyncPending.has(compositeKey)) {\n return registry.asyncPending.get(compositeKey)!;\n }\n\n // If useInflight is enabled, check for an in-flight promise with the same cache key\n if (useInflight && registry.asyncInflight?.has(key)) {\n const inflight = registry.asyncInflight.get(key)!;\n // Track for this cell+key to prevent duplicate `.then` attachment and correctly yield the pending sentinel\n registry.asyncPending.set(compositeKey, inflight.pending);\n\n // Chain to the shared promise to populate this cell's cache when it resolves\n inflight.pending.promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime: inflight.expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime: inflight.expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n });\n\n return inflight.pending;\n }\n\n return asyncCacheMiss;\n};\n\n/**\n * Handle an async (Promise) result returned by BaseFunction.main().\n *\n * Cache is stored per-cell in cell.asyncCache.\n * In-flight tracking uses Binding.asyncPending (keyed by cell ID).\n * If useInflight is true, also tracks by cache key in Binding.asyncInflight.\n *\n * Flow:\n * 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value\n * 2. If there is already an in-flight promise for this cell → return its Pending\n * 3. If useInflight is true and there is an in-flight promise for this key → return its Pending\n * 4. Otherwise start the async work, return a new Pending, and on completion\n * write the result into cell.asyncCache and trigger a re-render.\n *\n * @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.\n * @param useInflight - If true, reuse the same promise for matching cache keys across different cells.\n */\nexport const awaitAndSave = (\n promise: Promise<any>,\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n ttlMilliseconds?: number,\n useInflight: boolean = false,\n): Pending => {\n const registry = sheet.registry;\n\n // Compute expireTime from ttl (ms)\n const expireTime = ttlMilliseconds != null ? Date.now() + ttlMilliseconds : undefined;\n\n const compositeKey = `${id}:${key}`;\n\n // Start the async computation\n const pending = new Pending(promise);\n registry.asyncPending.set(compositeKey, pending);\n\n // If useInflight is enabled, also track by cache key\n if (useInflight) {\n if (!registry.asyncInflight) {\n registry.asyncInflight = new Map();\n }\n registry.asyncInflight.set(key, { pending, expireTime });\n }\n\n promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n // If useInflight was enabled, also remove from asyncInflight\n if (useInflight) {\n if (registry.asyncInflight) {\n registry.asyncInflight.delete(key);\n }\n }\n // Clear solvedCaches so dependent formulas re-evaluate\n registry.solvedCaches.clear();\n // Trigger re-render of all sheets\n registry.transmit();\n });\n\n return pending;\n};\n\n/**\n * Create a Pending sentinel that resolves immediately.\n * Used when an argument is already pending — the result is propagated.\n */\nexport const createPropagatedPending = (): Pending => {\n return new Pending(Promise.resolve());\n};\n"],"names":["asyncCacheMiss","Sentinel","hasPendingArg","args","v","Pending","isSheet","value","hasDeepPending","values","at","Spilling","cyrb53","str","seed","h1","h2","i","ch","buildAsyncCacheKey","funcName","hashPrecision","argsJson","_key","toValueMatrix","hashes","_","getAsyncCache","sheet","id","key","useInflight","registry","cell","sys","ensureSys","ac","compositeKey","_a","inflight","result","c","setAsyncCache","e","FormulaError","awaitAndSave","promise","ttlMilliseconds","expireTime","pending","createPropagatedPending"],"mappings":";;;;AAaa,MAAAA,IAAiB,IAAIC,EAAS,gBAAgB,GAG9CC,IAAgB,CAACC,MACrBA,EAAK,KAAK,CAACC,MAAMC,EAAQ,GAAGD,CAAC,CAAC,GAGjCE,IAAU,CAACC,OACRA,KAAA,gBAAAA,EAAO,cAAa,SAOhBC,IAAiB,CAACC,GAAeC,MAAoB;AAChE,aAAWN,KAAKK;AAcV,QAbAJ,EAAQ,GAAGD,CAAC,KAGZ,MAAM,QAAQA,CAAC,KACbI,EAAeJ,GAAGM,CAAE,KAItBC,EAAS,GAAGP,CAAC,KACXI,EAAeJ,EAAE,QAAQM,CAAE,KAI7BJ,EAAQF,CAAC,KACPI,EAAeJ,EAAE,eAAe,EAAE,IAAAM,EAAI,CAAA,GAAGA,CAAE;AACtC,aAAA;AAIN,SAAA;AACT,GAMME,IAAS,CAACC,GAAaC,IAAO,MAAc;AAChD,MAAIC,IAAK,aAAaD,GAClBE,IAAK,aAAaF;AACtB,WAASG,IAAI,GAAGA,IAAIJ,EAAI,QAAQI,KAAK;AAC7B,UAAAC,IAAKL,EAAI,WAAWI,CAAC;AAC3B,IAAAF,IAAK,KAAK,KAAKA,IAAKG,GAAI,UAAU,GAClCF,IAAK,KAAK,KAAKA,IAAKE,GAAI,UAAU;AAAA,EAAA;AAEpC,SAAAH,IAAK,KAAK,KAAKA,IAAMA,MAAO,IAAK,UAAU,GAC3CA,KAAM,KAAK,KAAKC,IAAMA,MAAO,IAAK,UAAU,GAC5CA,IAAK,KAAK,KAAKA,IAAMA,MAAO,IAAK,UAAU,GAC3CA,KAAM,KAAK,KAAKD,IAAMA,MAAO,IAAK,UAAU,GACrC,cAAc,UAAUC,MAAOD,MAAO;AAC/C,GAaaI,IAAqB,CAACC,GAAkBjB,GAAakB,IAAwB,MAAc;AACtG,QAAMC,IAAW,KAAK,UAAUnB,GAAM,CAACoB,GAAMhB,MACvCD,EAAQC,CAAK,IACRiB,EAAcjB,CAAK,IAExBF,EAAQ,GAAGE,CAAK,IACX,OAEFA,CACR,GACKkB,IAAS,MAAM,KAAK,EAAE,QAAQJ,KAAiB,CAACK,GAAG,MAAMd,EAAOU,GAAU,CAAC,EAAE,SAAS,EAAE,CAAC;AACxF,SAAA,GAAGF,CAAQ,IAAIE,EAAS,MAAM,IAAIG,EAAO,KAAK,GAAG,CAAC;AAC3D,GAUaE,IAAgB,CAC3BC,GACAC,GACAC,GACAC,IAAuB,OACf;;AACR,QAAMC,IAAWJ,EAAM,UACjBK,IAA6BD,EAAS,KAAKH,CAAE;AAEnD,MAAII,KAAQ;AACH,WAAAjC;AAGH,QAAAkC,IAAMC,EAAUH,GAAUH,GAAI,EAAE,gBAAgB,CAAA,GAAI;AAGtD,MAAAI,EAAK,eAAe,MAAM;AACtB,UAAAG,IAAKH,EAAK,YAAYH,CAAG;AAC/B,QAAIM,KAAM,SAEJA,EAAG,cAAc,QAAQ,KAAK,IAAI,IAAIA,EAAG;AACvC,aAAAF,EAAA,eAAgBJ,CAAG,IAAIM,GACpBA,EAAG;AAAA,EAGd;AAGF,QAAMC,IAAe,GAAGR,CAAE,IAAIC,CAAG;AAGjC,MAAIE,EAAS,aAAa,IAAIK,CAAY;AACjC,WAAAL,EAAS,aAAa,IAAIK,CAAY;AAI/C,MAAIN,OAAeO,IAAAN,EAAS,kBAAT,QAAAM,EAAwB,IAAIR,KAAM;AACnD,UAAMS,IAAWP,EAAS,cAAc,IAAIF,CAAG;AAE/C,WAAAE,EAAS,aAAa,IAAIK,GAAcE,EAAS,OAAO,GAGxDA,EAAS,QAAQ,QACd,KAAK,CAACC,MAAgB;AACf,YAAAC,IAAIT,EAAS,KAAKH,CAAE;AAC1B,MAAIY,KAAK,QACOC,EAAAD,GAAGX,GAAK,EAAE,OAAOU,GAAQ,YAAYD,EAAS,YAAY;AAAA,IAC1E,CACD,EACA,MAAM,CAACI,MAAW;AACjB,MAAKC,EAAa,GAAGD,CAAC,MAChBA,IAAA,IAAIC,EAAa,YAAWD,KAAA,gBAAAA,EAAG,YAAW,OAAOA,CAAC,GAAGA,aAAa,QAAQA,IAAI,MAAS;AAEvF,YAAAF,IAAIT,EAAS,KAAKH,CAAE;AAC1B,MAAIY,KAAK,QACOC,EAAAD,GAAGX,GAAK,EAAE,OAAOa,GAAG,YAAYJ,EAAS,YAAY;AAAA,IACrE,CACD,EACA,QAAQ,MAAM;AACJ,MAAAP,EAAA,aAAa,OAAOK,CAAY;AAAA,IAAA,CAC1C,GAEIE,EAAS;AAAA,EAAA;AAGX,SAAAvC;AACT,GAmBa6C,IAAe,CAC1BC,GACAlB,GACAC,GACAC,GACAiB,GACAhB,IAAuB,OACX;AACZ,QAAMC,IAAWJ,EAAM,UAGjBoB,IAAaD,KAAmB,OAAO,KAAK,IAAA,IAAQA,IAAkB,QAEtEV,IAAe,GAAGR,CAAE,IAAIC,CAAG,IAG3BmB,IAAU,IAAI5C,EAAQyC,CAAO;AAC1B,SAAAd,EAAA,aAAa,IAAIK,GAAcY,CAAO,GAG3ClB,MACGC,EAAS,kBACHA,EAAA,oCAAoB,IAAI,IAEnCA,EAAS,cAAc,IAAIF,GAAK,EAAE,SAAAmB,GAAS,YAAAD,GAAY,IAItDF,EAAA,KAAK,CAACN,MAAgB;AACf,UAAAC,IAAIT,EAAS,KAAKH,CAAE;AAC1B,IAAIY,KAAK,QACPC,EAAcD,GAAGX,GAAK,EAAE,OAAOU,GAAQ,YAAAQ,GAAY;AAAA,EACrD,CACD,EACA,MAAM,CAACL,MAAW;AACjB,IAAKC,EAAa,GAAGD,CAAC,MAChBA,IAAA,IAAIC,EAAa,YAAWD,KAAA,gBAAAA,EAAG,YAAW,OAAOA,CAAC,GAAGA,aAAa,QAAQA,IAAI,MAAS;AAEvF,UAAAF,IAAIT,EAAS,KAAKH,CAAE;AAC1B,IAAIY,KAAK,QACPC,EAAcD,GAAGX,GAAK,EAAE,OAAOa,GAAG,YAAAK,GAAY;AAAA,EAChD,CACD,EACA,QAAQ,MAAM;AACJ,IAAAhB,EAAA,aAAa,OAAOK,CAAY,GAErCN,KACEC,EAAS,iBACFA,EAAA,cAAc,OAAOF,CAAG,GAIrCE,EAAS,aAAa,MAAM,GAE5BA,EAAS,SAAS;AAAA,EAAA,CACnB,GAEIiB;AACT,GAMaC,IAA0B,MAC9B,IAAI7C,EAAQ,QAAQ,SAAS;"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Sheet } from '../../lib/sheet';
|
|
2
|
+
import { Id } from '../../types';
|
|
3
|
+
import { Expression } from '../evaluator';
|
|
4
|
+
/** Duck-type check for Sheet instances (avoids runtime import cycle). */
|
|
5
|
+
export declare const isSheet: (v: any) => v is Sheet;
|
|
6
|
+
export type FunctionCategory = 'math' | 'statistics' | 'text' | 'time' | 'lookup' | 'information' | 'finance' | 'engineering' | 'logical' | 'other';
|
|
7
|
+
export type FunctionProps = {
|
|
8
|
+
args: Expression[];
|
|
9
|
+
sheet: Sheet;
|
|
10
|
+
at?: Id;
|
|
11
|
+
};
|
|
12
|
+
export type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';
|
|
13
|
+
export type FunctionArgumentDefinition = {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
nullable?: boolean;
|
|
18
|
+
variadic?: boolean;
|
|
19
|
+
errorTolerant?: boolean;
|
|
20
|
+
acceptedTypes?: FunctionArgumentType[];
|
|
21
|
+
/** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */
|
|
22
|
+
takesMatrix?: boolean;
|
|
23
|
+
};
|
|
24
|
+
export declare const conditionArg: FunctionArgumentDefinition;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a value is a "matrix" (Sheet, Spilling, or 2D array).
|
|
27
|
+
*/
|
|
28
|
+
export declare const isMatrix: (value: any) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).
|
|
31
|
+
* Returns the value unchanged if it is not a matrix.
|
|
32
|
+
*/
|
|
33
|
+
export declare const stripMatrix: (value: any, at: Id) => any;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a value is a matrix that is larger than 1×1.
|
|
36
|
+
*/
|
|
37
|
+
export declare const isMultiCell: (value: any) => boolean;
|
|
38
|
+
export declare class BaseFunction {
|
|
39
|
+
defs: FunctionArgumentDefinition[];
|
|
40
|
+
example: string | undefined;
|
|
41
|
+
description: string;
|
|
42
|
+
category: FunctionCategory;
|
|
43
|
+
/** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */
|
|
44
|
+
protected isAsync: boolean;
|
|
45
|
+
/** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */
|
|
46
|
+
protected ttlMilliseconds?: number;
|
|
47
|
+
/** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */
|
|
48
|
+
protected hashPrecision: number;
|
|
49
|
+
/** If true, reuse the same in-flight promise for matching cache keys across different cells. */
|
|
50
|
+
protected useInflight: boolean;
|
|
51
|
+
/** If true, broadcasting is unconditionally disabled for this function. */
|
|
52
|
+
protected broadcastDisabled: boolean;
|
|
53
|
+
protected args: any[];
|
|
54
|
+
protected autoSpilling: boolean;
|
|
55
|
+
sheet: Sheet;
|
|
56
|
+
at: Id;
|
|
57
|
+
static __name: string;
|
|
58
|
+
constructor({ args, sheet, at }: FunctionProps);
|
|
59
|
+
private _main;
|
|
60
|
+
/**
|
|
61
|
+
* Validate and normalise arguments before `main()` is called.
|
|
62
|
+
*
|
|
63
|
+
* Checks:
|
|
64
|
+
* 1. Argument count satisfies defs (respecting optional / variadic).
|
|
65
|
+
* 2. Each argument's runtime type matches the corresponding def's `type` list.
|
|
66
|
+
*
|
|
67
|
+
* Subclasses may override for additional coercion / spreading.
|
|
68
|
+
*/
|
|
69
|
+
protected validate(args: any[]): any[];
|
|
70
|
+
eachMatrix: (value: any, callback: (v: any) => void) => void;
|
|
71
|
+
/**
|
|
72
|
+
* Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).
|
|
73
|
+
* Default behavior for Sheet is value.solve(). Functions like COL can override
|
|
74
|
+
* this to preserve Sheet metadata per cell.
|
|
75
|
+
*/
|
|
76
|
+
protected toMatrix(value: any): any[][];
|
|
77
|
+
/**
|
|
78
|
+
* Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.
|
|
79
|
+
* Non-matrix values pass through unchanged.
|
|
80
|
+
*
|
|
81
|
+
* Override in sub-classes that need the original Sheet / reference
|
|
82
|
+
* metadata (e.g. COL, ROW) — for instance, to extract position
|
|
83
|
+
* information before collapsing.
|
|
84
|
+
*/
|
|
85
|
+
protected toScalar(value: any): any;
|
|
86
|
+
call(): any;
|
|
87
|
+
/**
|
|
88
|
+
* If any broadcastable argument is a matrix (multi-cell), expand the call
|
|
89
|
+
* across all element positions and return a Spilling.
|
|
90
|
+
* Returns `undefined` when no broadcast is necessary.
|
|
91
|
+
*
|
|
92
|
+
* Rules:
|
|
93
|
+
* - broadcastDisabled = true → never broadcast
|
|
94
|
+
* - An arg is broadcastable when its corresponding args[].takesMatrix is not true
|
|
95
|
+
* - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar
|
|
96
|
+
* (not broadcast); only multi-cell matrices trigger broadcast
|
|
97
|
+
* - For variadic args, extra args are assigned round-robin
|
|
98
|
+
* across the variadic helpArg positions
|
|
99
|
+
*/
|
|
100
|
+
private broadcast;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Base class for async functions.
|
|
104
|
+
* Extend this class to create async functions that support caching.
|
|
105
|
+
*/
|
|
106
|
+
export declare class BaseFunctionAsync extends BaseFunction {
|
|
107
|
+
protected isAsync: boolean;
|
|
108
|
+
}
|
|
109
|
+
export type FunctionMapping = {
|
|
110
|
+
[functionName: string]: typeof BaseFunction;
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=__base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__base.d.ts","sourceRoot":"","sources":["../../../src/formula/functions/__base.ts"],"names":[],"mappings":"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"}
|