{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile-to-pnp/index.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { nameVerFromPkgSnapshot } from '../lockfile.utils/index.ts';\nimport type { Registries } from '../types/index.ts';\nimport { depPathToFilename, refToRelative } from '../dependency-path/index.ts';\nimport {\n  generateInlinedScript,\n  LinkType,\n  type PackageRegistry,\n  type PackageStore,\n} from '@yarnpkg/pnp';\nimport type { PortablePath } from '@yarnpkg/fslib';\nimport normalizePath from 'normalize-path';\nimport type { LockfileObject } from '../lockfile.types/index.ts';\n\nexport async function writePnpFile(\n  lockfile: LockfileObject,\n  opts: {\n    importerNames: Record<string, string>;\n    lockfileDir: string;\n    virtualStoreDir: string;\n    virtualStoreDirMaxLength: number;\n    registries: Registries;\n  }\n): Promise<void> {\n  const packageRegistry = lockfileToPackageRegistry(lockfile, opts);\n\n  const loaderFile = generateInlinedScript({\n    dependencyTreeRoots: [],\n    ignorePattern: null,\n    packageRegistry,\n    shebang: null,\n  });\n\n  await fs.writeFile(\n    path.join(opts.lockfileDir, '.pnp.cjs'),\n    loaderFile,\n    'utf8'\n  );\n}\n\nexport function lockfileToPackageRegistry(\n  lockfile: LockfileObject,\n  opts: {\n    importerNames: { [importerId: string]: string };\n    lockfileDir: string;\n    virtualStoreDir: string;\n    virtualStoreDirMaxLength: number;\n    registries: Registries;\n  }\n): PackageRegistry {\n  const packageRegistry: PackageRegistry = new Map<\n    string | null,\n    PackageStore\n  >();\n\n  for (const [importerId, importer] of Object.entries(\n    lockfile.importers ?? {}\n  )) {\n    if (importerId === '.') {\n      const packageStore: PackageStore = new Map([\n        [\n          null,\n          {\n            packageDependencies: new Map([\n              ...(importer.dependencies != null\n                ? toPackageDependenciesMap(lockfile, importer.dependencies)\n                : []),\n              ...(importer.optionalDependencies != null\n                ? toPackageDependenciesMap(\n                    lockfile,\n                    importer.optionalDependencies\n                  )\n                : []),\n              ...(importer.devDependencies != null\n                ? toPackageDependenciesMap(lockfile, importer.devDependencies)\n                : []),\n            ]),\n            packageLocation: './' as PortablePath,\n            packagePeers: new Set<string>(),\n            linkType: LinkType.HARD,\n            discardFromLookup: false,\n          },\n        ],\n      ]);\n\n      packageRegistry.set(null, packageStore);\n    } else {\n      const name = opts.importerNames[importerId];\n\n      if (typeof name !== 'string') {\n        continue;\n      }\n\n      const packageStore: PackageStore = new Map([\n        [\n          importerId,\n          {\n            packageDependencies: new Map([\n              [name, importerId],\n              ...(importer.dependencies != null\n                ? toPackageDependenciesMap(\n                    lockfile,\n                    importer.dependencies,\n                    importerId\n                  )\n                : []),\n              ...(importer.optionalDependencies != null\n                ? toPackageDependenciesMap(\n                    lockfile,\n                    importer.optionalDependencies,\n                    importerId\n                  )\n                : []),\n              ...(importer.devDependencies != null\n                ? toPackageDependenciesMap(\n                    lockfile,\n                    importer.devDependencies,\n                    importerId\n                  )\n                : []),\n            ]),\n            packageLocation: `./${importerId}` as PortablePath,\n            packagePeers: new Set<string>(),\n            linkType: LinkType.HARD,\n            discardFromLookup: false,\n          },\n        ],\n      ]);\n\n      packageRegistry.set(name, packageStore);\n    }\n  }\n\n  for (const [relDepPath, pkgSnapshot] of Object.entries(\n    lockfile.packages ?? {}\n  )) {\n    const { name, version, peersSuffix } = nameVerFromPkgSnapshot(\n      relDepPath,\n      pkgSnapshot\n    );\n\n    const pnpVersion = toPnPVersion(version, peersSuffix);\n\n    let packageStore = packageRegistry.get(name);\n\n    if (typeof packageStore === 'undefined') {\n      packageStore = new Map();\n      packageRegistry.set(name, packageStore);\n    }\n\n    // Seems like this field should always contain a relative path\n    let packageLocation: PortablePath = normalizePath(\n      path.relative(\n        opts.lockfileDir,\n        path.join(\n          opts.virtualStoreDir,\n          depPathToFilename(relDepPath, opts.virtualStoreDirMaxLength),\n          'node_modules',\n          name\n        )\n      )\n    ) as PortablePath;\n\n    if (!packageLocation.startsWith('../')) {\n      packageLocation = `./${packageLocation}` as PortablePath;\n    }\n\n    packageStore.set(pnpVersion, {\n      packageDependencies: new Map([\n        [name, pnpVersion],\n        ...(pkgSnapshot.dependencies != null\n          ? toPackageDependenciesMap(lockfile, pkgSnapshot.dependencies)\n          : []),\n        ...(pkgSnapshot.optionalDependencies != null\n          ? toPackageDependenciesMap(lockfile, pkgSnapshot.optionalDependencies)\n          : []),\n      ]),\n      packageLocation,\n      packagePeers: new Set<string>(),\n      linkType: LinkType.HARD,\n      discardFromLookup: false,\n    });\n  }\n\n  return packageRegistry;\n}\n\nfunction toPackageDependenciesMap(\n  lockfile: LockfileObject,\n  deps: {\n    [depAlias: string]: string;\n  },\n  importerId?: string | undefined\n): Array<[string, string | [string, string]]> {\n  return Object.entries(deps).map(([depAlias, ref]) => {\n    if (typeof importerId === 'string' && ref.startsWith('link:')) {\n      return [depAlias, path.join(importerId, ref.slice(5))];\n    }\n\n    const relDepPath = refToRelative(ref, depAlias);\n\n    if (!relDepPath) {\n      return [depAlias, ref];\n    }\n\n    const { name, version, peersSuffix } = nameVerFromPkgSnapshot(\n      relDepPath,\n      lockfile.packages?.[relDepPath]\n    );\n\n    const pnpVersion = toPnPVersion(version, peersSuffix);\n\n    if (depAlias === name) {\n      return [depAlias, pnpVersion];\n    }\n\n    return [depAlias, [name, pnpVersion]];\n  });\n}\n\nfunction toPnPVersion(\n  version: string,\n  peersSuffix: string | undefined\n): string {\n  return typeof peersSuffix === 'string'\n    ? `virtual:${version}${peersSuffix}#${version}`\n    : version;\n}\n"],
  "mappings": "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",
  "names": []
}
