{
  "version": 3,
  "sources": ["../../../../src/core/managers/named-expression-manager.ts"],
  "sourcesContent": [
    "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"
  ],
  "mappings": "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",
  "debugId": "852A4175DBABE62E64756E2164756E21",
  "names": []
}