@bilig/formula 0.7.8 → 0.8.1

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.
Files changed (57) hide show
  1. package/dist/binder-wasm-arity.d.ts +1 -0
  2. package/dist/binder-wasm-arity.js +541 -0
  3. package/dist/binder-wasm-arity.js.map +1 -0
  4. package/dist/binder-wasm-rules.d.ts +1 -2
  5. package/dist/binder-wasm-rules.js +2 -540
  6. package/dist/binder-wasm-rules.js.map +1 -1
  7. package/dist/builtins/cell-value-utils.d.ts +9 -0
  8. package/dist/builtins/cell-value-utils.js +63 -0
  9. package/dist/builtins/cell-value-utils.js.map +1 -0
  10. package/dist/builtins/datetime.d.ts +2 -10
  11. package/dist/builtins/datetime.js +5 -261
  12. package/dist/builtins/datetime.js.map +1 -1
  13. package/dist/builtins/excel-date.d.ts +16 -0
  14. package/dist/builtins/excel-date.js +199 -0
  15. package/dist/builtins/excel-date.js.map +1 -0
  16. package/dist/builtins/lookup-core-helpers.d.ts +50 -0
  17. package/dist/builtins/lookup-core-helpers.js +342 -0
  18. package/dist/builtins/lookup-core-helpers.js.map +1 -0
  19. package/dist/builtins/lookup.d.ts +3 -25
  20. package/dist/builtins/lookup.js +3 -341
  21. package/dist/builtins/lookup.js.map +1 -1
  22. package/dist/formula-reference-translation.d.ts +20 -0
  23. package/dist/formula-reference-translation.js +273 -0
  24. package/dist/formula-reference-translation.js.map +1 -0
  25. package/dist/formula-serializer.d.ts +2 -0
  26. package/dist/formula-serializer.js +74 -0
  27. package/dist/formula-serializer.js.map +1 -0
  28. package/dist/formula-sheet-rename.d.ts +14 -0
  29. package/dist/formula-sheet-rename.js +243 -0
  30. package/dist/formula-sheet-rename.js.map +1 -0
  31. package/dist/formula-structural-rewrite.d.ts +14 -0
  32. package/dist/formula-structural-rewrite.js +511 -0
  33. package/dist/formula-structural-rewrite.js.map +1 -0
  34. package/dist/formula-template-key.d.ts +2 -0
  35. package/dist/formula-template-key.js +58 -0
  36. package/dist/formula-template-key.js.map +1 -1
  37. package/dist/js-evaluator-cell-values.d.ts +5 -0
  38. package/dist/js-evaluator-cell-values.js +14 -0
  39. package/dist/js-evaluator-cell-values.js.map +1 -0
  40. package/dist/js-evaluator-context-special-calls.js +72 -0
  41. package/dist/js-evaluator-context-special-calls.js.map +1 -1
  42. package/dist/js-evaluator-runtime-helpers.d.ts +39 -0
  43. package/dist/js-evaluator-runtime-helpers.js +453 -0
  44. package/dist/js-evaluator-runtime-helpers.js.map +1 -0
  45. package/dist/js-evaluator-types.d.ts +178 -0
  46. package/dist/js-evaluator-types.js +2 -0
  47. package/dist/js-evaluator-types.js.map +1 -0
  48. package/dist/js-evaluator.d.ts +4 -178
  49. package/dist/js-evaluator.js +3 -463
  50. package/dist/js-evaluator.js.map +1 -1
  51. package/dist/translation-reference-utils.d.ts +42 -0
  52. package/dist/translation-reference-utils.js +178 -0
  53. package/dist/translation-reference-utils.js.map +1 -0
  54. package/dist/translation.d.ts +6 -32
  55. package/dist/translation.js +14 -1300
  56. package/dist/translation.js.map +1 -1
  57. package/package.json +2 -2
