{
  "version": 3,
  "sources": ["../../../../src/core/managers/cache-manager.ts"],
  "sourcesContent": [
    "import type { EvaluationOrder, SCC } from \"../types.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport type {\n  CacheManagerSnapshot,\n  NodeSnapshotId,\n  SerializedSCCSnapshot,\n} from \"../engine-snapshot.mjs\";\n\nexport class CacheManager {\n  private _evaluationOrderCache = new Map<string, EvaluationOrder>();\n\n  /**\n   * Cache for SCCs - key is a hash of the node keys in the SCC\n   */\n  private _sccCache = new Map<string, SCC>();\n\n  constructor() {}\n\n  setEvaluationOrder(nodeKey: string, evaluationOrder: EvaluationOrder): void {\n    this._evaluationOrderCache.set(nodeKey, evaluationOrder);\n  }\n\n  getEvaluationOrder(nodeKey: string): EvaluationOrder | undefined {\n    return this._evaluationOrderCache.get(nodeKey);\n  }\n\n  deleteEvaluationOrder(nodeKey: string): void {\n    this._evaluationOrderCache.delete(nodeKey);\n  }\n\n  deleteEvaluationOrders(nodeKeys: Iterable<string>): void {\n    for (const nodeKey of nodeKeys) {\n      this._evaluationOrderCache.delete(nodeKey);\n    }\n  }\n\n  setSCC(sccHash: string, scc: SCC): void {\n    this._sccCache.set(sccHash, scc);\n  }\n\n  getSCC(sccHash: string): SCC | undefined {\n    return this._sccCache.get(sccHash);\n  }\n\n  clearSCCCache(): void {\n    this._sccCache.clear();\n  }\n\n  clear(): void {\n    this._evaluationOrderCache.clear();\n    this._sccCache.clear();\n  }\n\n  toSnapshot(\n    getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId | undefined\n  ): CacheManagerSnapshot {\n    const evaluationOrders: CacheManagerSnapshot[\"evaluationOrders\"] = [];\n\n    for (const [nodeKey, evaluationOrder] of this._evaluationOrderCache.entries()) {\n      const orderedNodeIds = Array.from(evaluationOrder.evaluationOrder).map(\n        getNodeSnapshotId\n      );\n      if (orderedNodeIds.some((nodeId) => nodeId === undefined)) {\n        continue;\n      }\n\n      const cycleNodeIds = evaluationOrder.cycleNodes\n        ? Array.from(evaluationOrder.cycleNodes).map(getNodeSnapshotId)\n        : undefined;\n      if (cycleNodeIds?.some((nodeId) => nodeId === undefined)) {\n        continue;\n      }\n\n      evaluationOrders.push({\n        nodeKey,\n        evaluationOrder: orderedNodeIds as NodeSnapshotId[],\n        hasCycle: evaluationOrder.hasCycle,\n        cycleNodes: cycleNodeIds as NodeSnapshotId[] | undefined,\n        hash: evaluationOrder.hash,\n      });\n    }\n\n    const sccs: CacheManagerSnapshot[\"sccs\"] = [];\n    for (const [hash, scc] of this._sccCache.entries()) {\n      const serializedSCC = this.serializeSCC(scc, getNodeSnapshotId);\n      if (!serializedSCC) {\n        continue;\n      }\n      sccs.push({ hash, scc: serializedSCC });\n    }\n\n    return {\n      evaluationOrders,\n      sccs,\n    };\n  }\n\n  restoreFromSnapshot(\n    snapshot: CacheManagerSnapshot,\n    resolveNodeSnapshotId: (\n      nodeId: NodeSnapshotId\n    ) => DependencyNode | undefined\n  ) {\n    this.clear();\n\n    for (const evaluationOrderSnapshot of snapshot.evaluationOrders) {\n      const evaluationOrderNodes = evaluationOrderSnapshot.evaluationOrder\n        .map(resolveNodeSnapshotId)\n        .filter((node): node is DependencyNode => node !== undefined);\n      if (evaluationOrderNodes.length !== evaluationOrderSnapshot.evaluationOrder.length) {\n        continue;\n      }\n\n      const cycleNodes = evaluationOrderSnapshot.cycleNodes\n        ?.map(resolveNodeSnapshotId)\n        .filter((node): node is DependencyNode => node !== undefined);\n      if (\n        evaluationOrderSnapshot.cycleNodes &&\n        cycleNodes &&\n        cycleNodes.length !== evaluationOrderSnapshot.cycleNodes.length\n      ) {\n        continue;\n      }\n\n      this._evaluationOrderCache.set(evaluationOrderSnapshot.nodeKey, {\n        evaluationOrder: new Set(evaluationOrderNodes),\n        hasCycle: evaluationOrderSnapshot.hasCycle,\n        cycleNodes: cycleNodes ? new Set(cycleNodes) : undefined,\n        hash: evaluationOrderSnapshot.hash,\n      });\n    }\n\n    for (const { hash, scc } of snapshot.sccs) {\n      const deserialized = this.deserializeSCC(scc, resolveNodeSnapshotId);\n      if (deserialized) {\n        this._sccCache.set(hash, deserialized);\n      }\n    }\n  }\n\n  private serializeSCC(\n    scc: SCC,\n    getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId | undefined\n  ): SerializedSCCSnapshot | undefined {\n    const nodeIds = Array.from(scc.nodes).map(getNodeSnapshotId);\n    if (nodeIds.some((nodeId) => nodeId === undefined)) {\n      return undefined;\n    }\n\n    const evaluationOrder = scc.evaluationOrder.map(getNodeSnapshotId);\n    if (evaluationOrder.some((nodeId) => nodeId === undefined)) {\n      return undefined;\n    }\n\n    const hardEdgeSCCs = scc.hardEdgeSCCs.map((group) =>\n      Array.from(group).map(getNodeSnapshotId)\n    );\n    if (\n      hardEdgeSCCs.some((group) =>\n        group.some((nodeId) => nodeId === undefined)\n      )\n    ) {\n      return undefined;\n    }\n\n    return {\n      id: scc.id,\n      nodes: nodeIds as NodeSnapshotId[],\n      evaluationOrder: evaluationOrder as NodeSnapshotId[],\n      resolved: scc.resolved,\n      hardEdgeSCCs: hardEdgeSCCs as NodeSnapshotId[][],\n    };\n  }\n\n  private deserializeSCC(\n    snapshot: SerializedSCCSnapshot,\n    resolveNodeSnapshotId: (\n      nodeId: NodeSnapshotId\n    ) => DependencyNode | undefined\n  ): SCC | undefined {\n    const nodes = snapshot.nodes\n      .map(resolveNodeSnapshotId)\n      .filter((node): node is DependencyNode => node !== undefined);\n    const evaluationOrder = snapshot.evaluationOrder\n      .map(resolveNodeSnapshotId)\n      .filter((node): node is DependencyNode => node !== undefined);\n    const hardEdgeSCCs = snapshot.hardEdgeSCCs.map((group) =>\n      group\n        .map(resolveNodeSnapshotId)\n        .filter((node): node is DependencyNode => node !== undefined)\n    );\n\n    if (\n      nodes.length !== snapshot.nodes.length ||\n      evaluationOrder.length !== snapshot.evaluationOrder.length ||\n      hardEdgeSCCs.some(\n        (group, index) => group.length !== snapshot.hardEdgeSCCs[index]?.length\n      )\n    ) {\n      return undefined;\n    }\n\n    return {\n      id: snapshot.id,\n      nodes: new Set(nodes),\n      evaluationOrder,\n      resolved: snapshot.resolved,\n      hardEdgeSCCs: hardEdgeSCCs.map((group) => new Set(group)),\n    };\n  }\n}\n"
  ],
  "mappings": "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",
  "debugId": "B9ADFA576053D17D64756E2164756E21",
  "names": []
}