@pixerate/editor 0.14.3 → 0.15.0
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/dist/agent/index.cjs +28 -220
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +5 -154
- package/dist/agent/index.js.map +1 -1
- package/dist/canvas/index.cjs +113 -377
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +2 -2
- package/dist/canvas/index.d.ts +2 -2
- package/dist/canvas/index.js +18 -208
- package/dist/canvas/index.js.map +1 -1
- package/dist/chunk-33UVEDOS.cjs +233 -0
- package/dist/chunk-33UVEDOS.cjs.map +1 -0
- package/dist/chunk-7FWEWE6T.js +1888 -0
- package/dist/chunk-7FWEWE6T.js.map +1 -0
- package/dist/chunk-BYCOFZAA.js +514 -0
- package/dist/chunk-BYCOFZAA.js.map +1 -0
- package/dist/chunk-CYKQLDYH.cjs +1290 -0
- package/dist/chunk-CYKQLDYH.cjs.map +1 -0
- package/dist/chunk-GLSIZKOX.js +17 -0
- package/dist/chunk-GLSIZKOX.js.map +1 -0
- package/dist/chunk-GWHJVZPI.js +233 -0
- package/dist/chunk-GWHJVZPI.js.map +1 -0
- package/dist/chunk-LDES3EOS.cjs +1888 -0
- package/dist/chunk-LDES3EOS.cjs.map +1 -0
- package/dist/chunk-MPPXH7U5.cjs +336 -0
- package/dist/chunk-MPPXH7U5.cjs.map +1 -0
- package/dist/chunk-NNJRJJSC.js +1290 -0
- package/dist/chunk-NNJRJJSC.js.map +1 -0
- package/dist/chunk-O7LOPQMH.js +336 -0
- package/dist/chunk-O7LOPQMH.js.map +1 -0
- package/dist/chunk-SEDR75VH.cjs +17 -0
- package/dist/chunk-SEDR75VH.cjs.map +1 -0
- package/dist/chunk-SHWP2A43.cjs +514 -0
- package/dist/chunk-SHWP2A43.cjs.map +1 -0
- package/dist/chunk-VHZCXHS4.js +222 -0
- package/dist/chunk-VHZCXHS4.js.map +1 -0
- package/dist/chunk-WADCJ7A7.cjs +222 -0
- package/dist/chunk-WADCJ7A7.cjs.map +1 -0
- package/dist/extensions/index.cjs +25 -1920
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +22 -1868
- package/dist/extensions/index.js.map +1 -1
- package/dist/grammar/index.cjs +44 -387
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.js +23 -321
- package/dist/grammar/index.js.map +1 -1
- package/dist/history/index.cjs +6 -257
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.js +4 -227
- package/dist/history/index.js.map +1 -1
- package/dist/image-editor/index.cjs +63 -106
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/index.cjs +324 -7232
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -4
- package/dist/index.d.ts +0 -4
- package/dist/index.js +258 -7007
- package/dist/index.js.map +1 -1
- package/dist/serializers/index.cjs +28 -558
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.js +16 -496
- package/dist/serializers/index.js.map +1 -1
- package/dist/spreadsheet/index.cjs +21 -1319
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.js +14 -1274
- package/dist/spreadsheet/index.js.map +1 -1
- package/dist/{types-lGtRobRV.d.cts → types-DC8b2TsA.d.cts} +1 -1
- package/dist/{types-lGtRobRV.d.ts → types-DC8b2TsA.d.ts} +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/spreadsheet/formula/lexer.ts","../../src/spreadsheet/formula/parser.ts","../../src/spreadsheet/formula/evaluator.ts","../../src/spreadsheet/formula/dependency-graph.ts","../../src/spreadsheet/datasource/index.ts","../../src/spreadsheet/controller.ts"],"sourcesContent":["export type FormulaTokenType =\n | 'NUMBER'\n | 'STRING'\n | 'BOOLEAN'\n | 'CELL_REF'\n | 'RANGE'\n | 'PROPERTY_REF'\n | 'IDENTIFIER'\n | 'OPERATOR'\n | 'LPAREN'\n | 'RPAREN'\n | 'COMMA'\n | 'EOF';\n\nexport interface FormulaToken {\n type: FormulaTokenType;\n value: string;\n position: number;\n}\n\nexport function tokenizeFormula(formula: string): FormulaToken[] {\n const tokens: FormulaToken[] = [];\n // Strip leading '=' if present\n let input = formula.trim();\n let offset = 0;\n if (input.startsWith('=')) {\n input = input.slice(1);\n offset = 1;\n }\n\n let i = 0;\n while (i < input.length) {\n const char = input[i];\n\n // Skip whitespace\n if (/\\s/.test(char)) {\n i++;\n continue;\n }\n\n // Number literal (int or float)\n if (/\\d/.test(char) || (char === '.' && i + 1 < input.length && /\\d/.test(input[i + 1]))) {\n const start = i;\n let hasDot = char === '.';\n i++;\n while (i < input.length && (/\\d/.test(input[i]) || (input[i] === '.' && !hasDot))) {\n if (input[i] === '.') hasDot = true;\n i++;\n }\n tokens.push({\n type: 'NUMBER',\n value: input.slice(start, i),\n position: start + offset\n });\n continue;\n }\n\n // String literal (\"...\" or '...')\n if (char === '\"' || char === \"'\") {\n const quote = char;\n const start = i;\n i++;\n let str = '';\n while (i < input.length && input[i] !== quote) {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n i++;\n }\n str += input[i];\n i++;\n }\n if (i < input.length && input[i] === quote) {\n i++; // skip closing quote\n }\n tokens.push({\n type: 'STRING',\n value: str,\n position: start + offset\n });\n continue;\n }\n\n // Property reference: [property_name] e.g. [status], [title], [effortHours]\n if (char === '[') {\n const start = i;\n i++;\n let prop = '';\n while (i < input.length && input[i] !== ']') {\n prop += input[i];\n i++;\n }\n if (i < input.length && input[i] === ']') {\n i++;\n }\n tokens.push({\n type: 'PROPERTY_REF',\n value: prop.trim(),\n position: start + offset\n });\n continue;\n }\n\n // Single character delimiters\n if (char === '(') {\n tokens.push({ type: 'LPAREN', value: '(', position: i + offset });\n i++;\n continue;\n }\n if (char === ')') {\n tokens.push({ type: 'RPAREN', value: ')', position: i + offset });\n i++;\n continue;\n }\n if (char === ',') {\n tokens.push({ type: 'COMMA', value: ',', position: i + offset });\n i++;\n continue;\n }\n\n // Multi-character comparison operators: <=, >=, <>, !=\n const twoChars = input.slice(i, i + 2);\n if (['<=', '>=', '<>', '!='].includes(twoChars)) {\n tokens.push({\n type: 'OPERATOR',\n value: twoChars === '!=' ? '<>' : twoChars,\n position: i + offset\n });\n i += 2;\n continue;\n }\n\n // Single character operators: +, -, *, /, ^, &, =, <, >\n if (['+', '-', '*', '/', '^', '&', '=', '<', '>'].includes(char)) {\n tokens.push({ type: 'OPERATOR', value: char, position: i + offset });\n i++;\n continue;\n }\n\n // Identifiers, Cell references, and Ranges (e.g. SUM, A1, B2:B10, A:A)\n if (/[a-zA-Z_$]/.test(char)) {\n const start = i;\n while (i < input.length && /[a-zA-Z0-9_$.]/.test(input[i])) {\n i++;\n }\n const rawWord = input.slice(start, i);\n\n // Check if followed by colon indicating a range e.g. A1:B10 or A:A\n if (i < input.length && input[i] === ':') {\n const colonPos = i;\n i++; // skip colon\n const secondStart = i;\n while (i < input.length && /[a-zA-Z0-9_$.]/.test(input[i])) {\n i++;\n }\n const secondWord = input.slice(secondStart, i);\n if (secondWord.length > 0) {\n tokens.push({\n type: 'RANGE',\n value: `${rawWord}:${secondWord}`.toUpperCase(),\n position: start + offset\n });\n continue;\n } else {\n // Revert back\n i = colonPos;\n }\n }\n\n // Check for boolean literal\n const upper = rawWord.toUpperCase();\n if (upper === 'TRUE' || upper === 'FALSE') {\n tokens.push({\n type: 'BOOLEAN',\n value: upper,\n position: start + offset\n });\n continue;\n }\n\n // Check for Cell Reference (e.g. A1, $B$12, AA100)\n if (/^\\$?[A-Za-z]+\\$?[0-9]+$/.test(rawWord)) {\n tokens.push({\n type: 'CELL_REF',\n value: upper.replace(/\\$/g, ''),\n position: start + offset\n });\n continue;\n }\n\n // Function or generic identifier\n tokens.push({\n type: 'IDENTIFIER',\n value: upper,\n position: start + offset\n });\n continue;\n }\n\n // Skip unknown character\n i++;\n }\n\n tokens.push({ type: 'EOF', value: '', position: input.length + offset });\n return tokens;\n}\n","import { FormulaToken, tokenizeFormula, FormulaTokenType } from './lexer';\n\nexport type ASTNode =\n | LiteralNode\n | CellRefNode\n | RangeNode\n | PropertyRefNode\n | BinaryOpNode\n | UnaryOpNode\n | FunctionCallNode;\n\nexport interface LiteralNode {\n type: 'Literal';\n value: number | string | boolean;\n}\n\nexport interface CellRefNode {\n type: 'CellRef';\n ref: string;\n col: string;\n row: number;\n}\n\nexport interface RangeNode {\n type: 'Range';\n raw: string;\n startCol: string;\n startRow: number;\n endCol: string;\n endRow: number;\n}\n\nexport interface PropertyRefNode {\n type: 'PropertyRef';\n property: string;\n}\n\nexport interface BinaryOpNode {\n type: 'BinaryOp';\n op: string;\n left: ASTNode;\n right: ASTNode;\n}\n\nexport interface UnaryOpNode {\n type: 'UnaryOp';\n op: string;\n argument: ASTNode;\n}\n\nexport interface FunctionCallNode {\n type: 'FunctionCall';\n name: string;\n args: ASTNode[];\n}\n\nexport function parseCellReference(ref: string): { col: string; row: number } {\n const match = ref.match(/^([A-Za-z]+)(\\d+)$/);\n if (!match) {\n throw new Error(`Invalid cell reference: ${ref}`);\n }\n return {\n col: match[1].toUpperCase(),\n row: parseInt(match[2], 10)\n };\n}\n\nexport function parseRange(rangeStr: string): RangeNode {\n const [start, end] = rangeStr.split(':');\n const startRef = parseCellReference(start);\n const endRef = parseCellReference(end);\n return {\n type: 'Range',\n raw: rangeStr.toUpperCase(),\n startCol: startRef.col,\n startRow: startRef.row,\n endCol: endRef.col,\n endRow: endRef.row\n };\n}\n\nexport class FormulaParser {\n private tokens: FormulaToken[] = [];\n private current = 0;\n\n constructor(tokens: FormulaToken[]) {\n this.tokens = tokens;\n }\n\n public parse(): ASTNode {\n if (this.peek().type === 'EOF') {\n return { type: 'Literal', value: '' };\n }\n const expr = this.expression();\n if (this.peek().type !== 'EOF') {\n throw new Error(`Unexpected token at position ${this.peek().position}: ${this.peek().value}`);\n }\n return expr;\n }\n\n private expression(): ASTNode {\n return this.comparison();\n }\n\n private comparison(): ASTNode {\n let expr = this.concatenation();\n\n while (\n this.matchOperator('=', '<>', '<', '>', '<=', '>=')\n ) {\n const op = this.previous().value;\n const right = this.concatenation();\n expr = { type: 'BinaryOp', op, left: expr, right };\n }\n\n return expr;\n }\n\n private concatenation(): ASTNode {\n let expr = this.addition();\n\n while (this.matchOperator('&')) {\n const op = this.previous().value;\n const right = this.addition();\n expr = { type: 'BinaryOp', op, left: expr, right };\n }\n\n return expr;\n }\n\n private addition(): ASTNode {\n let expr = this.multiplication();\n\n while (this.matchOperator('+', '-')) {\n const op = this.previous().value;\n const right = this.multiplication();\n expr = { type: 'BinaryOp', op, left: expr, right };\n }\n\n return expr;\n }\n\n private multiplication(): ASTNode {\n let expr = this.exponentiation();\n\n while (this.matchOperator('*', '/')) {\n const op = this.previous().value;\n const right = this.exponentiation();\n expr = { type: 'BinaryOp', op, left: expr, right };\n }\n\n return expr;\n }\n\n private exponentiation(): ASTNode {\n let expr = this.unary();\n\n while (this.matchOperator('^')) {\n const op = this.previous().value;\n const right = this.unary();\n expr = { type: 'BinaryOp', op, left: expr, right };\n }\n\n return expr;\n }\n\n private unary(): ASTNode {\n if (this.matchOperator('-', '+')) {\n const op = this.previous().value;\n const argument = this.unary();\n return { type: 'UnaryOp', op, argument };\n }\n return this.primary();\n }\n\n private primary(): ASTNode {\n const token = this.peek();\n\n if (token.type === 'NUMBER') {\n this.advance();\n return { type: 'Literal', value: parseFloat(token.value) };\n }\n\n if (token.type === 'STRING') {\n this.advance();\n return { type: 'Literal', value: token.value };\n }\n\n if (token.type === 'BOOLEAN') {\n this.advance();\n return { type: 'Literal', value: token.value === 'TRUE' };\n }\n\n if (token.type === 'CELL_REF') {\n this.advance();\n const parsed = parseCellReference(token.value);\n return {\n type: 'CellRef',\n ref: token.value,\n col: parsed.col,\n row: parsed.row\n };\n }\n\n if (token.type === 'RANGE') {\n this.advance();\n return parseRange(token.value);\n }\n\n if (token.type === 'PROPERTY_REF') {\n this.advance();\n return {\n type: 'PropertyRef',\n property: token.value\n };\n }\n\n // Function call e.g. SUM(...)\n if (token.type === 'IDENTIFIER') {\n const name = token.value;\n this.advance();\n\n if (this.check('LPAREN')) {\n this.consume('LPAREN', `Expected '(' after function ${name}`);\n const args: ASTNode[] = [];\n if (!this.check('RPAREN')) {\n do {\n args.push(this.expression());\n } while (this.match('COMMA'));\n }\n this.consume('RPAREN', `Expected ')' after function arguments`);\n return {\n type: 'FunctionCall',\n name,\n args\n };\n }\n\n // Standalone identifier treated as string literal or reference\n return { type: 'Literal', value: name };\n }\n\n if (this.match('LPAREN')) {\n const expr = this.expression();\n this.consume('RPAREN', `Expected ')' after expression`);\n return expr;\n }\n\n throw new Error(`Unexpected token at position ${token.position}: ${token.value || token.type}`);\n }\n\n private match(...types: string[]): boolean {\n for (const type of types) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n\n private matchOperator(...ops: string[]): boolean {\n if (this.check('OPERATOR') && ops.includes(this.peek().value)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private check(type: string): boolean {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n\n private advance(): FormulaToken {\n if (!this.isAtEnd()) this.current++;\n return this.previous();\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === 'EOF';\n }\n\n private peek(): FormulaToken {\n return this.tokens[this.current];\n }\n\n private previous(): FormulaToken {\n return this.tokens[this.current - 1];\n }\n\n private consume(type: string, message: string): FormulaToken {\n if (this.check(type)) return this.advance();\n throw new Error(message);\n }\n}\n\nexport function parseFormula(formula: string): ASTNode {\n const tokens = tokenizeFormula(formula);\n const parser = new FormulaParser(tokens);\n return parser.parse();\n}\n","import { ASTNode, parseFormula } from './parser';\n\nexport interface EvaluationContext {\n resolveCell?: (col: string, row: number) => any;\n resolveRange?: (startCol: string, startRow: number, endCol: string, endRow: number) => any[];\n resolveProperty?: (property: string) => any;\n}\n\nexport function colNameToIndex(col: string): number {\n let index = 0;\n const upper = col.toUpperCase();\n for (let i = 0; i < upper.length; i++) {\n index = index * 26 + (upper.charCodeAt(i) - 65 + 1);\n }\n return index - 1;\n}\n\nexport function indexToColName(index: number): string {\n let num = index + 1;\n let name = '';\n while (num > 0) {\n const mod = (num - 1) % 26;\n name = String.fromCharCode(65 + mod) + name;\n num = Math.floor((num - mod) / 26);\n }\n return name;\n}\n\nexport class FormulaEvaluator {\n private context: EvaluationContext;\n\n constructor(context: EvaluationContext = {}) {\n this.context = context;\n }\n\n public evaluate(astOrFormula: ASTNode | string): any {\n const ast = typeof astOrFormula === 'string' ? parseFormula(astOrFormula) : astOrFormula;\n return this.evaluateNode(ast);\n }\n\n private evaluateNode(node: ASTNode): any {\n switch (node.type) {\n case 'Literal':\n return node.value;\n\n case 'CellRef': {\n if (!this.context.resolveCell) {\n throw new Error(`Cannot resolve cell reference ${node.ref}: no cell resolver provided`);\n }\n return this.context.resolveCell(node.col, node.row);\n }\n\n case 'Range': {\n if (!this.context.resolveRange) {\n throw new Error(`Cannot resolve range ${node.raw}: no range resolver provided`);\n }\n return this.context.resolveRange(node.startCol, node.startRow, node.endCol, node.endRow);\n }\n\n case 'PropertyRef': {\n if (!this.context.resolveProperty) {\n throw new Error(`Cannot resolve property [${node.property}]: no property resolver provided`);\n }\n return this.context.resolveProperty(node.property);\n }\n\n case 'UnaryOp': {\n const val = this.evaluateNode(node.argument);\n if (node.op === '-') return -Number(val);\n if (node.op === '+') return +Number(val);\n throw new Error(`Unsupported unary operator: ${node.op}`);\n }\n\n case 'BinaryOp': {\n const left = this.evaluateNode(node.left);\n const right = this.evaluateNode(node.right);\n\n switch (node.op) {\n case '+':\n return Number(left) + Number(right);\n case '-':\n return Number(left) - Number(right);\n case '*':\n return Number(left) * Number(right);\n case '/': {\n const denom = Number(right);\n if (denom === 0) return '#DIV/0!';\n return Number(left) / denom;\n }\n case '^':\n return Math.pow(Number(left), Number(right));\n case '&':\n return `${left ?? ''}${right ?? ''}`;\n case '=':\n // Relaxed equality\n return String(left).toLowerCase() === String(right).toLowerCase();\n case '<>':\n return String(left).toLowerCase() !== String(right).toLowerCase();\n case '<':\n return Number(left) < Number(right);\n case '<=':\n return Number(left) <= Number(right);\n case '>':\n return Number(left) > Number(right);\n case '>=':\n return Number(left) >= Number(right);\n default:\n throw new Error(`Unsupported binary operator: ${node.op}`);\n }\n }\n\n case 'FunctionCall': {\n return this.callFunction(node.name, node.args);\n }\n\n default:\n throw new Error(`Unknown AST node: ${(node as any).type}`);\n }\n }\n\n private callFunction(name: string, args: ASTNode[]): any {\n const fnName = name.toUpperCase();\n\n // Flatten helper for range/array args\n const evaluateAndFlatten = (): any[] => {\n const items: any[] = [];\n for (const arg of args) {\n const val = this.evaluateNode(arg);\n if (Array.isArray(val)) {\n items.push(...val);\n } else {\n items.push(val);\n }\n }\n return items;\n };\n\n switch (fnName) {\n case 'SUM': {\n const items = evaluateAndFlatten();\n let total = 0;\n for (const item of items) {\n const num = Number(item);\n if (!isNaN(num)) total += num;\n }\n return total;\n }\n\n case 'AVERAGE': {\n const items = evaluateAndFlatten();\n let total = 0;\n let count = 0;\n for (const item of items) {\n const num = Number(item);\n if (!isNaN(num) && item !== '' && item !== null && item !== undefined) {\n total += num;\n count++;\n }\n }\n return count === 0 ? 0 : total / count;\n }\n\n case 'COUNT': {\n const items = evaluateAndFlatten();\n let count = 0;\n for (const item of items) {\n const num = Number(item);\n if (!isNaN(num) && item !== '' && item !== null && item !== undefined) {\n count++;\n }\n }\n return count;\n }\n\n case 'COUNTA': {\n const items = evaluateAndFlatten();\n let count = 0;\n for (const item of items) {\n if (item !== '' && item !== null && item !== undefined) {\n count++;\n }\n }\n return count;\n }\n\n case 'MIN': {\n const items = evaluateAndFlatten().map(Number).filter((n) => !isNaN(n));\n return items.length === 0 ? 0 : Math.min(...items);\n }\n\n case 'MAX': {\n const items = evaluateAndFlatten().map(Number).filter((n) => !isNaN(n));\n return items.length === 0 ? 0 : Math.max(...items);\n }\n\n case 'IF': {\n if (args.length < 2) throw new Error('IF requires at least 2 arguments');\n const condition = Boolean(this.evaluateNode(args[0]));\n if (condition) {\n return this.evaluateNode(args[1]);\n } else {\n return args.length > 2 ? this.evaluateNode(args[2]) : false;\n }\n }\n\n case 'CONCAT': {\n const items = evaluateAndFlatten();\n return items.map((i) => (i === null || i === undefined ? '' : String(i))).join('');\n }\n\n case 'UPPER': {\n if (args.length !== 1) throw new Error('UPPER requires 1 argument');\n const val = this.evaluateNode(args[0]);\n return String(val ?? '').toUpperCase();\n }\n\n case 'LOWER': {\n if (args.length !== 1) throw new Error('LOWER requires 1 argument');\n const val = this.evaluateNode(args[0]);\n return String(val ?? '').toLowerCase();\n }\n\n case 'TRIM': {\n if (args.length !== 1) throw new Error('TRIM requires 1 argument');\n const val = this.evaluateNode(args[0]);\n return String(val ?? '').trim();\n }\n\n case 'LEN': {\n if (args.length !== 1) throw new Error('LEN requires 1 argument');\n const val = this.evaluateNode(args[0]);\n return String(val ?? '').length;\n }\n\n case 'ROUND': {\n if (args.length < 1) throw new Error('ROUND requires at least 1 argument');\n const num = Number(this.evaluateNode(args[0]));\n const decimals = args.length > 1 ? Number(this.evaluateNode(args[1])) : 0;\n const factor = Math.pow(10, decimals);\n return Math.round(num * factor) / factor;\n }\n\n case 'ABS': {\n if (args.length !== 1) throw new Error('ABS requires 1 argument');\n return Math.abs(Number(this.evaluateNode(args[0])));\n }\n\n case 'TODAY': {\n return new Date().toISOString().split('T')[0];\n }\n\n case 'DAYS': {\n if (args.length !== 2) throw new Error('DAYS requires 2 arguments (end_date, start_date)');\n const d1 = new Date(this.evaluateNode(args[0]));\n const d2 = new Date(this.evaluateNode(args[1]));\n const diffTime = d1.getTime() - d2.getTime();\n return Math.round(diffTime / (1000 * 60 * 60 * 24));\n }\n\n default:\n throw new Error(`Unknown function: ${fnName}`);\n }\n }\n}\n","import { ASTNode, parseFormula } from './parser';\nimport { colNameToIndex, indexToColName } from './evaluator';\n\nexport interface CellDep {\n col: string;\n row: number;\n}\n\nexport function extractCellDependencies(node: ASTNode): CellDep[] {\n const deps: CellDep[] = [];\n\n const visit = (curr: ASTNode) => {\n if (curr.type === 'CellRef') {\n deps.push({ col: curr.col, row: curr.row });\n } else if (curr.type === 'Range') {\n const startC = colNameToIndex(curr.startCol);\n const endC = colNameToIndex(curr.endCol);\n const minC = Math.min(startC, endC);\n const maxC = Math.max(startC, endC);\n const minR = Math.min(curr.startRow, curr.endRow);\n const maxR = Math.max(curr.startRow, curr.endRow);\n\n for (let c = minC; c <= maxC; c++) {\n for (let r = minR; r <= maxR; r++) {\n deps.push({ col: indexToColName(c), row: r });\n }\n }\n } else if (curr.type === 'BinaryOp') {\n visit(curr.left);\n visit(curr.right);\n } else if (curr.type === 'UnaryOp') {\n visit(curr.argument);\n } else if (curr.type === 'FunctionCall') {\n curr.args.forEach(visit);\n }\n };\n\n visit(node);\n return deps;\n}\n\nexport class DependencyGraph {\n // Map of cellKey (e.g. \"B2\") -> Set of cellKeys that this cell depends ON\n private dependencies = new Map<string, Set<string>>();\n // Map of cellKey (e.g. \"A1\") -> Set of cellKeys that depend ON this cell (dependents)\n private dependents = new Map<string, Set<string>>();\n\n public setCellFormula(cellKey: string, formulaStr: string | null): void {\n const key = cellKey.toUpperCase();\n\n // Clear existing dependencies\n const oldDeps = this.dependencies.get(key) || new Set();\n for (const dep of oldDeps) {\n this.dependents.get(dep)?.delete(key);\n }\n this.dependencies.delete(key);\n\n if (!formulaStr || !formulaStr.startsWith('=')) {\n return;\n }\n\n try {\n const ast = parseFormula(formulaStr);\n const deps = extractCellDependencies(ast);\n const newDeps = new Set<string>();\n\n for (const d of deps) {\n const depKey = `${d.col}${d.row}`.toUpperCase();\n newDeps.add(depKey);\n\n if (!this.dependents.has(depKey)) {\n this.dependents.set(depKey, new Set());\n }\n this.dependents.get(depKey)!.add(key);\n }\n\n this.dependencies.set(key, newDeps);\n } catch {\n // Syntax errors in formula have no valid dependencies\n }\n }\n\n public getDependencies(cellKey: string): string[] {\n return Array.from(this.dependencies.get(cellKey.toUpperCase()) || []);\n }\n\n public getDependents(cellKey: string): string[] {\n return Array.from(this.dependents.get(cellKey.toUpperCase()) || []);\n }\n\n /**\n * Detects if there is a cycle containing cellKey.\n */\n public hasCycle(cellKey: string): boolean {\n const key = cellKey.toUpperCase();\n const visited = new Set<string>();\n const recStack = new Set<string>();\n\n const dfs = (node: string): boolean => {\n visited.add(node);\n recStack.add(node);\n\n const deps = this.dependencies.get(node) || new Set();\n for (const neighbor of deps) {\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true;\n } else if (recStack.has(neighbor)) {\n return true;\n }\n }\n\n recStack.delete(node);\n return false;\n };\n\n return dfs(key);\n }\n\n /**\n * Returns cells affected by updating cellKey in topological order.\n */\n public getEvaluationOrder(startCellKey: string): { order: string[]; hasCycle: boolean } {\n const start = startCellKey.toUpperCase();\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const order: string[] = [];\n let cycleDetected = false;\n\n // Collect all downstream affected cells (reachability via dependents)\n const affected = new Set<string>();\n const collectAffected = (node: string) => {\n affected.add(node);\n const directDependents = this.dependents.get(node) || new Set();\n for (const dep of directDependents) {\n if (!affected.has(dep)) {\n collectAffected(dep);\n }\n }\n };\n collectAffected(start);\n\n // Topological sort among affected cells\n const visit = (node: string) => {\n if (recStack.has(node)) {\n cycleDetected = true;\n return;\n }\n if (visited.has(node)) return;\n\n recStack.add(node);\n visited.add(node);\n\n // Visit nodes that this node depends on, IF they are in the affected set\n const deps = this.dependencies.get(node) || new Set();\n for (const neighbor of deps) {\n if (affected.has(neighbor)) {\n visit(neighbor);\n }\n }\n\n recStack.delete(node);\n order.push(node);\n };\n\n for (const node of affected) {\n if (!visited.has(node)) {\n visit(node);\n }\n }\n\n return { order, hasCycle: cycleDetected };\n }\n}\n","import { SpreadsheetDataSource, SpreadsheetRow, SpreadsheetColumn } from '../types';\n\nexport class DataSourceBinder {\n private dataSources = new Map<string, SpreadsheetDataSource>();\n\n public register(dataSource: SpreadsheetDataSource): void {\n this.dataSources.set(dataSource.id, dataSource);\n }\n\n public unregister(dataSourceId: string): void {\n this.dataSources.delete(dataSourceId);\n }\n\n public getDataSource(id: string): SpreadsheetDataSource | undefined {\n return this.dataSources.get(id);\n }\n\n /**\n * Generates or reconciles spreadsheet rows from a primary data source.\n */\n public syncRows(\n currentRows: SpreadsheetRow[],\n dataSourceId: string\n ): SpreadsheetRow[] {\n const ds = this.dataSources.get(dataSourceId);\n if (!ds) return currentRows;\n\n const records = ds.getRecords();\n const existingRecordRowMap = new Map<string, SpreadsheetRow>();\n const freeformRows: SpreadsheetRow[] = [];\n\n for (const row of currentRows) {\n if (row.type === 'record' && row.recordId) {\n existingRecordRowMap.set(row.recordId, row);\n } else {\n freeformRows.push(row);\n }\n }\n\n const nextRows: SpreadsheetRow[] = [];\n let rowIndex = 0;\n\n for (const record of records) {\n const existing = existingRecordRowMap.get(record.id);\n nextRows.push({\n id: existing?.id || `row_${record.id}`,\n index: rowIndex++,\n height: existing?.height || 32,\n recordId: record.id,\n type: 'record'\n });\n existingRecordRowMap.delete(record.id);\n }\n\n // Append preserved freeform rows\n for (const freeform of freeformRows) {\n nextRows.push({\n ...freeform,\n index: rowIndex++\n });\n }\n\n return nextRows;\n }\n\n /**\n * Resolves a record's bound field value.\n */\n public resolveBoundValue(\n dataSourceId: string,\n recordId: string,\n field: string\n ): any {\n const ds = this.dataSources.get(dataSourceId);\n if (!ds) return undefined;\n\n const records = ds.getRecords();\n const record = records.find((r) => r.id === recordId);\n return record ? record[field] : undefined;\n }\n\n /**\n * Dispatches an update to the underlying data source.\n */\n public async commitBoundValue(\n dataSourceId: string,\n recordId: string,\n field: string,\n value: any\n ): Promise<void> {\n const ds = this.dataSources.get(dataSourceId);\n if (!ds) return;\n await ds.updateRecord(recordId, field, value);\n }\n}\n","import {\n SpreadsheetDocument,\n SpreadsheetColumn,\n SpreadsheetRow,\n CellCoordinate,\n CellRange,\n CellData,\n SpreadsheetDataSource\n} from './types';\nimport {\n FormulaEvaluator,\n colNameToIndex,\n indexToColName,\n DependencyGraph\n} from './formula';\nimport { DataSourceBinder } from './datasource';\n\nexport interface SpreadsheetControllerOptions {\n document?: Partial<SpreadsheetDocument>;\n dataSources?: SpreadsheetDataSource[];\n primaryDataSourceId?: string;\n onDocumentChange?: (doc: SpreadsheetDocument) => void;\n onSelectionChange?: (activeCell: CellCoordinate | null, range: CellRange | null) => void;\n onCellCommit?: (rowId: string, colId: string, raw: string, value: any) => void;\n}\n\nexport class SpreadsheetController {\n public document: SpreadsheetDocument;\n public activeCell: CellCoordinate | null = null;\n public selectedRange: CellRange | null = null;\n public editingCell: CellCoordinate | null = null;\n public draftValue = '';\n\n public readonly binder = new DataSourceBinder();\n public readonly depGraph = new DependencyGraph();\n public readonly evaluator: FormulaEvaluator;\n\n private primaryDataSourceId?: string;\n private onDocumentChange?: (doc: SpreadsheetDocument) => void;\n private onSelectionChange?: (activeCell: CellCoordinate | null, range: CellRange | null) => void;\n private onCellCommit?: (rowId: string, colId: string, raw: string, value: any) => void;\n\n // History stack for undo/redo\n private undoStack: string[] = [];\n private redoStack: string[] = [];\n private isApplyingHistory = false;\n\n constructor(options: SpreadsheetControllerOptions = {}) {\n const defaultCols: SpreadsheetColumn[] = [\n { id: 'col_a', key: 'A', title: 'A', width: 120, type: 'freeform' },\n { id: 'col_b', key: 'B', title: 'B', width: 120, type: 'freeform' },\n { id: 'col_c', key: 'C', title: 'C', width: 120, type: 'freeform' },\n { id: 'col_d', key: 'D', title: 'D', width: 120, type: 'freeform' }\n ];\n\n const defaultRows: SpreadsheetRow[] = options.primaryDataSourceId ? [] : Array.from({ length: 10 }, (_, i) => ({\n id: `row_${i + 1}`,\n index: i,\n height: 32,\n type: 'freeform'\n }));\n\n this.document = {\n id: options.document?.id || `sheet_${Date.now()}`,\n name: options.document?.name || 'Sheet 1',\n columns: options.document?.columns || defaultCols,\n rows: options.document?.rows || defaultRows,\n cells: options.document?.cells || {},\n createdAt: options.document?.createdAt || Date.now(),\n updatedAt: options.document?.updatedAt || Date.now()\n };\n\n this.primaryDataSourceId = options.primaryDataSourceId;\n this.onDocumentChange = options.onDocumentChange;\n this.onSelectionChange = options.onSelectionChange;\n this.onCellCommit = options.onCellCommit;\n\n if (options.dataSources) {\n options.dataSources.forEach((ds) => this.binder.register(ds));\n }\n\n this.evaluator = new FormulaEvaluator({\n resolveCell: (colStr, rowNum) => this.resolveCellByCoord(colStr, rowNum),\n resolveRange: (sCol, sRow, eCol, eRow) => this.resolveRangeByCoords(sCol, sRow, eCol, eRow),\n resolveProperty: (prop) => this.resolveCurrentRowProperty(prop)\n });\n\n this.syncWithDataSource();\n this.recalculateAll();\n }\n\n public loadDocument(document: SpreadsheetDocument): void {\n this.document = JSON.parse(JSON.stringify(document));\n this.activeCell = null;\n this.selectedRange = null;\n this.editingCell = null;\n this.draftValue = '';\n this.undoStack = [];\n this.redoStack = [];\n this.syncWithDataSource();\n this.recalculateAll();\n this.notifyChange();\n }\n\n public registerDataSource(ds: SpreadsheetDataSource): void {\n this.binder.register(ds);\n this.syncWithDataSource();\n this.recalculateAll();\n }\n\n public setPrimaryDataSource(dataSourceId: string | undefined): void {\n this.primaryDataSourceId = dataSourceId;\n this.syncWithDataSource();\n this.recalculateAll();\n }\n\n public syncWithDataSource(): void {\n if (!this.primaryDataSourceId) return;\n this.document.rows = this.binder.syncRows(this.document.rows, this.primaryDataSourceId);\n this.recomputeRowIndices();\n }\n\n private recomputeRowIndices(): void {\n this.document.rows.forEach((r, idx) => {\n r.index = idx;\n });\n this.document.columns.forEach((c, idx) => {\n c.key = indexToColName(idx);\n });\n }\n\n public getColumn(colIdOrKey: string): SpreadsheetColumn | undefined {\n return this.document.columns.find(\n (c) => c.id === colIdOrKey || c.key.toUpperCase() === colIdOrKey.toUpperCase()\n );\n }\n\n public getRow(rowIdOrIndex: string | number): SpreadsheetRow | undefined {\n if (typeof rowIdOrIndex === 'number') {\n return this.document.rows[rowIdOrIndex];\n }\n return this.document.rows.find((r) => r.id === rowIdOrIndex);\n }\n\n public getCell(rowId: string, colId: string): CellData {\n const existing = this.document.cells[rowId]?.[colId];\n if (existing) return existing;\n\n // Check if column is bound to record\n const col = this.document.columns.find((c) => c.id === colId);\n const row = this.document.rows.find((r) => r.id === rowId);\n\n if (col && row && col.type === 'bound' && col.binding && row.recordId) {\n const boundVal = this.binder.resolveBoundValue(\n col.binding.dataSource,\n row.recordId,\n col.binding.field\n );\n return {\n raw: boundVal !== undefined ? String(boundVal) : '',\n value: boundVal ?? '',\n format: col.format\n };\n }\n\n // Check if column has a column-level formula\n if (col && col.type === 'formula' && col.formula) {\n return {\n raw: col.formula,\n value: '',\n format: col.format\n };\n }\n\n return { raw: '', value: '', format: col?.format };\n }\n\n public setCellValue(rowId: string, colId: string, raw: string): void {\n this.recordSnapshot();\n\n if (!this.document.cells[rowId]) {\n this.document.cells[rowId] = {};\n }\n\n const col = this.document.columns.find((c) => c.id === colId);\n const row = this.document.rows.find((r) => r.id === rowId);\n\n // If this is a bound column and row is bound to record, dispatch back to data source\n if (col?.type === 'bound' && col.binding && row?.recordId) {\n this.binder.commitBoundValue(\n col.binding.dataSource,\n row.recordId,\n col.binding.field,\n raw\n );\n }\n\n const cellKey = this.getCellKey(rowId, colId);\n this.depGraph.setCellFormula(cellKey, raw.startsWith('=') ? raw : null);\n\n this.document.cells[rowId][colId] = {\n raw,\n value: raw,\n format: col?.format\n };\n\n this.document.updatedAt = Date.now();\n this.recalculateCell(rowId, colId);\n this.notifyChange();\n\n const evaluatedVal = this.document.cells[rowId][colId]?.value;\n this.onCellCommit?.(rowId, colId, raw, evaluatedVal);\n }\n\n private getCellKey(rowId: string, colId: string): string {\n const row = this.document.rows.find((r) => r.id === rowId);\n const col = this.document.columns.find((c) => c.id === colId);\n if (!row || !col) return `${colId}_${rowId}`;\n return `${col.key}${row.index + 1}`.toUpperCase();\n }\n\n public recalculateCell(rowId: string, colId: string): void {\n const cellKey = this.getCellKey(rowId, colId);\n const { order, hasCycle } = this.depGraph.getEvaluationOrder(cellKey);\n\n if (hasCycle) {\n if (this.document.cells[rowId]?.[colId]) {\n this.document.cells[rowId][colId].error = '#CYCLE!';\n this.document.cells[rowId][colId].value = '#CYCLE!';\n }\n return;\n }\n\n for (const key of order) {\n this.evalSingleCellByKey(key);\n }\n }\n\n public recalculateAll(): void {\n for (const row of this.document.rows) {\n for (const col of this.document.columns) {\n const cell = this.getCell(row.id, col.id);\n const cellKey = `${col.key}${row.index + 1}`.toUpperCase();\n if (cell.raw.startsWith('=')) {\n this.depGraph.setCellFormula(cellKey, cell.raw);\n }\n }\n }\n\n for (const row of this.document.rows) {\n for (const col of this.document.columns) {\n const cellKey = `${col.key}${row.index + 1}`.toUpperCase();\n this.evalSingleCellByKey(cellKey);\n }\n }\n }\n\n private evalSingleCellByKey(cellKey: string): void {\n const match = cellKey.match(/^([A-Za-z]+)(\\d+)$/);\n if (!match) return;\n const colName = match[1].toUpperCase();\n const rowNum = parseInt(match[2], 10);\n\n const col = this.document.columns.find((c) => c.key.toUpperCase() === colName);\n const row = this.document.rows[rowNum - 1];\n if (!col || !row) return;\n\n const cell = this.getCell(row.id, col.id);\n if (!cell.raw.startsWith('=')) {\n if (cell.error === '#CYCLE!') {\n cell.error = undefined;\n }\n return;\n }\n\n try {\n const computed = this.evaluator.evaluate(cell.raw);\n if (!this.document.cells[row.id]) {\n this.document.cells[row.id] = {};\n }\n this.document.cells[row.id][col.id] = {\n ...cell,\n value: computed,\n error: undefined\n };\n } catch (err: any) {\n if (!this.document.cells[row.id]) {\n this.document.cells[row.id] = {};\n }\n this.document.cells[row.id][col.id] = {\n ...cell,\n value: '#ERROR!',\n error: err?.message || 'Formula error'\n };\n }\n }\n\n private resolveCellByCoord(colStr: string, rowNum: number): any {\n const col = this.document.columns.find((c) => c.key.toUpperCase() === colStr.toUpperCase());\n const row = this.document.rows[rowNum - 1];\n if (!col || !row) return 0;\n\n const cell = this.getCell(row.id, col.id);\n return cell.value !== undefined && cell.value !== '' ? cell.value : 0;\n }\n\n private resolveRangeByCoords(sCol: string, sRow: number, eCol: string, eRow: number): any[] {\n const startC = colNameToIndex(sCol);\n const endC = colNameToIndex(eCol);\n const minC = Math.min(startC, endC);\n const maxC = Math.max(startC, endC);\n const minR = Math.min(sRow, eRow);\n const maxR = Math.max(sRow, eRow);\n\n const results: any[] = [];\n for (let c = minC; c <= maxC; c++) {\n const colName = indexToColName(c);\n const col = this.document.columns.find((colDef) => colDef.key.toUpperCase() === colName);\n if (!col) continue;\n\n for (let r = minR; r <= maxR; r++) {\n const row = this.document.rows[r - 1];\n if (!row) continue;\n const cell = this.getCell(row.id, col.id);\n results.push(cell.value !== undefined && cell.value !== '' ? cell.value : 0);\n }\n }\n return results;\n }\n\n private resolveCurrentRowProperty(prop: string): any {\n if (!this.activeCell) return 0;\n const row = this.document.rows[this.activeCell.row];\n if (!row || !row.recordId || !this.primaryDataSourceId) return 0;\n return this.binder.resolveBoundValue(this.primaryDataSourceId, row.recordId, prop) ?? 0;\n }\n\n // --- Selection and Navigation ---\n\n public selectCell(row: number, col: number, extendSelection = false): void {\n const clampedRow = Math.max(0, Math.min(row, this.document.rows.length - 1));\n const clampedCol = Math.max(0, Math.min(col, this.document.columns.length - 1));\n\n const rowObj = this.document.rows[clampedRow];\n const colObj = this.document.columns[clampedCol];\n\n this.activeCell = {\n row: clampedRow,\n col: clampedCol,\n rowId: rowObj?.id,\n colId: colObj?.id\n };\n\n if (extendSelection && this.selectedRange) {\n this.selectedRange = {\n startRow: this.selectedRange.startRow,\n startCol: this.selectedRange.startCol,\n endRow: clampedRow,\n endCol: clampedCol\n };\n } else {\n this.selectedRange = {\n startRow: clampedRow,\n startCol: clampedCol,\n endRow: clampedRow,\n endCol: clampedCol\n };\n }\n\n this.onSelectionChange?.(this.activeCell, this.selectedRange);\n }\n\n public selectRange(range: CellRange): void {\n this.selectedRange = range;\n this.onSelectionChange?.(this.activeCell, this.selectedRange);\n }\n\n public startEditing(row?: number, col?: number, initialValue?: string): void {\n const targetRow = row ?? this.activeCell?.row ?? 0;\n const targetCol = col ?? this.activeCell?.col ?? 0;\n this.selectCell(targetRow, targetCol);\n\n const rowObj = this.document.rows[targetRow];\n const colObj = this.document.columns[targetCol];\n if (!rowObj || !colObj) return;\n\n this.editingCell = {\n row: targetRow,\n col: targetCol,\n rowId: rowObj.id,\n colId: colObj.id\n };\n\n const cell = this.getCell(rowObj.id, colObj.id);\n this.draftValue = initialValue !== undefined ? initialValue : cell.raw;\n }\n\n public commitEditing(valueToCommit?: string): void {\n if (!this.editingCell) return;\n const val = valueToCommit !== undefined ? valueToCommit : this.draftValue;\n if (this.editingCell.rowId && this.editingCell.colId) {\n this.setCellValue(this.editingCell.rowId, this.editingCell.colId, val);\n }\n this.editingCell = null;\n this.draftValue = '';\n }\n\n public cancelEditing(): void {\n this.editingCell = null;\n this.draftValue = '';\n }\n\n public moveCursor(\n direction: 'up' | 'down' | 'left' | 'right',\n extendSelection = false\n ): void {\n if (!this.activeCell) {\n this.selectCell(0, 0);\n return;\n }\n\n let nextRow = this.activeCell.row;\n let nextCol = this.activeCell.col;\n\n switch (direction) {\n case 'up':\n nextRow = Math.max(0, nextRow - 1);\n break;\n case 'down':\n nextRow = Math.min(this.document.rows.length - 1, nextRow + 1);\n break;\n case 'left':\n nextCol = Math.max(0, nextCol - 1);\n break;\n case 'right':\n nextCol = Math.min(this.document.columns.length - 1, nextCol + 1);\n break;\n }\n\n this.selectCell(nextRow, nextCol, extendSelection);\n }\n\n // --- Grid Structure Mutations ---\n\n public insertColumn(index: number, config?: Partial<SpreadsheetColumn>): void {\n this.recordSnapshot();\n const newId = config?.id || `col_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;\n const newCol: SpreadsheetColumn = {\n id: newId,\n key: indexToColName(index),\n title: config?.title || indexToColName(index),\n width: config?.width || 130,\n type: config?.type || 'freeform',\n binding: config?.binding,\n formula: config?.formula,\n format: config?.format || 'text',\n readOnly: config?.readOnly\n };\n\n this.document.columns.splice(index, 0, newCol);\n this.recomputeRowIndices();\n this.recalculateAll();\n this.notifyChange();\n }\n\n public deleteColumn(colId: string): void {\n this.recordSnapshot();\n this.document.columns = this.document.columns.filter((c) => c.id !== colId);\n for (const rowId of Object.keys(this.document.cells)) {\n delete this.document.cells[rowId][colId];\n }\n this.recomputeRowIndices();\n this.recalculateAll();\n this.notifyChange();\n }\n\n public insertRow(index: number, config?: Partial<SpreadsheetRow>): void {\n this.recordSnapshot();\n const newId = config?.id || `row_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;\n const newRow: SpreadsheetRow = {\n id: newId,\n index,\n height: config?.height || 32,\n recordId: config?.recordId,\n type: config?.type || 'freeform'\n };\n\n this.document.rows.splice(index, 0, newRow);\n this.recomputeRowIndices();\n this.recalculateAll();\n this.notifyChange();\n }\n\n public deleteRow(rowId: string): void {\n this.recordSnapshot();\n this.document.rows = this.document.rows.filter((r) => r.id !== rowId);\n delete this.document.cells[rowId];\n this.recomputeRowIndices();\n this.recalculateAll();\n this.notifyChange();\n }\n\n public setColumnWidth(colId: string, width: number): void {\n const col = this.document.columns.find((c) => c.id === colId);\n if (col) {\n col.width = Math.max(30, width);\n this.notifyChange();\n }\n }\n\n public autoFitColumnWidth(colId: string, customWidth?: number): void {\n if (customWidth !== undefined) {\n this.setColumnWidth(colId, customWidth);\n return;\n }\n const col = this.document.columns.find((c) => c.id === colId);\n if (!col) return;\n\n let maxLen = (col.title || '').length + (col.key ? col.key.length + 3 : 0);\n for (const row of this.document.rows) {\n const cell = this.getCell(row.id, col.id);\n const valStr = cell.value != null ? String(cell.value) : '';\n if (valStr.length > maxLen) {\n maxLen = valStr.length;\n }\n }\n const estimatedWidth = Math.min(600, Math.max(50, Math.ceil(maxLen * 8.5 + 32)));\n this.setColumnWidth(colId, estimatedWidth);\n }\n\n // --- Clipboard TSV/CSV ---\n\n public exportToTsv(): string {\n return this.document.rows\n .map((row) =>\n this.document.columns\n .map((col) => {\n const cell = this.getCell(row.id, col.id);\n return String(cell.value ?? '').replace(/\\t/g, ' ');\n })\n .join('\\t')\n )\n .join('\\n');\n }\n\n public importFromTsv(tsvData: string, startRow = 0, startCol = 0): void {\n this.recordSnapshot();\n const lines = tsvData.trim().split('\\n');\n\n lines.forEach((line, rIdx) => {\n const cells = line.split('\\t');\n const targetR = startRow + rIdx;\n\n while (targetR >= this.document.rows.length) {\n this.insertRow(this.document.rows.length);\n }\n const row = this.document.rows[targetR];\n\n cells.forEach((val, cIdx) => {\n const targetC = startCol + cIdx;\n while (targetC >= this.document.columns.length) {\n this.insertColumn(this.document.columns.length);\n }\n const col = this.document.columns[targetC];\n this.setCellValue(row.id, col.id, val);\n });\n });\n\n this.recalculateAll();\n this.notifyChange();\n }\n\n // --- Undo/Redo Snapshots ---\n\n private recordSnapshot(): void {\n if (this.isApplyingHistory) return;\n this.undoStack.push(JSON.stringify(this.document));\n if (this.undoStack.length > 50) this.undoStack.shift();\n this.redoStack = [];\n }\n\n public undo(): void {\n if (this.undoStack.length === 0) return;\n this.isApplyingHistory = true;\n this.redoStack.push(JSON.stringify(this.document));\n const previous = JSON.parse(this.undoStack.pop()!);\n this.document = previous;\n this.recalculateAll();\n this.notifyChange();\n this.isApplyingHistory = false;\n }\n\n public redo(): void {\n if (this.redoStack.length === 0) return;\n this.isApplyingHistory = true;\n this.undoStack.push(JSON.stringify(this.document));\n const next = JSON.parse(this.redoStack.pop()!);\n this.document = next;\n this.recalculateAll();\n this.notifyChange();\n this.isApplyingHistory = false;\n }\n\n private notifyChange(): void {\n this.onDocumentChange?.(this.document);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -210,4 +210,4 @@ interface CanvasDockingCallbacks<TNode extends CanvasNode = CanvasNode> {
|
|
|
210
210
|
onDockDrop?: (dockTarget: TNode, draggedNode: TNode) => void;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export type {
|
|
213
|
+
export type { CanvasNode as C, DirectionalDisplacementOptions as D, ExplodeNodeOptions as E, FanOutTrajectoryOptions as F, GraphDifferences as G, IncrementalLayoutOptions as I, NodeTransition as N, PlaceBesideOptions as P, Rect as R, Side as S, TrajectoryFunction as T, XYPosition as X, CanvasEdge as a, CanvasLayoutOptions as b, ReflowDisplacementOptions as c, CanvasClipboardPayload as d, CanvasDockingCallbacks as e, CollapseNodeOptions as f, DisplacementDirection as g, DockStrategy as h, ExplosionSnapshot as i, Point as j, Position as k, TrajectoryPoint as l };
|
|
@@ -210,4 +210,4 @@ interface CanvasDockingCallbacks<TNode extends CanvasNode = CanvasNode> {
|
|
|
210
210
|
onDockDrop?: (dockTarget: TNode, draggedNode: TNode) => void;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export type {
|
|
213
|
+
export type { CanvasNode as C, DirectionalDisplacementOptions as D, ExplodeNodeOptions as E, FanOutTrajectoryOptions as F, GraphDifferences as G, IncrementalLayoutOptions as I, NodeTransition as N, PlaceBesideOptions as P, Rect as R, Side as S, TrajectoryFunction as T, XYPosition as X, CanvasEdge as a, CanvasLayoutOptions as b, ReflowDisplacementOptions as c, CanvasClipboardPayload as d, CanvasDockingCallbacks as e, CollapseNodeOptions as f, DisplacementDirection as g, DockStrategy as h, ExplosionSnapshot as i, Point as j, Position as k, TrajectoryPoint as l };
|