@@ -0,0 +1,273 @@
1
+ import { formatRangeAddress, parseCellAddress, parseRangeAddress } from './addressing.js';
2
+ import { formatAxisReference, formatCellReference, parseAxisReferenceParts, parseCellReferenceParts, quoteSheetNameIfNeeded, } from './translation-reference-utils.js';
3
+ export function translateParsedCellReference(reference, rowDelta, colDelta) {
4
+ const parts = reference.rowAbsolute !== undefined && reference.colAbsolute !== undefined && reference.row !== undefined && reference.col !== undefined
5
+ ? {
6
+ row: reference.row,
7
+ col: reference.col,
8
+ rowAbsolute: reference.rowAbsolute,
9
+ colAbsolute: reference.colAbsolute,
10
+ }
11
+ : parseCellReferenceParts(reference.address);
12
+ if (!parts) {
13
+ return reference;
14
+ }
15
+ const nextRow = parts.rowAbsolute ? parts.row : parts.row + rowDelta;
16
+ const nextCol = parts.colAbsolute ? parts.col : parts.col + colDelta;
17
+ const nextLocalAddress = formatCellReference(parts, nextRow, nextCol);
18
+ const nextAddress = reference.explicitSheet || reference.sheetName !== undefined
19
+ ? formatQualifiedCellReference(reference.sheetName, nextLocalAddress)
20
+ : nextLocalAddress;
21
+ return {
22
+ ...reference,
23
+ address: nextAddress,
24
+ ...(reference.sheetName !== undefined ? { sheetName: reference.sheetName } : {}),
25
+ ...(reference.explicitSheet !== undefined ? { explicitSheet: reference.explicitSheet } : {}),
26
+ ...(reference.row !== undefined ? { row: nextRow } : {}),
27
+ ...(reference.col !== undefined ? { col: nextCol } : {}),
28
+ ...(reference.rowAbsolute !== undefined ? { rowAbsolute: parts.rowAbsolute } : {}),
29
+ ...(reference.colAbsolute !== undefined ? { colAbsolute: parts.colAbsolute } : {}),
30
+ };
31
+ }
32
+ export function translateParsedRangeReference(reference, rowDelta, colDelta) {
33
+ const nextRange = translateParsedRangeReferenceInfo(reference, rowDelta, colDelta);
34
+ const bounds = nextRange.refKind === 'cells'
35
+ ? {
36
+ startRow: nextRange.startRow,
37
+ endRow: nextRange.endRow,
38
+ startCol: nextRange.startCol,
39
+ endCol: nextRange.endCol,
40
+ }
41
+ : nextRange.refKind === 'rows'
42
+ ? {
43
+ startRow: nextRange.startRow,
44
+ endRow: nextRange.endRow,
45
+ startCol: 0,
46
+ endCol: 0,
47
+ }
48
+ : {
49
+ startRow: 0,
50
+ endRow: 0,
51
+ startCol: nextRange.startCol,
52
+ endCol: nextRange.endCol,
53
+ };
54
+ return {
55
+ ...reference,
56
+ address: formatParsedRangeReference(nextRange),
57
+ refKind: nextRange.refKind,
58
+ startAddress: nextRange.startAddress,
59
+ endAddress: nextRange.endAddress,
60
+ ...bounds,
61
+ ...(reference.explicitSheet !== undefined ? { explicitSheet: reference.explicitSheet } : {}),
62
+ };
63
+ }
64
+ export function translateParsedDependencyReference(reference, rowDelta, colDelta) {
65
+ return reference.kind === 'cell'
66
+ ? translateParsedCellReference(reference, rowDelta, colDelta)
67
+ : translateParsedRangeReference(reference, rowDelta, colDelta);
68
+ }
69
+ export function translateQualifiedCellReference(raw, rowDelta, colDelta) {
70
+ const explicitlyQualified = raw.includes('!');
71
+ const parsed = parseCellAddress(raw);
72
+ const nextAddress = translateCellReference(parsed.text, rowDelta, colDelta);
73
+ return explicitlyQualified ? formatQualifiedCellReference(parsed.sheetName, nextAddress) : nextAddress;
74
+ }
75
+ export function formatParsedCellReference(reference) {
76
+ const localAddress = formatParsedLocalCellReference(reference);
77
+ return reference.explicitSheet || reference.sheetName !== undefined
78
+ ? formatQualifiedCellReference(reference.sheetName, localAddress)
79
+ : localAddress;
80
+ }
81
+ export function formatParsedLocalCellReference(reference) {
82
+ const parts = reference.row !== undefined && reference.col !== undefined && reference.rowAbsolute !== undefined && reference.colAbsolute !== undefined
83
+ ? {
84
+ row: reference.row,
85
+ col: reference.col,
86
+ rowAbsolute: reference.rowAbsolute,
87
+ colAbsolute: reference.colAbsolute,
88
+ }
89
+ : parseCellReferenceParts(reference.address);
90
+ if (!parts) {
91
+ return stripSheetQualifier(reference.address);
92
+ }
93
+ return formatCellReference(parts, parts.row, parts.col);
94
+ }
95
+ export function formatParsedRangeReference(reference) {
96
+ return formatQualifiedRangeReference(reference.explicitSheet ? reference.sheetName : undefined, reference.startAddress, reference.endAddress);
97
+ }
98
+ export function translatedCellInstructionKey(sheetName, address) {
99
+ return `${sheetName ?? ''}\t${address}`;
100
+ }
101
+ export function translatedRangeInstructionKey(sheetName, refKind, start, end) {
102
+ return `${sheetName ?? ''}\t${refKind}\t${start}\t${end}`;
103
+ }
104
+ export function buildTranslatedCellReferenceMap(original, translated) {
105
+ const output = new Map();
106
+ if (!original || !translated || original.length !== translated.length) {
107
+ return output;
108
+ }
109
+ for (let index = 0; index < original.length; index += 1) {
110
+ const source = original[index];
111
+ const target = translated[index];
112
+ if (!source || !target) {
113
+ continue;
114
+ }
115
+ output.set(translatedCellInstructionKey(source.sheetName, formatParsedLocalCellReference(source)), target);
116
+ }
117
+ return output;
118
+ }
119
+ export function buildTranslatedRangeReferenceMap(original, translated) {
120
+ const output = new Map();
121
+ if (!original || !translated || original.length !== translated.length) {
122
+ return output;
123
+ }
124
+ for (let index = 0; index < original.length; index += 1) {
125
+ const source = original[index];
126
+ const target = translated[index];
127
+ if (!source || !target) {
128
+ continue;
129
+ }
130
+ output.set(translatedRangeInstructionKey(source.sheetName, source.refKind, source.startAddress, source.endAddress), target);
131
+ }
132
+ return output;
133
+ }
134
+ export function formatParsedDependencyReference(reference) {
135
+ return reference.kind === 'cell' ? formatParsedCellReference(reference) : formatParsedRangeReference(reference);
136
+ }
137
+ export function translateQualifiedDependencyReference(raw, rowDelta, colDelta) {
138
+ if (!raw.includes(':')) {
139
+ return translateQualifiedCellReference(raw, rowDelta, colDelta);
140
+ }
141
+ return translateQualifiedRangeReference(raw, rowDelta, colDelta);
142
+ }
143
+ export function translateQualifiedRangeReference(raw, rowDelta, colDelta) {
144
+ const explicitlyQualified = raw.includes('!');
145
+ const parsed = parseRangeAddress(raw);
146
+ const nextRange = translateRangeAddress(parsed, rowDelta, colDelta);
147
+ if (explicitlyQualified) {
148
+ return formatRangeAddress(nextRange);
149
+ }
150
+ return `${nextRange.start.text}:${nextRange.end.text}`;
151
+ }
152
+ export function translateRangeAddress(range, rowDelta, colDelta) {
153
+ switch (range.kind) {
154
+ case 'cells': {
155
+ const startAddress = translateCellReference(range.start.text, rowDelta, colDelta);
156
+ const endAddress = translateCellReference(range.end.text, rowDelta, colDelta);
157
+ return parseRangeAddress(formatQualifiedRangeReference(range.sheetName, startAddress, endAddress));
158
+ }
159
+ case 'rows': {
160
+ const start = translateRowReference(range.start.text, rowDelta);
161
+ const end = translateRowReference(range.end.text, rowDelta);
162
+ return parseRangeAddress(formatQualifiedRangeReference(range.sheetName, start, end));
163
+ }
164
+ case 'cols': {
165
+ const start = translateColumnReference(range.start.text, colDelta);
166
+ const end = translateColumnReference(range.end.text, colDelta);
167
+ return parseRangeAddress(formatQualifiedRangeReference(range.sheetName, start, end));
168
+ }
169
+ }
170
+ }
171
+ export function translateCellReference(ref, rowDelta, colDelta) {
172
+ const parsed = parseCellReferenceParts(ref);
173
+ if (!parsed) {
174
+ throw new Error(`Invalid cell reference '${ref}'`);
175
+ }
176
+ const nextCol = parsed.colAbsolute ? parsed.col : parsed.col + colDelta;
177
+ const nextRow = parsed.rowAbsolute ? parsed.row : parsed.row + rowDelta;
178
+ if (nextCol < 0 || nextRow < 0) {
179
+ throw new Error(`Translated reference moved outside worksheet bounds: ${ref}`);
180
+ }
181
+ return formatCellReference(parsed, nextRow, nextCol);
182
+ }
183
+ export function translateColumnReference(ref, colDelta) {
184
+ const parsed = parseAxisReferenceParts(ref, 'column');
185
+ if (!parsed) {
186
+ throw new Error(`Invalid column reference '${ref}'`);
187
+ }
188
+ const nextCol = parsed.absolute ? parsed.index : parsed.index + colDelta;
189
+ if (nextCol < 0) {
190
+ throw new Error(`Translated reference moved outside worksheet bounds: ${ref}`);
191
+ }
192
+ return formatAxisReference(parsed.absolute, nextCol, 'column');
193
+ }
194
+ export function translateRowReference(ref, rowDelta) {
195
+ const parsed = parseAxisReferenceParts(ref, 'row');
196
+ if (!parsed) {
197
+ throw new Error(`Invalid row reference '${ref}'`);
198
+ }
199
+ const nextRow = parsed.absolute ? parsed.index : parsed.index + rowDelta;
200
+ if (nextRow < 0) {
201
+ throw new Error(`Translated reference moved outside worksheet bounds: ${ref}`);
202
+ }
203
+ return formatAxisReference(parsed.absolute, nextRow, 'row');
204
+ }
205
+ function translateParsedRangeReferenceInfo(reference, rowDelta, colDelta) {
206
+ if (reference.refKind === 'cells') {
207
+ const startRow = (reference.startRowAbsolute ?? false) ? reference.startRow : reference.startRow + rowDelta;
208
+ const endRow = (reference.endRowAbsolute ?? false) ? reference.endRow : reference.endRow + rowDelta;
209
+ const startCol = (reference.startColAbsolute ?? false) ? reference.startCol : reference.startCol + colDelta;
210
+ const endCol = (reference.endColAbsolute ?? false) ? reference.endCol : reference.endCol + colDelta;
211
+ const startAddress = formatCellReference({
212
+ row: reference.startRow,
213
+ col: reference.startCol,
214
+ rowAbsolute: reference.startRowAbsolute ?? false,
215
+ colAbsolute: reference.startColAbsolute ?? false,
216
+ }, startRow, startCol);
217
+ const endAddress = formatCellReference({
218
+ row: reference.endRow,
219
+ col: reference.endCol,
220
+ rowAbsolute: reference.endRowAbsolute ?? false,
221
+ colAbsolute: reference.endColAbsolute ?? false,
222
+ }, endRow, endCol);
223
+ return {
224
+ ...reference,
225
+ startAddress,
226
+ endAddress,
227
+ startRow,
228
+ endRow,
229
+ startCol,
230
+ endCol,
231
+ };
232
+ }
233
+ if (reference.refKind === 'rows') {
234
+ const startRow = (reference.startRowAbsolute ?? false) ? reference.startRow : reference.startRow + rowDelta;
235
+ const endRow = (reference.endRowAbsolute ?? false) ? reference.endRow : reference.endRow + rowDelta;
236
+ return {
237
+ ...reference,
238
+ startAddress: formatAxisReference(reference.startRowAbsolute ?? false, startRow, 'row'),
239
+ endAddress: formatAxisReference(reference.endRowAbsolute ?? false, endRow, 'row'),
240
+ startRow,
241
+ endRow,
242
+ startCol: 0,
243
+ endCol: 0,
244
+ };
245
+ }
246
+ const startCol = (reference.startColAbsolute ?? false) ? reference.startCol : reference.startCol + colDelta;
247
+ const endCol = (reference.endColAbsolute ?? false) ? reference.endCol : reference.endCol + colDelta;
248
+ return {
249
+ ...reference,
250
+ startAddress: formatAxisReference(reference.startColAbsolute ?? false, startCol, 'column'),
251
+ endAddress: formatAxisReference(reference.endColAbsolute ?? false, endCol, 'column'),
252
+ startRow: 0,
253
+ endRow: 0,
254
+ startCol,
255
+ endCol,
256
+ };
257
+ }
258
+ function stripSheetQualifier(reference) {
259
+ const bang = reference.lastIndexOf('!');
260
+ return bang === -1 ? reference : reference.slice(bang + 1);
261
+ }
262
+ function formatQualifiedCellReference(sheetName, address) {
263
+ if (!sheetName) {
264
+ return address;
265
+ }
266
+ const parsed = parseCellAddress(address, sheetName);
267
+ return `${quoteSheetNameIfNeeded(sheetName)}!${parsed.text}`;
268
+ }
269
+ function formatQualifiedRangeReference(sheetName, start, end) {
270
+ const prefix = sheetName ? `${quoteSheetNameIfNeeded(sheetName)}!` : '';
271
+ return `${prefix}${start}:${end}`;
272
+ }
273
+ //# sourceMappingURL=formula-reference-translation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formula-reference-translation.js","sourceRoot":"","sources":["../src/formula-reference-translation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FormulaNode } from './ast.js';
2
+ export declare function serializeFormula(node: FormulaNode, parentPrecedence?: number, parentAssociativity?: 'left' | 'right' | null): string;
@@ -0,0 +1,74 @@
1
+ import { ErrorCode } from '@bilig/protocol';
2
+ import { formatSheetPrefix } from './translation-reference-utils.js';
3
+ const BINARY_PRECEDENCE = {
4
+ '=': 1,
5
+ '<>': 1,
6
+ '>': 1,
7
+ '>=': 1,
8
+ '<': 1,
9
+ '<=': 1,
10
+ '&': 2,
11
+ '+': 3,
12
+ '-': 3,
13
+ '*': 4,
14
+ '/': 4,
15
+ '^': 5,
16
+ };
17
+ const ERROR_LITERAL_TEXT = {
18
+ [ErrorCode.Ref]: '#REF!',
19
+ [ErrorCode.Name]: '#NAME?',
20
+ [ErrorCode.Div0]: '#DIV/0!',
21
+ [ErrorCode.NA]: '#N/A',
22
+ [ErrorCode.Value]: '#VALUE!',
23
+ [ErrorCode.Cycle]: '#CYCLE!',
24
+ [ErrorCode.Spill]: '#SPILL!',
25
+ [ErrorCode.Blocked]: '#BLOCKED!',
26
+ };
27
+ export function serializeFormula(node, parentPrecedence = 0, parentAssociativity = null) {
28
+ switch (node.kind) {
29
+ case 'NumberLiteral':
30
+ return String(node.value);
31
+ case 'BooleanLiteral':
32
+ return node.value ? 'TRUE' : 'FALSE';
33
+ case 'StringLiteral':
34
+ return `"${node.value.replaceAll('"', '""')}"`;
35
+ case 'ErrorLiteral':
36
+ return ERROR_LITERAL_TEXT[node.code] ?? '#ERROR!';
37
+ case 'NameRef':
38
+ return node.name;
39
+ case 'StructuredRef':
40
+ return `${node.tableName}[${node.columnName}]`;
41
+ case 'CellRef':
42
+ return `${formatSheetPrefix(node.sheetName)}${node.ref}`;
43
+ case 'SpillRef':
44
+ return `${formatSheetPrefix(node.sheetName)}${node.ref}#`;
45
+ case 'ColumnRef':
46
+ return `${formatSheetPrefix(node.sheetName)}${node.ref}`;
47
+ case 'RowRef':
48
+ return `${formatSheetPrefix(node.sheetName)}${node.ref}`;
49
+ case 'RangeRef':
50
+ return `${formatSheetPrefix(node.sheetName)}${node.start}:${node.end}`;
51
+ case 'UnaryExpr':
52
+ return `${node.operator}${serializeFormula(node.argument, 6)}`;
53
+ case 'CallExpr':
54
+ return `${node.callee}(${node.args.map((arg) => serializeFormula(arg)).join(',')})`;
55
+ case 'InvokeExpr': {
56
+ const callee = node.callee.kind === 'CallExpr' || node.callee.kind === 'InvokeExpr'
57
+ ? serializeFormula(node.callee)
58
+ : `(${serializeFormula(node.callee)})`;
59
+ return `${callee}(${node.args.map((arg) => serializeFormula(arg)).join(',')})`;
60
+ }
61
+ case 'BinaryExpr': {
62
+ const precedence = BINARY_PRECEDENCE[node.operator];
63
+ const isRightAssociative = node.operator === '^';
64
+ const left = serializeFormula(node.left, precedence, 'left');
65
+ const right = serializeFormula(node.right, precedence, 'right');
66
+ const output = `${left}${node.operator}${right}`;
67
+ const needsParens = precedence < parentPrecedence ||
68
+ (precedence === parentPrecedence &&
69
+ ((parentAssociativity === 'left' && isRightAssociative) || (parentAssociativity === 'right' && !isRightAssociative)));
70
+ return needsParens ? `(${output})` : output;
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=formula-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formula-serializer.js","sourceRoot":"","sources":["../src/formula-serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CompiledFormula } from './compiler.js';
2
+ export interface RenamedCompiledFormula {
3
+ source: string;
4
+ compiled: CompiledFormula;
5
+ reusedProgram: boolean;
6
+ }
7
+ export interface CompiledFormulaSheetRenameMetadataResult {
8
+ compiled: CompiledFormula;
9
+ sourceChanged: boolean;
10
+ }
11
+ export declare function renameFormulaSheetReferences(source: string, oldSheetName: string, newSheetName: string): string;
12
+ export declare function renameCompiledFormulaSheetReferences(compiled: CompiledFormula, oldSheetName: string, newSheetName: string): RenamedCompiledFormula;
13
+ export declare function renameCompiledFormulaSheetReferenceMetadata(compiled: CompiledFormula, oldSheetName: string, newSheetName: string): CompiledFormulaSheetRenameMetadataResult;
14
+ export declare function renameCompiledFormulaSheetReferenceMetadataInPlace(compiled: CompiledFormula, oldSheetName: string, newSheetName: string): boolean;
@@ -0,0 +1,243 @@
1
+ import { parseFormula } from './parser.js';
2
+ import { serializeFormula } from './formula-serializer.js';
3
+ import { quoteSheetNameIfNeeded } from './translation-reference-utils.js';
4
+ export function renameFormulaSheetReferences(source, oldSheetName, newSheetName) {
5
+ const ast = parseFormula(source);
6
+ return serializeFormula(renameNodeSheetReferences(ast, oldSheetName, newSheetName));
7
+ }
8
+ export function renameCompiledFormulaSheetReferences(compiled, oldSheetName, newSheetName) {
9
+ const currentAst = compiled.astMatchesSource === false ? parseFormula(compiled.source) : compiled.ast;
10
+ const currentOptimizedAst = compiled.astMatchesSource === false ? currentAst : compiled.optimizedAst === compiled.ast ? currentAst : compiled.optimizedAst;
11
+ const renamedAst = renameNodeSheetReferences(currentAst, oldSheetName, newSheetName);
12
+ const renamedOptimizedAst = currentOptimizedAst === currentAst ? renamedAst : renameNodeSheetReferences(currentOptimizedAst, oldSheetName, newSheetName);
13
+ const source = serializeFormula(renamedAst);
14
+ return {
15
+ source,
16
+ compiled: {
17
+ ...compiled,
18
+ source,
19
+ ast: renamedAst,
20
+ optimizedAst: renamedOptimizedAst,
21
+ astMatchesSource: true,
22
+ deps: compiled.deps.map((dependency) => renameQualifiedReferenceSheet(dependency, oldSheetName, newSheetName)),
23
+ ...(compiled.parsedDeps
24
+ ? {
25
+ parsedDeps: compiled.parsedDeps.map((dependency) => renameParsedDependencySheet(dependency, oldSheetName, newSheetName)),
26
+ }
27
+ : {}),
28
+ jsPlan: renameJsPlanSheetReferences(compiled.jsPlan, oldSheetName, newSheetName),
29
+ symbolicRefs: compiled.symbolicRefs.map((reference) => renameQualifiedReferenceSheet(reference, oldSheetName, newSheetName)),
30
+ ...(compiled.parsedSymbolicRefs
31
+ ? {
32
+ parsedSymbolicRefs: compiled.parsedSymbolicRefs.map((reference) => renameParsedCellReferenceSheet(reference, oldSheetName, newSheetName)),
33
+ }
34
+ : {}),
35
+ symbolicRanges: compiled.symbolicRanges.map((reference) => renameQualifiedReferenceSheet(reference, oldSheetName, newSheetName)),
36
+ ...(compiled.parsedSymbolicRanges
37
+ ? {
38
+ parsedSymbolicRanges: compiled.parsedSymbolicRanges.map((reference) => renameParsedRangeReferenceSheet(reference, oldSheetName, newSheetName)),
39
+ }
40
+ : {}),
41
+ },
42
+ reusedProgram: true,
43
+ };
44
+ }
45
+ function renameArraySheetReferences(values, rename) {
46
+ let changed = false;
47
+ const next = values.map((value) => {
48
+ const renamed = rename(value);
49
+ if (renamed !== value) {
50
+ changed = true;
51
+ }
52
+ return renamed;
53
+ });
54
+ return { values: next, changed };
55
+ }
56
+ export function renameCompiledFormulaSheetReferenceMetadata(compiled, oldSheetName, newSheetName) {
57
+ const deps = renameArraySheetReferences(compiled.deps, (dependency) => renameQualifiedReferenceSheet(dependency, oldSheetName, newSheetName));
58
+ const symbolicRefs = renameArraySheetReferences(compiled.symbolicRefs, (reference) => renameQualifiedReferenceSheet(reference, oldSheetName, newSheetName));
59
+ const symbolicRanges = renameArraySheetReferences(compiled.symbolicRanges, (reference) => renameQualifiedReferenceSheet(reference, oldSheetName, newSheetName));
60
+ const parsedDeps = compiled.parsedDeps
61
+ ? renameArraySheetReferences(compiled.parsedDeps, (dependency) => renameParsedDependencySheet(dependency, oldSheetName, newSheetName))
62
+ : undefined;
63
+ const parsedSymbolicRefs = compiled.parsedSymbolicRefs
64
+ ? renameArraySheetReferences(compiled.parsedSymbolicRefs, (reference) => renameParsedCellReferenceSheet(reference, oldSheetName, newSheetName))
65
+ : undefined;
66
+ const parsedSymbolicRanges = compiled.parsedSymbolicRanges
67
+ ? renameArraySheetReferences(compiled.parsedSymbolicRanges, (reference) => renameParsedRangeReferenceSheet(reference, oldSheetName, newSheetName))
68
+ : undefined;
69
+ const jsPlan = renameJsPlanSheetReferences(compiled.jsPlan, oldSheetName, newSheetName);
70
+ return {
71
+ compiled: {
72
+ ...compiled,
73
+ astMatchesSource: false,
74
+ deps: deps.values,
75
+ ...(parsedDeps ? { parsedDeps: parsedDeps.values } : {}),
76
+ jsPlan,
77
+ symbolicRefs: symbolicRefs.values,
78
+ ...(parsedSymbolicRefs ? { parsedSymbolicRefs: parsedSymbolicRefs.values } : {}),
79
+ symbolicRanges: symbolicRanges.values,
80
+ ...(parsedSymbolicRanges ? { parsedSymbolicRanges: parsedSymbolicRanges.values } : {}),
81
+ },
82
+ sourceChanged: deps.changed ||
83
+ symbolicRefs.changed ||
84
+ symbolicRanges.changed ||
85
+ (parsedDeps?.changed ?? false) ||
86
+ (parsedSymbolicRefs?.changed ?? false) ||
87
+ (parsedSymbolicRanges?.changed ?? false),
88
+ };
89
+ }
90
+ export function renameCompiledFormulaSheetReferenceMetadataInPlace(compiled, oldSheetName, newSheetName) {
91
+ let sourceChanged = false;
92
+ const renameStringArrayInPlace = (values) => {
93
+ for (let index = 0; index < values.length; index += 1) {
94
+ const value = values[index];
95
+ const renamed = renameQualifiedReferenceSheet(value, oldSheetName, newSheetName);
96
+ if (renamed !== value) {
97
+ values[index] = renamed;
98
+ sourceChanged = true;
99
+ }
100
+ }
101
+ };
102
+ renameStringArrayInPlace(compiled.deps);
103
+ renameStringArrayInPlace(compiled.symbolicRefs);
104
+ renameStringArrayInPlace(compiled.symbolicRanges);
105
+ compiled.parsedDeps?.forEach((dependency) => {
106
+ const previousSheetName = dependency.sheetName;
107
+ if (previousSheetName === oldSheetName) {
108
+ dependency.sheetName = newSheetName;
109
+ sourceChanged = true;
110
+ }
111
+ });
112
+ compiled.parsedSymbolicRefs?.forEach((reference) => {
113
+ if (reference.sheetName === oldSheetName) {
114
+ reference.sheetName = newSheetName;
115
+ sourceChanged = true;
116
+ }
117
+ });
118
+ compiled.parsedSymbolicRanges?.forEach((reference) => {
119
+ if (reference.sheetName === oldSheetName) {
120
+ reference.sheetName = newSheetName;
121
+ sourceChanged = true;
122
+ }
123
+ });
124
+ if (compiled.jsPlan.length > 0) {
125
+ compiled.jsPlan = renameJsPlanSheetReferences(compiled.jsPlan, oldSheetName, newSheetName);
126
+ }
127
+ if (sourceChanged) {
128
+ compiled.astMatchesSource = false;
129
+ }
130
+ return sourceChanged;
131
+ }
132
+ function renameNodeSheetReferences(node, oldSheetName, newSheetName) {
133
+ switch (node.kind) {
134
+ case 'NumberLiteral':
135
+ case 'BooleanLiteral':
136
+ case 'StringLiteral':
137
+ case 'ErrorLiteral':
138
+ case 'NameRef':
139
+ case 'StructuredRef':
140
+ return node;
141
+ case 'CellRef':
142
+ case 'SpillRef':
143
+ case 'RowRef':
144
+ case 'ColumnRef':
145
+ case 'RangeRef':
146
+ return {
147
+ ...node,
148
+ ...(node.sheetName === oldSheetName ? { sheetName: newSheetName } : {}),
149
+ };
150
+ case 'UnaryExpr':
151
+ return {
152
+ ...node,
153
+ argument: renameNodeSheetReferences(node.argument, oldSheetName, newSheetName),
154
+ };
155
+ case 'BinaryExpr':
156
+ return {
157
+ ...node,
158
+ left: renameNodeSheetReferences(node.left, oldSheetName, newSheetName),
159
+ right: renameNodeSheetReferences(node.right, oldSheetName, newSheetName),
160
+ };
161
+ case 'CallExpr':
162
+ return {
163
+ ...node,
164
+ args: node.args.map((arg) => renameNodeSheetReferences(arg, oldSheetName, newSheetName)),
165
+ };
166
+ case 'InvokeExpr':
167
+ return {
168
+ ...node,
169
+ callee: renameNodeSheetReferences(node.callee, oldSheetName, newSheetName),
170
+ args: node.args.map((arg) => renameNodeSheetReferences(arg, oldSheetName, newSheetName)),
171
+ };
172
+ }
173
+ }
174
+ function renameQualifiedReferenceSheet(reference, oldSheetName, newSheetName) {
175
+ const quotedOldPrefix = `${quoteSheetNameIfNeeded(oldSheetName)}!`;
176
+ if (reference.startsWith(quotedOldPrefix)) {
177
+ return `${quoteSheetNameIfNeeded(newSheetName)}!${reference.slice(quotedOldPrefix.length)}`;
178
+ }
179
+ const rawOldPrefix = `${oldSheetName}!`;
180
+ return reference.startsWith(rawOldPrefix) ? `${quoteSheetNameIfNeeded(newSheetName)}!${reference.slice(rawOldPrefix.length)}` : reference;
181
+ }
182
+ function renameParsedCellReferenceSheet(reference, oldSheetName, newSheetName) {
183
+ return reference.sheetName === oldSheetName ? { ...reference, sheetName: newSheetName } : reference;
184
+ }
185
+ function renameParsedRangeReferenceSheet(reference, oldSheetName, newSheetName) {
186
+ return reference.sheetName === oldSheetName
187
+ ? {
188
+ ...reference,
189
+ sheetName: newSheetName,
190
+ address: formatQualifiedRangeReference(newSheetName, reference.startAddress, reference.endAddress),
191
+ }
192
+ : reference;
193
+ }
194
+ function renameParsedDependencySheet(dependency, oldSheetName, newSheetName) {
195
+ return dependency.kind === 'cell'
196
+ ? renameParsedCellReferenceSheet(dependency, oldSheetName, newSheetName)
197
+ : renameParsedRangeReferenceSheet(dependency, oldSheetName, newSheetName);
198
+ }
199
+ function renameReferenceOperandSheet(operand, oldSheetName, newSheetName) {
200
+ return operand?.sheetName === oldSheetName ? { ...operand, sheetName: newSheetName } : operand;
201
+ }
202
+ function renameJsPlanSheetReferences(plan, oldSheetName, newSheetName) {
203
+ return plan.map((instruction) => {
204
+ switch (instruction.opcode) {
205
+ case 'push-cell':
206
+ case 'push-range':
207
+ case 'lookup-exact-match':
208
+ case 'lookup-approximate-match':
209
+ return instruction.sheetName === oldSheetName ? { ...instruction, sheetName: newSheetName } : instruction;
210
+ case 'push-lambda':
211
+ return { ...instruction, body: renameJsPlanSheetReferences(instruction.body, oldSheetName, newSheetName) };
212
+ case 'call':
213
+ return instruction.argRefs
214
+ ? {
215
+ ...instruction,
216
+ argRefs: instruction.argRefs.map((operand) => renameReferenceOperandSheet(operand, oldSheetName, newSheetName)),
217
+ }
218
+ : instruction;
219
+ case 'begin-scope':
220
+ case 'binary':
221
+ case 'bind-name':
222
+ case 'end-scope':
223
+ case 'invoke':
224
+ case 'jump':
225
+ case 'jump-if-false':
226
+ case 'push-boolean':
227
+ case 'push-error':
228
+ case 'push-name':
229
+ case 'push-number':
230
+ case 'push-string':
231
+ case 'return':
232
+ case 'unary':
233
+ return instruction;
234
+ default:
235
+ return instruction;
236
+ }
237
+ });
238
+ }
239
+ function formatQualifiedRangeReference(sheetName, start, end) {
240
+ const prefix = sheetName ? `${quoteSheetNameIfNeeded(sheetName)}!` : '';
241
+ return `${prefix}${start}:${end}`;
242
+ }
243
+ //# sourceMappingURL=formula-sheet-rename.js.map