@ricsam/formula-engine 0.2.10 → 0.2.11

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.
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/named-expression-manager.ts"],
4
4
  "sourcesContent": [
5
- "import type { NamedExpression } from \"../types.cjs\";\nimport type { NamedExpressionManagerSnapshot } from \"../engine-snapshot.cjs\";\nimport { renameNamedExpressionInFormula } from \"../named-expression-renamer.cjs\";\nimport type { EventManager } from \"./event-manager.cjs\";\nimport type { NamedExpressionNode } from \"../../parser/ast.cjs\";\nimport type { EvaluationContext } from \"../../evaluator/evaluation-context.cjs\";\nimport { getNamedExpressionResourceKey } from \"../resource-keys.cjs\";\n\nexport class NamedExpressionManager {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>> =\n new Map();\n workbookExpressions: Map<string, Map<string, NamedExpression>> = new Map();\n globalExpressions: Map<string, NamedExpression> = new Map();\n\n addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n const namedExpression: NamedExpression = {\n name: expressionName,\n expression,\n };\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n let wbLevel = this.sheetExpressions.get(workbookName);\n if (!wbLevel) {\n wbLevel = new Map();\n this.sheetExpressions.set(workbookName, wbLevel);\n }\n\n let sheetLevel = wbLevel.get(sheetName);\n if (!sheetLevel) {\n sheetLevel = new Map();\n wbLevel.set(sheetName, sheetLevel);\n }\n\n sheetLevel.set(expressionName, namedExpression);\n } else if (workbookName) {\n let workbookNamedExpressions = this.workbookExpressions.get(workbookName);\n if (!workbookNamedExpressions) {\n workbookNamedExpressions = new Map();\n this.workbookExpressions.set(workbookName, workbookNamedExpressions);\n }\n\n workbookNamedExpressions.set(expressionName, namedExpression);\n } else {\n this.globalExpressions.set(expressionName, namedExpression);\n }\n }\n\n removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n let found = false;\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n found = sheetLevel.delete(expressionName);\n }\n }\n } else if (workbookName) {\n const workbookNamedExpressions =\n this.workbookExpressions.get(workbookName);\n if (workbookNamedExpressions) {\n found = workbookNamedExpressions.delete(expressionName);\n }\n } else {\n found = this.globalExpressions.delete(expressionName);\n }\n\n return found;\n }\n\n updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n // Check if the named expression exists\n let exists = false;\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n exists = sheetLevel.has(expressionName);\n }\n }\n } else if (workbookName) {\n const workbookNamedExpressions =\n this.workbookExpressions.get(workbookName);\n if (workbookNamedExpressions) {\n exists = workbookNamedExpressions.has(expressionName);\n }\n } else {\n exists = this.globalExpressions.has(expressionName);\n }\n\n if (!exists) {\n throw new Error(`Named expression '${expressionName}' does not exist`);\n }\n\n // Update is the same as add for existing expressions\n this.addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n }\n\n renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): boolean {\n // Check if the named expression exists\n let targetMap: Map<string, NamedExpression> | undefined;\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n let isGlobal = false;\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n targetMap = sheetLevel;\n }\n }\n } else if (workbookName) {\n targetMap = this.workbookExpressions.get(workbookName);\n } else {\n targetMap = this.globalExpressions;\n isGlobal = true;\n }\n\n if (!targetMap || !targetMap.has(expressionName)) {\n throw new Error(`Named expression '${expressionName}' does not exist`);\n }\n\n // Check if the new name already exists\n if (targetMap.has(newName)) {\n throw new Error(`Named expression '${newName}' already exists`);\n }\n\n // Get the expression to rename\n const namedExpression = targetMap.get(expressionName)!;\n\n // Update the name and re-add with new name\n const updatedExpression = { ...namedExpression, name: newName };\n targetMap.set(newName, updatedExpression);\n targetMap.delete(expressionName);\n\n return true;\n }\n\n updateAllNamedExpressions(\n updateCallback: (formula: string) => string\n ): string[] {\n const changed = new Set<string>();\n\n const update = (\n map: Map<string, NamedExpression>,\n opts: { workbookName?: string; sheetName?: string }\n ) => {\n map.forEach((namedExpr, name) => {\n // Don't update the expression we're renaming\n const updatedExpression = updateCallback(namedExpr.expression);\n\n if (updatedExpression !== namedExpr.expression) {\n map.set(name, {\n ...namedExpr,\n expression: updatedExpression,\n });\n changed.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n );\n }\n });\n };\n\n update(this.globalExpressions, {});\n\n this.workbookExpressions.forEach((workbookLevel, workbookName) => {\n update(workbookLevel, { workbookName });\n });\n\n this.sheetExpressions.forEach((wbLevel, workbookName) => {\n wbLevel.forEach((sheetLevel, sheetName) => {\n update(sheetLevel, { workbookName, sheetName });\n });\n });\n\n return Array.from(changed);\n }\n\n /**\n * Replace all named expressions\n */\n setNamedExpressions(\n opts: (\n | {\n type: \"global\";\n }\n | {\n type: \"sheet\";\n sheetName: string;\n workbookName: string;\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n let map: Map<string, NamedExpression> | undefined;\n\n if (opts.type === \"sheet\") {\n map = this.sheetExpressions.get(opts.workbookName)?.get(opts.sheetName);\n } else if (opts.type === \"workbook\") {\n map = this.workbookExpressions.get(opts.workbookName);\n } else {\n map = this.globalExpressions;\n }\n\n if (!map) {\n throw new Error(\"Invalid options: \" + JSON.stringify(opts));\n }\n\n map.clear();\n\n opts.expressions.forEach((expression, name) => {\n map.set(name, expression);\n });\n }\n\n getNamedExpression(depNode: {\n name: string;\n scope:\n | {\n type: \"global\";\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n | {\n type: \"sheet\";\n workbookName: string;\n sheetName: string;\n };\n }): NamedExpression | undefined {\n if (depNode.scope.type === \"global\") {\n return this.globalExpressions.get(depNode.name);\n }\n if (depNode.scope.type === \"workbook\") {\n return this.workbookExpressions\n .get(depNode.scope.workbookName)\n ?.get(depNode.name);\n }\n if (depNode.scope.type === \"sheet\") {\n return this.sheetExpressions\n .get(depNode.scope.workbookName)\n ?.get(depNode.scope.sheetName)\n ?.get(depNode.name);\n }\n return undefined;\n }\n\n resolveNamedExpressionWithScope(\n namedExpression: Pick<\n NamedExpressionNode,\n \"name\" | \"sheetName\" | \"workbookName\"\n >,\n context: EvaluationContext\n ):\n | {\n expression: string;\n scope:\n | { type: \"global\" }\n | { type: \"workbook\"; workbookName: string }\n | { type: \"sheet\"; workbookName: string; sheetName: string };\n }\n | undefined {\n // scenario 1: no sheetName nor workbookName\n if (!namedExpression.sheetName && !namedExpression.workbookName) {\n /**\n * the result of this formula will differ based on in which sheet and workbook we are\n * evaluating it in.\n */\n context.addContextDependency(\"sheet\", \"workbook\");\n\n // step 1, check if there is a named expression in the sheet scope\n const expression = this.sheetExpressions\n .get(context.cellAddress.workbookName)\n ?.get(context.cellAddress.sheetName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: context.cellAddress.workbookName,\n sheetName: context.cellAddress.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the workbook scope\n const expression = this.workbookExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: context.cellAddress.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n\n // scenario 2: we only have a workbookName - a bit weird, but could happen\n if (namedExpression.workbookName && !namedExpression.sheetName) {\n // special case: if workbook is the current workbook, we should just resolve the named expression according to scenario 1\n if (\n namedExpression.workbookName ===\n context.cellAddress.workbookName\n ) {\n return this.resolveNamedExpressionWithScope(\n {\n name: namedExpression.name,\n },\n context\n );\n }\n\n const expression = this.workbookExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n // step 1, check if there is a named expression in the workbook scope\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: namedExpression.workbookName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n\n // scenario 3: we only have a sheetName\n if (namedExpression.sheetName && !namedExpression.workbookName) {\n const expression = this.sheetExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.sheetName)\n ?.get(namedExpression.name);\n /**\n * the result of this formula will differ based on in which workbook we are\n * evaluating it in.\n */\n context.addContextDependency(\"workbook\");\n if (expression) {\n // step 1, check if there is a named expression in the current workbook against the sheet name\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: context.cellAddress.workbookName,\n sheetName: namedExpression.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the current workbook has a workbook scoped named expression\n const expression = this.workbookExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: context.cellAddress.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n\n // scenario 4: we have both sheetName and workbookName\n if (namedExpression.sheetName && namedExpression.workbookName) {\n const expression = this.sheetExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.sheetName)\n ?.get(namedExpression.name);\n if (expression) {\n // step 1, check if there is a named expression the the sheet scope\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: namedExpression.workbookName,\n sheetName: namedExpression.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the workbook scope\n const expression = this.workbookExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: namedExpression.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n }\n\n resolveNamedExpression(\n namedExpression: Pick<\n NamedExpressionNode,\n \"name\" | \"sheetName\" | \"workbookName\"\n >,\n context: EvaluationContext\n ): string | undefined {\n return this.resolveNamedExpressionWithScope(namedExpression, context)\n ?.expression;\n }\n\n getNamedExpressions() {\n return {\n sheetExpressions: this.sheetExpressions,\n workbookExpressions: this.workbookExpressions,\n globalExpressions: this.globalExpressions,\n };\n }\n\n resetNamedExpressions(\n namedExpressions: ReturnType<typeof this.getNamedExpressions>\n ) {\n this.setNamedExpressions({\n type: \"global\",\n expressions: namedExpressions.globalExpressions,\n });\n\n namedExpressions.workbookExpressions.forEach(\n (workbookExpressions, workbookName) => {\n this.setNamedExpressions({\n type: \"workbook\",\n expressions: workbookExpressions,\n workbookName,\n });\n }\n );\n\n namedExpressions.sheetExpressions.forEach(\n (sheetExpressions, workbookName) => {\n sheetExpressions.forEach((sheetExpression, sheetName) => {\n this.setNamedExpressions({\n type: \"sheet\",\n expressions: sheetExpression,\n sheetName,\n workbookName,\n });\n });\n }\n );\n }\n\n toSnapshot(): NamedExpressionManagerSnapshot {\n return this.getNamedExpressions();\n }\n\n restoreFromSnapshot(snapshot: NamedExpressionManagerSnapshot) {\n this.resetNamedExpressions(snapshot);\n }\n\n /**\n * When adding a sheet, we need to initialize the new maps\n */\n addSheet(opts: { workbookName: string; sheetName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n const sheetLevel = wbLevel.get(opts.sheetName);\n if (sheetLevel) {\n throw new Error(\"Sheet already exists\");\n }\n wbLevel.set(opts.sheetName, new Map());\n }\n\n /**\n * When adding a workbook, we need to initialize the new maps\n */\n addWorkbook(workbookName: string) {\n this.sheetExpressions.set(workbookName, new Map());\n this.workbookExpressions.set(workbookName, new Map());\n }\n\n /**\n * When removing a workbook, we need to remove the workbook from the sheet level\n */\n removeWorkbook(workbookName: string) {\n this.sheetExpressions.delete(workbookName);\n this.workbookExpressions.delete(workbookName);\n }\n\n /**\n * When removing a sheet, we need to remove the sheet from the workbook level\n */\n removeSheet(opts: { workbookName: string; sheetName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n wbLevel.delete(opts.sheetName);\n }\n\n /**\n * Rename a sheet's named expressions, mainly used when renaming a sheet\n */\n renameSheet(options: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n const wbLevel = this.sheetExpressions.get(options.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n const sheetLevel = wbLevel.get(options.sheetName);\n if (!sheetLevel) {\n throw new Error(\"Sheet not found\");\n }\n wbLevel.set(options.newSheetName, sheetLevel);\n wbLevel.delete(options.sheetName);\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n this.sheetExpressions.set(opts.newWorkbookName, wbLevel);\n this.sheetExpressions.delete(opts.workbookName);\n\n const wbScopedExpressions = this.workbookExpressions.get(opts.workbookName);\n if (!wbScopedExpressions) {\n throw new Error(\"Workbook not found\");\n }\n this.workbookExpressions.set(opts.newWorkbookName, wbScopedExpressions);\n this.workbookExpressions.delete(opts.workbookName);\n }\n}\n"
5
+ "import type { NamedExpression } from \"../types.cjs\";\nimport type { NamedExpressionManagerSnapshot } from \"../engine-snapshot.cjs\";\nimport { renameNamedExpressionInFormula } from \"../named-expression-renamer.cjs\";\nimport type { EventManager } from \"./event-manager.cjs\";\nimport type { NamedExpressionNode } from \"../../parser/ast.cjs\";\nimport type { EvaluationContext } from \"../../evaluator/evaluation-context.cjs\";\nimport { getNamedExpressionResourceKey } from \"../resource-keys.cjs\";\n\nexport class NamedExpressionManager {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>> =\n new Map();\n workbookExpressions: Map<string, Map<string, NamedExpression>> = new Map();\n globalExpressions: Map<string, NamedExpression> = new Map();\n\n addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n const namedExpression: NamedExpression = {\n name: expressionName,\n expression,\n };\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n let wbLevel = this.sheetExpressions.get(workbookName);\n if (!wbLevel) {\n wbLevel = new Map();\n this.sheetExpressions.set(workbookName, wbLevel);\n }\n\n let sheetLevel = wbLevel.get(sheetName);\n if (!sheetLevel) {\n sheetLevel = new Map();\n wbLevel.set(sheetName, sheetLevel);\n }\n\n sheetLevel.set(expressionName, namedExpression);\n } else if (workbookName) {\n let workbookNamedExpressions = this.workbookExpressions.get(workbookName);\n if (!workbookNamedExpressions) {\n workbookNamedExpressions = new Map();\n this.workbookExpressions.set(workbookName, workbookNamedExpressions);\n }\n\n workbookNamedExpressions.set(expressionName, namedExpression);\n } else {\n this.globalExpressions.set(expressionName, namedExpression);\n }\n }\n\n removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n let found = false;\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n found = sheetLevel.delete(expressionName);\n }\n }\n } else if (workbookName) {\n const workbookNamedExpressions =\n this.workbookExpressions.get(workbookName);\n if (workbookNamedExpressions) {\n found = workbookNamedExpressions.delete(expressionName);\n }\n } else {\n found = this.globalExpressions.delete(expressionName);\n }\n\n return found;\n }\n\n updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n // Check if the named expression exists\n let exists = false;\n\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n exists = sheetLevel.has(expressionName);\n }\n }\n } else if (workbookName) {\n const workbookNamedExpressions =\n this.workbookExpressions.get(workbookName);\n if (workbookNamedExpressions) {\n exists = workbookNamedExpressions.has(expressionName);\n }\n } else {\n exists = this.globalExpressions.has(expressionName);\n }\n\n if (!exists) {\n throw new Error(`Named expression '${expressionName}' does not exist`);\n }\n\n // Update is the same as add for existing expressions\n this.addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n }\n\n renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): boolean {\n // Check if the named expression exists\n let targetMap: Map<string, NamedExpression> | undefined;\n if (sheetName && !workbookName) {\n throw new Error(\"Missing workbookName\");\n }\n\n let isGlobal = false;\n\n if (sheetName && workbookName) {\n const wbLevel = this.sheetExpressions.get(workbookName);\n if (wbLevel) {\n const sheetLevel = wbLevel.get(sheetName);\n if (sheetLevel) {\n targetMap = sheetLevel;\n }\n }\n } else if (workbookName) {\n targetMap = this.workbookExpressions.get(workbookName);\n } else {\n targetMap = this.globalExpressions;\n isGlobal = true;\n }\n\n if (!targetMap || !targetMap.has(expressionName)) {\n throw new Error(`Named expression '${expressionName}' does not exist`);\n }\n\n // Check if the new name already exists\n if (targetMap.has(newName)) {\n throw new Error(`Named expression '${newName}' already exists`);\n }\n\n // Get the expression to rename\n const namedExpression = targetMap.get(expressionName)!;\n\n // Update the name and re-add with new name\n const updatedExpression = { ...namedExpression, name: newName };\n targetMap.set(newName, updatedExpression);\n targetMap.delete(expressionName);\n\n return true;\n }\n\n updateAllNamedExpressions(\n updateCallback: (formula: string) => string\n ): string[] {\n const changed = new Set<string>();\n\n const update = (\n map: Map<string, NamedExpression>,\n opts: { workbookName?: string; sheetName?: string }\n ) => {\n map.forEach((namedExpr, name) => {\n // Don't update the expression we're renaming\n const updatedExpression = updateCallback(namedExpr.expression);\n\n if (updatedExpression !== namedExpr.expression) {\n map.set(name, {\n ...namedExpr,\n expression: updatedExpression,\n });\n changed.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n })\n );\n }\n });\n };\n\n update(this.globalExpressions, {});\n\n this.workbookExpressions.forEach((workbookLevel, workbookName) => {\n update(workbookLevel, { workbookName });\n });\n\n this.sheetExpressions.forEach((wbLevel, workbookName) => {\n wbLevel.forEach((sheetLevel, sheetName) => {\n update(sheetLevel, { workbookName, sheetName });\n });\n });\n\n return Array.from(changed);\n }\n\n /**\n * Replace all named expressions\n */\n setNamedExpressions(\n opts: (\n | {\n type: \"global\";\n }\n | {\n type: \"sheet\";\n sheetName: string;\n workbookName: string;\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n let map: Map<string, NamedExpression> | undefined;\n\n if (opts.type === \"sheet\") {\n map = this.sheetExpressions.get(opts.workbookName)?.get(opts.sheetName);\n } else if (opts.type === \"workbook\") {\n map = this.workbookExpressions.get(opts.workbookName);\n } else {\n map = this.globalExpressions;\n }\n\n if (!map) {\n throw new Error(\"Invalid options: \" + JSON.stringify(opts));\n }\n\n map.clear();\n\n opts.expressions.forEach((expression, name) => {\n map.set(name, expression);\n });\n }\n\n getNamedExpression(depNode: {\n name: string;\n scope:\n | {\n type: \"global\";\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n | {\n type: \"sheet\";\n workbookName: string;\n sheetName: string;\n };\n }): NamedExpression | undefined {\n if (depNode.scope.type === \"global\") {\n return this.globalExpressions.get(depNode.name);\n }\n if (depNode.scope.type === \"workbook\") {\n return this.workbookExpressions\n .get(depNode.scope.workbookName)\n ?.get(depNode.name);\n }\n if (depNode.scope.type === \"sheet\") {\n return this.sheetExpressions\n .get(depNode.scope.workbookName)\n ?.get(depNode.scope.sheetName)\n ?.get(depNode.name);\n }\n return undefined;\n }\n\n resolveNamedExpressionWithScope(\n namedExpression: Pick<\n NamedExpressionNode,\n \"name\" | \"sheetName\" | \"workbookName\"\n >,\n context: EvaluationContext\n ):\n | {\n expression: string;\n scope:\n | { type: \"global\" }\n | { type: \"workbook\"; workbookName: string }\n | { type: \"sheet\"; workbookName: string; sheetName: string };\n }\n | undefined {\n // scenario 1: no sheetName nor workbookName\n if (!namedExpression.sheetName && !namedExpression.workbookName) {\n /**\n * the result of this formula will differ based on in which sheet and workbook we are\n * evaluating it in.\n */\n context.addContextDependency(\"sheet\", \"workbook\");\n\n // step 1, check if there is a named expression in the sheet scope\n const expression = this.sheetExpressions\n .get(context.cellAddress.workbookName)\n ?.get(context.cellAddress.sheetName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: context.cellAddress.workbookName,\n sheetName: context.cellAddress.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the workbook scope\n const expression = this.workbookExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: context.cellAddress.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n\n // scenario 2: we only have a workbookName - a bit weird, but could happen\n if (namedExpression.workbookName && !namedExpression.sheetName) {\n // special case: if workbook is the current workbook, we should just resolve the named expression according to scenario 1\n if (\n namedExpression.workbookName ===\n context.cellAddress.workbookName\n ) {\n return this.resolveNamedExpressionWithScope(\n {\n name: namedExpression.name,\n },\n context\n );\n }\n\n const expression = this.workbookExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n // step 1, check if there is a named expression in the workbook scope\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: namedExpression.workbookName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n\n // scenario 3: we only have a sheetName\n if (namedExpression.sheetName && !namedExpression.workbookName) {\n const expression = this.sheetExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.sheetName)\n ?.get(namedExpression.name);\n /**\n * the result of this formula will differ based on in which workbook we are\n * evaluating it in.\n */\n context.addContextDependency(\"workbook\");\n if (expression) {\n // step 1, check if there is a named expression in the current workbook against the sheet name\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: context.cellAddress.workbookName,\n sheetName: namedExpression.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the current workbook has a workbook scoped named expression\n const expression = this.workbookExpressions\n .get(context.cellAddress.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: context.cellAddress.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n\n // scenario 4: we have both sheetName and workbookName\n if (namedExpression.sheetName && namedExpression.workbookName) {\n const expression = this.sheetExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.sheetName)\n ?.get(namedExpression.name);\n if (expression) {\n // step 1, check if there is a named expression the the sheet scope\n return {\n expression: expression.expression,\n scope: {\n type: \"sheet\",\n workbookName: namedExpression.workbookName,\n sheetName: namedExpression.sheetName,\n },\n };\n } else {\n // step 2, check if there is a named expression in the workbook scope\n const expression = this.workbookExpressions\n .get(namedExpression.workbookName)\n ?.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"workbook\",\n workbookName: namedExpression.workbookName,\n },\n };\n } else {\n // step 3, check if there is a named expression in the global scope\n const expression = this.globalExpressions.get(namedExpression.name);\n if (expression) {\n return {\n expression: expression.expression,\n scope: {\n type: \"global\",\n },\n };\n }\n }\n }\n }\n }\n\n resolveNamedExpression(\n namedExpression: Pick<\n NamedExpressionNode,\n \"name\" | \"sheetName\" | \"workbookName\"\n >,\n context: EvaluationContext\n ): string | undefined {\n return this.resolveNamedExpressionWithScope(namedExpression, context)\n ?.expression;\n }\n\n getNamedExpressions() {\n return {\n sheetExpressions: this.sheetExpressions,\n workbookExpressions: this.workbookExpressions,\n globalExpressions: this.globalExpressions,\n };\n }\n\n resetNamedExpressions(\n namedExpressions: ReturnType<typeof this.getNamedExpressions>\n ) {\n this.globalExpressions.clear();\n namedExpressions.globalExpressions.forEach((expression, name) => {\n this.globalExpressions.set(name, expression);\n });\n\n this.workbookExpressions.forEach((workbookExpressions, workbookName) => {\n workbookExpressions.clear();\n namedExpressions.workbookExpressions\n .get(workbookName)\n ?.forEach((expression, name) => {\n workbookExpressions.set(name, expression);\n });\n });\n\n this.sheetExpressions.forEach((sheets, workbookName) => {\n sheets.forEach((sheetExpressions, sheetName) => {\n sheetExpressions.clear();\n namedExpressions.sheetExpressions\n .get(workbookName)\n ?.get(sheetName)\n ?.forEach((expression, name) => {\n sheetExpressions.set(name, expression);\n });\n });\n });\n }\n\n toSnapshot(): NamedExpressionManagerSnapshot {\n return this.getNamedExpressions();\n }\n\n restoreFromSnapshot(snapshot: NamedExpressionManagerSnapshot) {\n this.resetNamedExpressions(snapshot);\n }\n\n clear() {\n this.sheetExpressions.clear();\n this.workbookExpressions.clear();\n this.globalExpressions.clear();\n }\n\n /**\n * When adding a sheet, we need to initialize the new maps\n */\n addSheet(opts: { workbookName: string; sheetName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n const sheetLevel = wbLevel.get(opts.sheetName);\n if (sheetLevel) {\n throw new Error(\"Sheet already exists\");\n }\n wbLevel.set(opts.sheetName, new Map());\n }\n\n /**\n * When adding a workbook, we need to initialize the new maps\n */\n addWorkbook(workbookName: string) {\n this.sheetExpressions.set(workbookName, new Map());\n this.workbookExpressions.set(workbookName, new Map());\n }\n\n /**\n * When removing a workbook, we need to remove the workbook from the sheet level\n */\n removeWorkbook(workbookName: string) {\n this.sheetExpressions.delete(workbookName);\n this.workbookExpressions.delete(workbookName);\n }\n\n /**\n * When removing a sheet, we need to remove the sheet from the workbook level\n */\n removeSheet(opts: { workbookName: string; sheetName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n wbLevel.delete(opts.sheetName);\n }\n\n /**\n * Rename a sheet's named expressions, mainly used when renaming a sheet\n */\n renameSheet(options: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n const wbLevel = this.sheetExpressions.get(options.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n const sheetLevel = wbLevel.get(options.sheetName);\n if (!sheetLevel) {\n throw new Error(\"Sheet not found\");\n }\n wbLevel.set(options.newSheetName, sheetLevel);\n wbLevel.delete(options.sheetName);\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n const wbLevel = this.sheetExpressions.get(opts.workbookName);\n if (!wbLevel) {\n throw new Error(\"Workbook not found\");\n }\n this.sheetExpressions.set(opts.newWorkbookName, wbLevel);\n this.sheetExpressions.delete(opts.workbookName);\n\n const wbScopedExpressions = this.workbookExpressions.get(opts.workbookName);\n if (!wbScopedExpressions) {\n throw new Error(\"Workbook not found\");\n }\n this.workbookExpressions.set(opts.newWorkbookName, wbScopedExpressions);\n this.workbookExpressions.delete(opts.workbookName);\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "852A4175DBABE62E64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "12CD3A3339CF2D3264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/formula-engine",
3
- "version": "0.2.10",
3
+ "version": "0.2.11",
4
4
  "type": "commonjs"
5
5
  }
