{
  "version": 3,
  "sources": ["../../../../src/packages/pkg-manager.direct-dep-linker/linkDirectDeps.ts"],
  "sourcesContent": ["import fs from 'node:fs';\nimport path from 'node:path';\nimport { rootLogger } from '../core-loggers/index.ts';\nimport {\n  symlinkDependency,\n  symlinkDirectRootDependency,\n} from '../symlink-dependency/index.ts';\nimport omit from 'ramda/src/omit';\nimport { readModulesDir } from '../read-modules-dir/index.ts';\nimport rimraf from '@zkochan/rimraf';\nimport resolveLinkTarget from 'resolve-link-target';\nimport type { ModulesDir } from '../types/project.ts';\n\nexport type LinkedDirectDep = {\n  alias: string;\n  name: string;\n  version: string;\n  dir: string;\n  id: string;\n  dependencyType: 'prod' | 'dev' | 'optional';\n  isExternalLink: boolean;\n  latest?: string | undefined;\n};\n\nexport type ProjectToLink = {\n  dir: string;\n  modulesDir: ModulesDir;\n  dependencies: LinkedDirectDep[];\n};\n\nexport async function linkDirectDeps(\n  projects: Record<string, ProjectToLink>,\n  opts: {\n    dedupe: boolean;\n  }\n): Promise<number> {\n  if (opts.dedupe && projects['.'] && Object.keys(projects).length > 1) {\n    return linkDirectDepsAndDedupe(\n      projects['.'],\n      omit.default(['.'], projects)\n    );\n  }\n\n  const numberOfLinkedDeps = await Promise.all(\n    Object.values(projects).map(linkDirectDepsOfProject)\n  );\n\n  return numberOfLinkedDeps.reduce((sum: number, count: number): number => {\n    return sum + count;\n  }, 0);\n}\n\nasync function linkDirectDepsAndDedupe(\n  rootProject: ProjectToLink,\n  projects: Record<string, ProjectToLink>\n): Promise<number> {\n  const linkedDeps = await linkDirectDepsOfProject(rootProject);\n\n  const pkgsLinkedToRoot = await readLinkedDeps(rootProject.modulesDir);\n\n  await Promise.all(\n    Object.values(projects).map(\n      async (project: ProjectToLink): Promise<void> => {\n        const deletedAll = await deletePkgsPresentInRoot(\n          project.modulesDir,\n          pkgsLinkedToRoot\n        );\n\n        const dependencies = omitDepsFromRoot(\n          project.dependencies,\n          pkgsLinkedToRoot\n        );\n\n        if (dependencies.length > 0) {\n          await linkDirectDepsOfProject({\n            ...project,\n            dependencies,\n          });\n\n          return;\n        }\n\n        if (deletedAll) {\n          await rimraf(project.modulesDir);\n        }\n      }\n    )\n  );\n\n  return linkedDeps;\n}\n\nfunction omitDepsFromRoot(\n  deps: LinkedDirectDep[],\n  pkgsLinkedToRoot: string[]\n): LinkedDirectDep[] {\n  return deps.filter(({ dir }: LinkedDirectDep): boolean => {\n    return !pkgsLinkedToRoot.some(pathsEqual.bind(null, dir));\n  });\n}\n\nfunction pathsEqual(path1: string, path2: string): boolean {\n  return path.relative(path1, path2) === '';\n}\n\nasync function readLinkedDeps(modulesDir: string): Promise<string[]> {\n  const deps = (await readModulesDir(modulesDir)) ?? [];\n\n  return Promise.all(\n    deps.map((alias: string): Promise<string> => {\n      return resolveLinkTargetOrFile(path.join(modulesDir, alias));\n    })\n  );\n}\n\nasync function deletePkgsPresentInRoot(\n  modulesDir: ModulesDir,\n  pkgsLinkedToRoot: string[]\n): Promise<boolean> {\n  const pkgsLinkedToCurrentProject =\n    await readLinkedDepsWithRealLocations(modulesDir);\n\n  const pkgsToDelete = pkgsLinkedToCurrentProject.filter(\n    ({\n      linkedFrom,\n      linkedTo,\n    }: {\n      linkedTo: string;\n      linkedFrom: string;\n    }): boolean => {\n      return (\n        linkedFrom !== linkedTo &&\n        pkgsLinkedToRoot.some(pathsEqual.bind(null, linkedFrom))\n      );\n    }\n  );\n\n  await Promise.all(\n    pkgsToDelete.map(\n      ({\n        linkedTo,\n      }: {\n        linkedTo: string;\n        linkedFrom: string;\n      }): Promise<void> => {\n        return fs.promises.unlink(linkedTo);\n      }\n    )\n  );\n\n  return pkgsToDelete.length === pkgsLinkedToCurrentProject.length;\n}\n\nasync function readLinkedDepsWithRealLocations(modulesDir: ModulesDir): Promise<\n  Array<{\n    linkedTo: string;\n    linkedFrom: string;\n  }>\n> {\n  const deps = (await readModulesDir(modulesDir)) ?? [];\n\n  return Promise.all(\n    deps.map(\n      async (\n        alias: string\n      ): Promise<{ linkedTo: string; linkedFrom: string }> => {\n        const linkedTo = path.join(modulesDir, alias);\n\n        return {\n          linkedTo,\n          linkedFrom: await resolveLinkTargetOrFile(linkedTo),\n        };\n      }\n    )\n  );\n}\n\nasync function resolveLinkTargetOrFile(filePath: string): Promise<string> {\n  try {\n    return await resolveLinkTarget(filePath);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if (err.code !== 'EINVAL' && err.code !== 'UNKNOWN') {\n      throw err;\n    }\n\n    return filePath;\n  }\n}\n\nasync function linkDirectDepsOfProject(\n  project: ProjectToLink\n): Promise<number> {\n  let linkedDeps = 0;\n\n  await Promise.all(\n    project.dependencies.map(async (dep: LinkedDirectDep): Promise<void> => {\n      if (dep.isExternalLink) {\n        await symlinkDirectRootDependency(\n          dep.dir,\n          project.modulesDir,\n          dep.alias,\n          {\n            fromDependenciesField:\n              dep.dependencyType === 'dev'\n                ? 'devDependencies'\n                : dep.dependencyType === 'optional'\n                  ? 'optionalDependencies'\n                  : 'dependencies',\n            linkedPackage: {\n              name: dep.name,\n              version: dep.version,\n            },\n            prefix: project.dir,\n          }\n        );\n\n        return;\n      }\n\n      if (\n        (await symlinkDependency(dep.dir, project.modulesDir, dep.alias)).reused\n      ) {\n        return;\n      }\n\n      rootLogger.debug({\n        added: {\n          dependencyType: dep.dependencyType,\n          id: dep.id,\n          latest: dep.latest,\n          name: dep.alias,\n          realName: dep.name,\n          version: dep.version,\n        },\n        prefix: project.dir,\n      });\n\n      linkedDeps++;\n    })\n  );\n\n  return linkedDeps;\n}\n"],
  "mappings": "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",
  "names": []
}
