import { parseBunLock, parseComposer, parsePackageJson, parsePackageLock, parsePipfileLock, parsePnpmLock, parseYarnLock, } from "./manifests-json"; import type { Dependency } from "./manifests-json"; import { parseCargoLock, parseCargoToml, parseGemfileLock, parseGoMod, parsePyproject, parseRequirementsTxt, } from "./manifests-text"; export type { Dependency } from "./manifests-json"; export type Ecosystem = "npm" | "pip" | "go" | "cargo" | "rubygems" | "composer"; type ManifestKind = { ecosystem: Ecosystem; parse: (text: string) => Dependency[] }; const MANIFESTS: Record = { "package.json": { ecosystem: "npm", parse: parsePackageJson }, "package-lock.json": { ecosystem: "npm", parse: parsePackageLock }, "npm-shrinkwrap.json": { ecosystem: "npm", parse: parsePackageLock }, "bun.lock": { ecosystem: "npm", parse: parseBunLock }, "yarn.lock": { ecosystem: "npm", parse: parseYarnLock }, "pnpm-lock.yaml": { ecosystem: "npm", parse: parsePnpmLock }, "requirements.txt": { ecosystem: "pip", parse: (text) => parseRequirementsTxt(text, "runtime") }, "requirements-dev.txt": { ecosystem: "pip", parse: (text) => parseRequirementsTxt(text, "development") }, "pyproject.toml": { ecosystem: "pip", parse: parsePyproject }, "Pipfile.lock": { ecosystem: "pip", parse: parsePipfileLock }, "go.mod": { ecosystem: "go", parse: parseGoMod }, "Cargo.toml": { ecosystem: "cargo", parse: parseCargoToml }, "Cargo.lock": { ecosystem: "cargo", parse: parseCargoLock }, "Gemfile.lock": { ecosystem: "rubygems", parse: parseGemfileLock }, "composer.json": { ecosystem: "composer", parse: (text) => parseComposer(text, false) }, "composer.lock": { ecosystem: "composer", parse: (text) => parseComposer(text, true) }, }; const IGNORED_DIRECTORIES = /(^|\/)(node_modules|vendor|\.git|dist|build|target)\//; export function manifestKind(path: string): ManifestKind | null { if (IGNORED_DIRECTORIES.test(path)) return null; return MANIFESTS[path.slice(path.lastIndexOf("/") + 1)] ?? null; }