{
  "version": 3,
  "sources": ["../../../../src/packages/resolve-dependencies/dedupeInjectedDeps.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport normalize from 'normalize-path';\nimport type { PkgResolutionId, DepPath } from '../types/index.ts';\nimport type {\n  ResolvedDirectDependency,\n  ResolvedImporters,\n} from './resolveDependencyTree.ts';\nimport type { NodeId } from './nextNodeId.ts';\nimport type { LinkedDependency } from './resolveDependencies.ts';\nimport type {\n  GenericDependenciesGraphWithResolvedChildren,\n  DependenciesByProjectId,\n  ProjectToResolve,\n} from './resolvePeers.ts';\n\nexport interface DedupeInjectedDepsOptions {\n  depGraph: GenericDependenciesGraphWithResolvedChildren;\n  dependenciesByProjectId: DependenciesByProjectId;\n  lockfileDir: string;\n  pathsByNodeId: Map<NodeId, DepPath>;\n  projects: ProjectToResolve[];\n  resolvedImporters: ResolvedImporters;\n}\n\nexport function dedupeInjectedDeps(opts: DedupeInjectedDepsOptions): void {\n  const injectedDepsByProjects = getInjectedDepsByProjects(opts);\n\n  const dedupeMap = getDedupeMap(injectedDepsByProjects, opts);\n\n  applyDedupeMap(dedupeMap, opts);\n}\n\ntype InjectedDepsByProjects = Map<\n  string,\n  Map<string, { depPath: DepPath; id: string }>\n>;\n\nfunction getInjectedDepsByProjects(\n  opts: Pick<\n    DedupeInjectedDepsOptions,\n    'projects' | 'pathsByNodeId' | 'depGraph'\n  >\n): InjectedDepsByProjects {\n  const injectedDepsByProjects = new Map<\n    string,\n    Map<string, { depPath: DepPath; id: string }>\n  >();\n\n  for (const project of opts.projects) {\n    for (const [alias, nodeId] of project.directNodeIdsByAlias.entries()) {\n      const depPath = opts.pathsByNodeId.get(nodeId);\n\n      if (typeof depPath !== 'string') {\n        continue;\n      }\n\n      const dg = opts.depGraph[depPath];\n\n      if (typeof dg === 'undefined') {\n        continue;\n      }\n\n      if (dg.id.startsWith('file:') !== true) {\n        continue;\n      }\n\n      const id = dg.id.substring(5);\n\n      if (opts.projects.some((project) => project.id === id)) {\n        if (!injectedDepsByProjects.has(project.id)) {\n          injectedDepsByProjects.set(project.id, new Map());\n        }\n\n        injectedDepsByProjects.get(project.id)?.set(alias, { depPath, id });\n      }\n    }\n  }\n\n  return injectedDepsByProjects;\n}\n\ntype DedupeMap = Map<string, Map<string, string>>;\n\nfunction getDedupeMap(\n  injectedDepsByProjects: InjectedDepsByProjects,\n  opts: Pick<DedupeInjectedDepsOptions, 'depGraph' | 'dependenciesByProjectId'>\n): DedupeMap {\n  const toDedupe = new Map<string, Map<string, string>>();\n\n  for (const [id, deps] of injectedDepsByProjects.entries()) {\n    const dedupedInjectedDeps = new Map<string, string>();\n\n    for (const [alias, dep] of deps.entries()) {\n      // Check for subgroup not equal.\n      // The injected project in the workspace may have dev deps\n      const isSubset = Object.entries(\n        opts.depGraph[dep.depPath]?.children ?? {}\n      ).every(([alias, depPath]: [string, DepPath]): boolean => {\n        return opts.dependenciesByProjectId[dep.id]?.get(alias) === depPath;\n      });\n\n      if (isSubset) {\n        dedupedInjectedDeps.set(alias, dep.id);\n      }\n    }\n\n    toDedupe.set(id, dedupedInjectedDeps);\n  }\n\n  return toDedupe;\n}\n\nfunction applyDedupeMap(\n  dedupeMap: DedupeMap,\n  opts: Pick<\n    DedupeInjectedDepsOptions,\n    'dependenciesByProjectId' | 'resolvedImporters' | 'lockfileDir'\n  >\n): void {\n  for (const [id, aliases] of dedupeMap.entries()) {\n    for (const [alias, dedupedProjectId] of aliases.entries()) {\n      opts.dependenciesByProjectId[id]?.delete(alias);\n\n      const index = opts.resolvedImporters[id]?.directDependencies.findIndex(\n        (dep) => dep.alias === alias\n      );\n\n      if (typeof index === 'undefined') {\n        continue;\n      }\n\n      const prev = opts.resolvedImporters[id]?.directDependencies[index];\n\n      if (typeof prev === 'undefined') {\n        continue;\n      }\n\n      const linkedDep: LinkedDependency & ResolvedDirectDependency = {\n        ...prev,\n        isLinkedDependency: true,\n        pkgId:\n          `link:${normalize(path.relative(id, dedupedProjectId))}` as PkgResolutionId,\n        resolution: {\n          type: 'directory',\n          directory: path.join(opts.lockfileDir, dedupedProjectId),\n        },\n      };\n\n      const importer = opts.resolvedImporters[id];\n\n      if (typeof importer === 'undefined') {\n        continue;\n      }\n\n      importer.directDependencies[index] = linkedDep;\n\n      importer.linkedDependencies.push(linkedDep);\n    }\n  }\n}\n"],
  "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,eAAe;AAuBf,SAAS,mBAAmB,MAAuC;AACxE,QAAM,yBAAyB,0BAA0B,IAAI;AAE7D,QAAM,YAAY,aAAa,wBAAwB,IAAI;AAE3D,iBAAe,WAAW,IAAI;AAChC;AAOA,SAAS,0BACP,MAIwB;AACxB,QAAM,yBAAyB,oBAAI,IAGjC;AAEF,aAAW,WAAW,KAAK,UAAU;AACnC,eAAW,CAAC,OAAO,MAAM,KAAK,QAAQ,qBAAqB,QAAQ,GAAG;AACpE,YAAM,UAAU,KAAK,cAAc,IAAI,MAAM;AAE7C,UAAI,OAAO,YAAY,UAAU;AAC/B;AAAA,MACF;AAEA,YAAM,KAAK,KAAK,SAAS,OAAO;AAEhC,UAAI,OAAO,OAAO,aAAa;AAC7B;AAAA,MACF;AAEA,UAAI,GAAG,GAAG,WAAW,OAAO,MAAM,MAAM;AACtC;AAAA,MACF;AAEA,YAAM,KAAK,GAAG,GAAG,UAAU,CAAC;AAE5B,UAAI,KAAK,SAAS,KAAK,CAACA,aAAYA,SAAQ,OAAO,EAAE,GAAG;AACtD,YAAI,CAAC,uBAAuB,IAAI,QAAQ,EAAE,GAAG;AAC3C,iCAAuB,IAAI,QAAQ,IAAI,oBAAI,IAAI,CAAC;AAAA,QAClD;AAEA,+BAAuB,IAAI,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,SAAS,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,aACP,wBACA,MACW;AACX,QAAM,WAAW,oBAAI,IAAiC;AAEtD,aAAW,CAAC,IAAI,IAAI,KAAK,uBAAuB,QAAQ,GAAG;AACzD,UAAM,sBAAsB,oBAAI,IAAoB;AAEpD,eAAW,CAAC,OAAO,GAAG,KAAK,KAAK,QAAQ,GAAG;AAGzC,YAAM,WAAW,OAAO;AAAA,QACtB,KAAK,SAAS,IAAI,OAAO,GAAG,YAAY,CAAC;AAAA,MAC3C,EAAE,MAAM,CAAC,CAACC,QAAO,OAAO,MAAkC;AACxD,eAAO,KAAK,wBAAwB,IAAI,EAAE,GAAG,IAAIA,MAAK,MAAM;AAAA,MAC9D,CAAC;AAED,UAAI,UAAU;AACZ,4BAAoB,IAAI,OAAO,IAAI,EAAE;AAAA,MACvC;AAAA,IACF;AAEA,aAAS,IAAI,IAAI,mBAAmB;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,eACP,WACA,MAIM;AACN,aAAW,CAAC,IAAI,OAAO,KAAK,UAAU,QAAQ,GAAG;AAC/C,eAAW,CAAC,OAAO,gBAAgB,KAAK,QAAQ,QAAQ,GAAG;AACzD,WAAK,wBAAwB,EAAE,GAAG,OAAO,KAAK;AAE9C,YAAM,QAAQ,KAAK,kBAAkB,EAAE,GAAG,mBAAmB;AAAA,QAC3D,CAAC,QAAQ,IAAI,UAAU;AAAA,MACzB;AAEA,UAAI,OAAO,UAAU,aAAa;AAChC;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,kBAAkB,EAAE,GAAG,mBAAmB,KAAK;AAEjE,UAAI,OAAO,SAAS,aAAa;AAC/B;AAAA,MACF;AAEA,YAAM,YAAyD;AAAA,QAC7D,GAAG;AAAA,QACH,oBAAoB;AAAA,QACpB,OACE,QAAQ,UAAU,KAAK,SAAS,IAAI,gBAAgB,CAAC,CAAC;AAAA,QACxD,YAAY;AAAA,UACV,MAAM;AAAA,UACN,WAAW,KAAK,KAAK,KAAK,aAAa,gBAAgB;AAAA,QACzD;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,kBAAkB,EAAE;AAE1C,UAAI,OAAO,aAAa,aAAa;AACnC;AAAA,MACF;AAEA,eAAS,mBAAmB,KAAK,IAAI;AAErC,eAAS,mBAAmB,KAAK,SAAS;AAAA,IAC5C;AAAA,EACF;AACF;",
  "names": ["project", "alias"]
}
