{
  "version": 3,
  "sources": ["../../../../src/packages/license-scanner/getPkgInfo.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport pathAbsolute from 'path-absolute';\nimport { readFile } from 'node:fs/promises';\nimport { readPackageJson } from '../read-package-json/index.ts';\nimport { depPathToFilename, parse } from '../dependency-path/index.ts';\nimport pLimit from 'p-limit';\nimport type {\n  ModulesDir,\n  PackageManifest,\n  Registries,\n} from '../types/index.ts';\nimport {\n  getFilePathByModeInCafs,\n  getIndexFilePathInCafs,\n  type PackageFiles,\n  type PackageFileInfo,\n  type PackageFilesIndex,\n} from '../store.cafs/index.ts';\nimport { loadJsonFile } from 'load-json-file';\nimport { PnpmError } from '../error/index.ts';\nimport type { LicensePackage } from './licenses.ts';\nimport { pkgSnapshotToResolution } from '../lockfile.utils/index.ts';\nimport { fetchFromDir } from '../directory-fetcher/index.ts';\nimport type { PackageSnapshot } from '../lockfile.types/index.ts';\nimport type { Resolution } from '../resolver-base/index.ts';\n\nconst limitPkgReads = pLimit(4);\n\nexport async function readPkg(pkgPath: string): Promise<PackageManifest> {\n  return limitPkgReads(async () => readPackageJson(pkgPath));\n}\n\n/**\n * @const\n * List of typical names for license files\n */\nconst LICENSE_FILES = [\n  'LICENSE',\n  'LICENCE',\n  'LICENSE.md',\n  'LICENCE.md',\n  'LICENSE.txt',\n  'LICENCE.txt',\n  'MIT-LICENSE.txt',\n  'MIT-LICENSE.md',\n  'MIT-LICENSE',\n];\n\n/**\n * @const\n * List common license names\n * Refer https://github.com/pivotal/LicenseFinder/blob/master/lib/license_finder/license/definitions.rb\n */\nconst LICENSE_NAMES = [\n  'Apache1_1',\n  'Apache-1.1',\n  'Apache 1.1',\n  'Apache2',\n  'Apache-2.0',\n  'Apache 2.0',\n  'BSD',\n  'BSD-4-Clause',\n  'CC01',\n  'CC0-1.0',\n  'CC0 1.0',\n  'CDDL1',\n  'CDDL-1.0',\n  'Common Development and Distribution License 1.0',\n  'EPL1',\n  'EPL-1.0',\n  'Eclipse Public License 1.0',\n  'GPLv2',\n  'GPL-2.0-only',\n  'GPLv3',\n  'GPL-3.0-only',\n  'ISC',\n  'LGPL',\n  'LGPL-3.0-only',\n  'LGPL2_1',\n  'LGPL-2.1-only',\n  'MIT',\n  'MPL1_1',\n  'MPL-1.1',\n  'Mozilla Public License 1.1',\n  'MPL2',\n  'MPL-2.0',\n  'Mozilla Public License 2.0',\n  'NewBSD',\n  'BSD-3-Clause',\n  'New BSD',\n  'OFL',\n  'OFL-1.1',\n  'SIL OPEN FONT LICENSE Version 1.1',\n  'Python',\n  'PSF-2.0',\n  'Python Software Foundation License',\n  'Ruby',\n  'SimplifiedBSD',\n  'BSD-2-Clause',\n  'Simplified BSD',\n  'WTFPL',\n  '0BSD',\n  'BSD Zero Clause License',\n  'Zlib',\n  'zlib/libpng license',\n];\n\nexport interface LicenseInfo {\n  name: string;\n  licenseFile?: string | undefined;\n}\n\n/**\n * Coerce the given value to a string or a null value\n * @param field the string to be converted\n * @returns string | null\n */\nfunction coerceToString(field: unknown): string | null {\n  const string = String(field);\n  return typeof field === 'string' || field === string ? string : null;\n}\n\n/**\n * Parses the value of the license-property of a\n * package manifest and return it as a string\n * @param field the value to parse\n * @returns string\n */\nfunction parseLicenseManifestField(field: unknown): string | null {\n  if (Array.isArray(field)) {\n    const licenses = field;\n\n    const licenseTypes = licenses\n      .map((license: unknown): string | null => {\n        return typeof license === 'object' && license !== null\n          ? (('type' in license ? coerceToString(license.type) : null) ??\n              ('name' in license ? coerceToString(license.name) : null))\n          : null;\n      })\n      .filter((licenseType): licenseType is string => {\n        return licenseType !== null;\n      });\n\n    if (licenseTypes.length > 1) {\n      const combinedLicenseTypes = licenseTypes.join(' OR ');\n\n      return `(${combinedLicenseTypes})`;\n    }\n\n    return licenseTypes[0] ?? null;\n  }\n\n  return typeof field === 'object' &&\n    field !== null &&\n    'type' in field &&\n    typeof field.type === 'string'\n    ? field.type\n    : coerceToString(field);\n}\n\n/**\n * Reads the license field or LICENSE file from\n * the directory of the given package manifest\n *\n * If the package.json file is missing the `license`-property\n * the root of the manifest directory will be scanned for\n * files named listed in the array LICENSE_FILES and the\n * contents will be returned.\n *\n * @param {*} pkg the package to check\n * @param {*} opts the options for parsing licenses\n * @returns Promise<LicenseInfo>\n */\nasync function parseLicense(\n  pkg: {\n    manifest: PackageManifest;\n    files:\n      | { local: true; files: Record<string, string> }\n      | { local: false; files: PackageFiles };\n  },\n  opts: { storeDir: string }\n): Promise<LicenseInfo> {\n  let licenseField: unknown = pkg.manifest.license;\n\n  if ('licenses' in pkg.manifest) {\n    licenseField = pkg.manifest.licenses;\n  }\n\n  const license = parseLicenseManifestField(licenseField);\n\n  // check if we discovered a license, if not attempt to parse the LICENSE file\n  if (license === null || /see license/i.test(license)) {\n    const { files: pkgFileIndex } = pkg.files;\n\n    const licenseFile = LICENSE_FILES.find(\n      (licenseFile) => licenseFile in pkgFileIndex\n    );\n\n    if (typeof licenseFile !== 'undefined') {\n      const licensePackageFileInfo = pkgFileIndex[licenseFile];\n\n      let licenseContents: Buffer | undefined;\n\n      if (pkg.files.local) {\n        licenseContents = await readFile(licensePackageFileInfo as string);\n      } else {\n        licenseContents = await readLicenseFileFromCafs(\n          opts.storeDir,\n          licensePackageFileInfo as PackageFileInfo\n        );\n      }\n\n      const licenseContent = licenseContents.toString('utf-8');\n\n      let name = 'Unknown';\n\n      if (licenseContent) {\n        const match = licenseContent.match(\n          new RegExp(`\\\\b(${LICENSE_NAMES.join('|')})\\\\b`, 'gi')\n        );\n\n        if (match !== null) {\n          name = [...new Set(match)].join(' OR ');\n        }\n      }\n\n      return {\n        name,\n        licenseFile: licenseContent,\n      };\n    }\n  }\n\n  return { name: license ?? 'Unknown' };\n}\n\n/**\n * Fetch a file by integrity id from the content-addressable store\n * @param storeDir the cafs directory\n * @param opts the options for reading file\n * @returns Promise<Buffer>\n */\nasync function readLicenseFileFromCafs(\n  storeDir: string,\n  { integrity, mode }: PackageFileInfo\n): Promise<Buffer> {\n  const fileName = getFilePathByModeInCafs(storeDir, integrity, mode);\n  const fileContents = await readFile(fileName);\n  return fileContents;\n}\n\nexport type ReadPackageIndexFileResult =\n  | { local: false; files: PackageFiles }\n  | { local: true; files: Record<string, string> };\n\nexport interface ReadPackageIndexFileOptions {\n  storeDir: string;\n  lockfileDir: string;\n  virtualStoreDirMaxLength: number;\n}\n\n/**\n * Returns the index of files included in\n * the package identified by the integrity id\n * @param packageResolution the resolution package information\n * @param depPath the package reference\n * @param opts options for fetching package file index\n */\nexport async function readPackageIndexFile(\n  packageResolution: Resolution,\n  id: string,\n  opts: ReadPackageIndexFileOptions\n): Promise<ReadPackageIndexFileResult> {\n  // If the package resolution is of type directory we need to do things\n  // differently and generate our own package index file\n  const isLocalPkg =\n    'type' in packageResolution && packageResolution.type === 'directory';\n\n  if (isLocalPkg) {\n    const localInfo = await fetchFromDir(\n      path.join(opts.lockfileDir, packageResolution.directory),\n      {}\n    );\n\n    return {\n      local: true,\n      files: localInfo.filesIndex,\n    };\n  }\n\n  const isPackageWithIntegrity = 'integrity' in packageResolution;\n\n  let pkgIndexFilePath: string | undefined;\n\n  if (isPackageWithIntegrity) {\n    const parsedId = parse(id);\n    // Retrieve all the index file of all files included in the package\n    pkgIndexFilePath = getIndexFilePathInCafs(\n      opts.storeDir,\n      packageResolution.integrity as string,\n      `${parsedId.name}@${parsedId.version}`\n    );\n  } else if (\n    !('type' in packageResolution) &&\n    typeof packageResolution.tarball === 'string'\n  ) {\n    const packageDirInStore = depPathToFilename(\n      parse(id).nonSemverVersion ?? id,\n      opts.virtualStoreDirMaxLength\n    );\n\n    pkgIndexFilePath = path.join(\n      opts.storeDir,\n      packageDirInStore,\n      'integrity.json'\n    );\n  } else {\n    throw new PnpmError(\n      'UNSUPPORTED_PACKAGE_TYPE',\n      `Unsupported package resolution type for ${id}`\n    );\n  }\n\n  try {\n    const { files } = await loadJsonFile<PackageFilesIndex>(pkgIndexFilePath);\n\n    return {\n      local: false,\n      files,\n    };\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if (err.code === 'ENOENT') {\n      throw new PnpmError(\n        'MISSING_PACKAGE_INDEX_FILE',\n        `Failed to find package index file for ${id} (at ${pkgIndexFilePath}), please consider running 'pnpm install'`\n      );\n    }\n\n    throw err;\n  }\n}\n\nexport type PackageInfo = {\n  id: string;\n  name?: string | undefined;\n  version?: string | undefined;\n  depPath: string;\n  snapshot: PackageSnapshot;\n  registries: Registries;\n};\n\nexport type GetPackageInfoOptions = {\n  storeDir: string;\n  virtualStoreDir: string;\n  virtualStoreDirMaxLength: number;\n  dir: string;\n  modulesDir: ModulesDir;\n};\n\nexport type PkgInfo = {\n  from: string;\n  description?: string | undefined;\n} & Omit<LicensePackage, 'belongsTo'>;\n\n/**\n * Returns the package manifest information for a give package name and path\n * @param pkg the package to fetch information for\n * @param opts the fetching options\n */\nexport async function getPkgInfo(\n  pkg: PackageInfo,\n  opts: GetPackageInfoOptions\n): Promise<PkgInfo> {\n  // Retrieve file index for the requested package\n  const packageResolution = pkgSnapshotToResolution(\n    pkg.depPath,\n    pkg.snapshot,\n    pkg.registries\n  );\n\n  if (typeof packageResolution === 'undefined') {\n    throw new PnpmError(\n      'MISSING_PACKAGE_RESOLUTION',\n      `Failed to find package resolution for ${pkg.id}`\n    );\n  }\n\n  const packageFileIndexInfo = await readPackageIndexFile(\n    packageResolution,\n    pkg.id,\n    {\n      storeDir: opts.storeDir,\n      lockfileDir: opts.dir,\n      virtualStoreDirMaxLength: opts.virtualStoreDirMaxLength,\n    }\n  );\n\n  // Fetch the package manifest\n  let packageManifestDir: string | undefined;\n\n  if (packageFileIndexInfo.local) {\n    packageManifestDir = packageFileIndexInfo.files['package.json'];\n  } else {\n    const packageFileIndex = packageFileIndexInfo.files as Record<\n      string,\n      PackageFileInfo\n    >;\n\n    const packageManifestFile = packageFileIndex['package.json'];\n\n    if (typeof packageManifestFile === 'undefined') {\n      throw new PnpmError(\n        'MISSING_PACKAGE_MANIFEST',\n        `Failed to find package manifest file for ${pkg.id}`\n      );\n    }\n\n    packageManifestDir = getFilePathByModeInCafs(\n      opts.storeDir,\n      packageManifestFile.integrity,\n      packageManifestFile.mode\n    );\n  }\n\n  if (typeof packageManifestDir === 'undefined') {\n    throw new PnpmError(\n      'MISSING_PACKAGE_MANIFEST_DIR',\n      `Failed to find package manifest directory for ${pkg.id}`\n    );\n  }\n\n  let manifest: PackageManifest;\n\n  try {\n    manifest = await readPkg(packageManifestDir);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (err: any) {\n    if (err.code === 'ENOENT') {\n      throw new PnpmError(\n        'MISSING_PACKAGE_MANIFEST',\n        `Failed to find package manifest file at ${packageManifestDir}`\n      );\n    }\n\n    throw err;\n  }\n\n  // Determine the path to the package as known by the user\n  const modulesDir = opts.modulesDir;\n\n  const virtualStoreDir = pathAbsolute(\n    opts.virtualStoreDir || path.join(modulesDir, '.pnpm'),\n    opts.dir\n  );\n\n  // TODO: fix issue that path is only correct when using node-linked=isolated\n  const packageModulePath = path.join(\n    virtualStoreDir,\n    depPathToFilename(pkg.depPath, opts.virtualStoreDirMaxLength),\n    modulesDir,\n    manifest.name\n  );\n\n  const licenseInfo = await parseLicense(\n    { manifest, files: packageFileIndexInfo },\n    { storeDir: opts.storeDir }\n  );\n\n  const packageInfo = {\n    from: manifest.name,\n    path: packageModulePath,\n    name: manifest.name,\n    version: manifest.version,\n    description: manifest.description,\n    license: licenseInfo.name,\n    licenseContents: licenseInfo.licenseFile,\n    author:\n      typeof manifest.author === 'undefined'\n        ? undefined\n        : typeof manifest.author === 'string'\n          ? manifest.author\n          : manifest.author.name,\n    homepage: manifest.homepage,\n    repository:\n      typeof manifest.repository === 'undefined'\n        ? undefined\n        : typeof manifest.repository === 'string'\n          ? manifest.repository\n          : manifest.repository.url,\n  };\n\n  return packageInfo;\n}\n"],
  "mappings": "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",
  "names": ["licenseFile"]
}