@@ -137,6 +137,23 @@ class FormulaEngine {
137
137
  }
138
138
  return Array.from(resourceKeys);
139
139
  }
140
+ assertNamedExpressionScopeExists(opts) {
141
+ if (opts.sheetName && !opts.workbookName) {
142
+ throw new Error("Missing workbookName");
143
+ }
144
+ if (!opts.workbookName) {
145
+ return;
146
+ }
147
+ if (!this.workbookManager.getWorkbooks().has(opts.workbookName)) {
148
+ throw new Error(`Workbook not found: ${opts.workbookName}`);
149
+ }
150
+ if (opts.sheetName && !this.workbookManager.getSheet({
151
+ workbookName: opts.workbookName,
152
+ sheetName: opts.sheetName
153
+ })) {
154
+ throw new Error(`Sheet not found: ${opts.sheetName}`);
155
+ }
156
+ }
140
157
  getCellEvaluationResult(cellAddress) {
141
158
  return this.evaluationManager.getCellEvaluationResult(cellAddress);
142
159
  }
@@ -194,6 +211,7 @@ class FormulaEngine {
194
211
  throw new Error("Not implemented");
195
212
  }
196
213
  addNamedExpression(opts) {
214
+ this.assertNamedExpressionScopeExists(opts);
197
215
  this.namedExpressionManager.addNamedExpression(opts);
198
216
  this.emitMutation({
199
217
  touchedCells: [],
@@ -929,11 +947,12 @@ class FormulaEngine {
929
947
  }
930
948
  buildSerializedSnapshot() {
931
949
  const evaluationSnapshots = this.dependencyManager.toSnapshot(this.evaluationManager);
950
+ const workbookSnapshot = this.workbookManager.toSnapshot();
932
951
  return {
933
952
  version: ENGINE_SNAPSHOT_VERSION,
934
953
  managers: {
935
- workbook: this.workbookManager.toSnapshot(),
936
- namedExpression: this.namedExpressionManager.toSnapshot(),
954
+ workbook: workbookSnapshot,
955
+ namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),
937
956
  table: this.tableManager.toSnapshot(),
938
957
  style: this.styleManager.toSnapshot(),
939
958
  reference: this.referenceManager.toSnapshot(),
@@ -942,6 +961,26 @@ class FormulaEngine {
942
961
  }
943
962
  };
944
963
  }
964
+ buildNamedExpressionSnapshot(workbookSnapshot) {
965
+ const namedExpressions = this.namedExpressionManager.toSnapshot();
966
+ const workbookExpressions = new Map;
967
+ const sheetExpressions = new Map;
968
+ workbookSnapshot.forEach((workbook) => {
969
+ const sourceWorkbookExpressions = namedExpressions.workbookExpressions.get(workbook.name);
970
+ workbookExpressions.set(workbook.name, new Map(sourceWorkbookExpressions ?? []));
971
+ const sourceSheets = namedExpressions.sheetExpressions.get(workbook.name);
972
+ const workbookSheetExpressions = new Map;
973
+ workbook.sheets.forEach((_, sheetName) => {
974
+ workbookSheetExpressions.set(sheetName, new Map(sourceSheets?.get(sheetName) ?? []));
975
+ });
976
+ sheetExpressions.set(workbook.name, workbookSheetExpressions);
977
+ });
978
+ return {
979
+ sheetExpressions,
980
+ workbookExpressions,
981
+ globalExpressions: new Map(namedExpressions.globalExpressions)
982
+ };
983
+ }
945
984
  serializeEngine() {
946
985
  return serialize(this.buildSerializedSnapshot());
947
986
  }
@@ -950,6 +989,7 @@ class FormulaEngine {
950
989
  if (!deserialized || typeof deserialized !== "object" || !("version" in deserialized) || deserialized.version !== ENGINE_SNAPSHOT_VERSION || !deserialized.managers) {
951
990
  throw new Error(`Unsupported serialized engine format. Expected EngineSnapshot version ${ENGINE_SNAPSHOT_VERSION}.`);
952
991
  }
992
+ this.namedExpressionManager.clear();
953
993
  this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);
954
994
  deserialized.managers.workbook.forEach((workbook) => {
955
995
  this.namedExpressionManager.addWorkbook(workbook.name);
@@ -975,4 +1015,4 @@ export {
975
1015
  FormulaEngine
976
1016
  };
977
1017
 
978
- //# debugId=E7431D6779F19EBD64756E2164756E21
1018
+ //# debugId=571CAE65F6B93C1664756E2164756E21